基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
装箱(Boxing)和拆箱(Unboxing)是Java中用于基本数据类型和对应包装类之间转换的过程。
装箱是将基本数据类型转换为对应的包装类对象。例如,将int类型的值转换为Integer对象。装箱可以通过自动装箱(Autoboxing)或手动装箱(Manual Boxing)来完成。
自动装箱是指在需要使用包装类对象的地方,直接使用基本数据类型,编译器会自动将其转换为对应的包装类对象。例如:
int num = 10;
Integer obj = num; // 自动装箱
手动装箱是通过调用包装类的构造方法,将基本数据类型转换为对应的包装类对象。例如:
int num = 10;
Integer obj = new Integer(num); // 手动装箱
拆箱是将包装类对象转换为对应的基本数据类型。例如,将Integer对象转换为int类型的值。拆箱可以通过自动拆箱(Autounboxing)或手动拆箱(Manual Unboxing)来完成。
自动拆箱是指在需要使用基本数据类型的地方,直接使用包装类对象,编译器会自动将其转换为对应的基本数据类型的值。例如:
Integer obj = 10;
int num = obj; // 自动拆箱
手动拆箱是通过调用包装类的方法,将包装类对象转换为对应的基本数据类型的值。例如:
Integer obj = new Integer(10);
int num = obj.intValue(); // 手动拆箱
装箱和拆箱提供了基本数据类型和包装类之间的相互转换,使得在需要使用对象的场景中也可以使用基本数据类型,并且可以方便地进行类型转换。
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b); //true
System.out.println(c == d); //false
}
在Java中,对于Integer类型的对象,当其值在-128到127之间时,会使用对象池(Integer Cache)来缓存这些值,以提高性能和节省内存。这意味着当我们创建一个值在-128到127之间的Integer对象时,如果对象池中已经存在相同值的对象,那么将直接返回这个对象的引用,而不是创建一个新的对象。
所以,在你的代码中,a和b的值都是127,它们在对象池中已经存在了一个相同值的对象,所以a和b实际上指向的是同一个对象,因此a == b返回true。
而对于c和d的值,它们都是128,超过了对象池的范围,所以每次创建一个新的对象来存储这个值。因此,c和d实际上是两个不同的对象,即使它们的值相同,所以c == d返回false。
class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> {
}
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 可以只使用部分类型参数
}
泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
T[] ts = new T[5] //错误写法
//在Java中,泛型类型参数在编译期间会被擦除为它们的上界(或者Object类型,如果没有指定上界)。
//因此,T[] ts = new T[5]是不合法的,因为编译器无法确定T的具体类型。//正确写法
Object[] ts = new Object[5];
T[] result = (T[]) ts;
class 泛型类名称<类型形参 extends 类型边界> {
...
}
public class MyArray<E extends Number> {
...
}
只接受 Number 的子类型作为 E 的类型实参MyArray<Integer> l1; // 正常,因为 Integer 是 Number 的子类型
MyArray<String> l2; // 编译错误,因为 String 不是 Number 的子类型
方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
public class Util {//静态的泛型方法 需要在static后用<>声明泛型类型参数public static <E> void swap(E[] array, int i, int j) {E t = array[i];array[i] = array[j];array[j] = t;}
}