1. java中数据类型有哪些?分为哪两大类?(考点:java数据类型及其分类)
两种数据类型:基本数据类型、引用数据类型
- 基本数据类型:
- 整数类型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)
- 浮点数类型:float(4字节)、double(8字节)
- 布尔类型:boolean(1字节)
- 字符类型:char(2字节)
- 引用数据类型
- 字符串类型:String
- 数组:array
- 集合:collection
- 类:class
- 基本数据类型的包装类:Byte、Short、Integer、Long、Float、Double、Boolean、Character
补充 类型转换:
- 小范围转大范围是隐式转换,大范围转小范围是显式转换。
- 布尔类型别能用0表示false,1表示true。
- 小范围的数据和大范围的数据一起参与运算,结果是转为大范围的数据类型。
- byte、short、char进行运算之后会自动转为int类型。
- 布尔类型不参与类型转换。
2. java中final关键字可以修饰什么?被final修饰后有什么特点
可以修饰类、方法、变量
- 修饰的类不能被继承
- 修饰的方法不能被重写
- 修饰的变量不能被修改
3. 解释一下java中自动装箱和拆箱。(考点:自动装箱和拆箱机制)
- 自动拆箱:将引用数据类型转为基本数据类型。
- 自动装箱:将基本数据类型转为引用数据类型。
补充 java底层源代码中,默认是缓存了-128~127这些数据。
public class Test {
public static void main(String[] args) {
int i = 10;
Integer i1 = 10;
Integer i2 = new Integer(10);
System.out.println(i == i1); // true
System.out.println(i1 == i2); // false
System.out.println(i1.equals(i2)); // true
}
}
4. java中==和equals()方法有什么区别?(考点:==与equals()的区别)
== :比较的是两个对象的地址是否相同。
euqals():默认比较的也是两个对象的地址,但是通常都会重写equals()方法,从而实现比较两个值是否相同。
5. java中访问修饰符有哪些?各自的访问范围是什么?(考点:Java访问修饰符)
访问修饰符有public、default、protect、private,通常用的最多的就是public 和private。
- public:在任何位置都可以访问。
- default:同一包中可以访问。
- protect:不同包的子类可以访问。
- private:只有当前类可以访问。
6. java中的静态变量(static)和非静态变量有什么区别?(考点:静态变量和非静态变量的区别)
- 静态变量是类加载的时候创建的,保存在静态变量区;非静态变量是随着实例的创建而创建,随着实例的回收而消失。
- 静态变量是全局共享的,所有的实例对象以及静态方法都能使用;非静态变量只能在当前实例对象中使用。
- 静态变量可以使用
类名.变量访问;非静态变量则只能通过实例对象调用访问。
7. java中方法重载(overloading)和方法覆盖(overridding)有什么区别?
- 重载是发生在同一类中,除了方法名一致,其他都可以不相同;重写是发生在父子类中,除了代码块不同,其他的都应该保持一致。
- 重载是编译时多态,重写是运行时多态。
8. java的异常处理机制是怎么样的。
采用try...catch...finally的形式来捕获可能出现的异常。
对于可能出现的异常,采用thrwos抛出异常。
也可以使用throw显式抛出异常。
9. 解释一下java中泛型(Generics)及其作用。
- 泛型:通常我们在编写类、方法、接口时,不知道需要操作什么类型的数字,而是在实例化的时候指定数据类型,对于这种情况,就需要使用到泛型。
- 泛型类:
class 类名<T>{} - 泛型方法:
T void 方法名(T 参数){} - 泛型接口:
interface 接口名<T>{}
- 泛型类:
- 泛型的作用:提高代码的安全性和复用性。
通配符:? extends T表示类型是T的子类,? super T表示类型是T的父类。
10. java中的String类为什么是不可变的?
- 线程安全,提高安全性。
- 采用常量池存储,提高效率,避免重复创建相同的数据。\
怎么保证不可变的\
- 类使用final修饰的。
- 类中都没有提供可以修改的方法。
- 每次修改都是创建新的字符串。
11. String、StringBuffer、StringBuilder有什么区别?
- String:不可变,线程安全,不适用于频繁操作的场景。
- StringBuffer:可变,线程安全,适用于频繁操作字符串的场景。
- StringBuilder:可变,线程不安全,适用于单线程环境。
12. java中Lambda表达式是什么?他带来了哪些便利?
- 基本结构:
(参数列表)->{方法体} - 特点:简化代码的编写,提高代码的简洁性,通常应用于流式操作。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().filter(name -> name.startsWith("A")) // 用Lambda表达式过滤
.forEach(System.out::println); // 输出符合条件的元素
13. java中的Optional类是什么?为什么需要它?
-
Optional类的定义:- 包装类:将可能为null的值封装为Optional对象。
- 明确空值意图:通过方法名显式表达"值可能不存在的逻辑"。
-
Optional类的作用:- 避免
NullPointerException:强制开发者去处理空值,减少运行时错误。 - 代码更简洁:链式调用替代多层
if(obj != null)判空 - API设计更清晰:方法签名中明确表示返回值可能为空。
- 避免
14. 谈谈JDK8新特性
- 使用Lambda表达式。
- 采用stream流式编程。
- 提供Optional类,来处理空指针异常错误。
- 新的时间API:LocalDate。
- 允许接口中使用default默认方法。
- 使用了函数式接口和
@FunctionalInterface - 方法引用