1.匿名内部类的使用格式和场景是怎样的?
使用格式
new 类或接口(参数值…) {
类体(一般是方法重写);
};
使用场景
匿名内部类可以更方便的创建出一个子类对象,通常作为一个参数传输给方法。
2.泛型的作用是什么?如何定义一个泛型类?
泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。
3.说一说你对泛型上限、下限、擦除的理解
泛型上限(Upper Bounds)
泛型上限指的是泛型参数可以接收的类型范围的上限。使用extends
关键字来指定上限,意味着泛型参数可以是指定类或者该类的子类。
泛型下限(Lower Bounds)
泛型下限是泛型参数可以接收的类型范围的下限。从Java 7开始,可以使用super
关键字来指定下限,意味着泛型参数可以是指定类或者该类的超类。
泛型擦除(Type Erasure)
泛型擦除是Java泛型实现的一个限制,它指的是在编译时,所有的泛型类型信息都会被擦除,运行时将不再保留泛型的类型信息。其原因是:为了向后兼容,Java的泛型是通过在编译时插入类型检查和类型转换来实现的,而在运行时,所有的泛型都被替换为它们的边界(如果没有指定边界,则默认为Object
)。
4.Object中的toString和equals方法作用是什么?我们经常怎么用?
toString:一般是指返回一个代表对象的 String,
默认情况下,它返回对象的类名和哈希码的无符号十六进制表示的字符串,格式为 "ClassName@hashCode"
。
equals:用于比较两个对象是否相等。默认实现比较的是对象的内存地址,即它检查两个对象引用是否指向同一个实例。
一般情况下我们需要对这两个方法进行重写:
//重写toString
@Override
public String toString() {
return "Person{name='" + name + '\'' + ", age=" + age + '}';
}
//重写equals
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && name.equals(person.name);
}
5.为什么要有包装类?什么是自动装箱和拆箱?
包装类(Wrapper Classes)在Java中为基本数据类型提供了对应的类类型。它们的存在主要是为了解决基本类型与对象之间的一些不兼容问题,以及提供一些面向对象的特性。
自动装箱(Autoboxing)
将基本类型转换为对应的包装类对象的过程。例如,当你将一个 int
类型的值赋给一个 Integer
类型变量时,Java会自动创建一个 Integer
对象。
拆箱(Unboxing)
将包装类对象转换为对应的基本类型的过程。例如,当你将一个 Integer
对象赋给一个 int
类型变量时,Java会自动调用 intValue()
方法来获取基本类型值。
6.写出下面代码的执行原理
1、自动装箱
这里,100
是一个 int
类型的基本类型。当它被赋值给 Integer
类型的变量 x
时,会发生自动装箱。Java编译器会自动将 int
类型的值转换为 Integer
对象。
2、算数赋值
这行代码使用了 +=
运算符,它等价于 x = x + 200;
。此时,x
是一个 Integer
对象,而 200
是一个 int
类型的值。在这里会发生拆箱,x
的 int
值被取出与 200
相加,然后结果需要重新装箱为 Integer
对象。
3、打印结果
7.String、StringBuilder、StringBuffer、StringJoiner的区别是什么?
String
String
是Java中不可变的对象,表示字符串常量。一旦创建,它的值就不能被改变。字符串连接操作(如使用 +
操作符)实际上会创建新的 String
对象,因此对于大量字符串操作,这可能会导致性能问题。适用于不需要修改的文本。
StringBuilder
StringBuilder
是可变的字符串对象,可以进行字符串拼接、插入、删除等操作。内部使用可调整大小的字符数组来存储字符串。非线程安全,即不保证线程安全,因此在单线程环境下性能更优。适用于需要频繁修改的字符串操作。
StringBuffer
StringBuffer
与 StringBuilder
类似,也是可变的字符串对象,可以进行各种字符串操作。主要区别在于它是线程安全的,即多个线程可以同时访问 StringBuffer
对象,而不会影响程序的运行。由于线程安全的特性,其性能比 StringBuilder
稍低。适用于多线程环境下的字符串操作。
StringJoiner
StringJoiner
是Java 8引入的一个用于构造字符串序列的类。它允许你指定分隔符、前缀和后缀,从而方便地连接字符串。不像 StringBuilder
和 StringBuffer
,StringJoiner
更专注于连接操作,并且提供了链式调用的方法。通常用于将集合或数组中的元素转换成一个由分隔符分隔的字符串。