| 基本数据类型 | 包装类 |
| 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
{ - }
- class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
- // 这里可以使用类型参数
- }
- class ClassName
extends ParentClass { - // 可以只使用部分类型参数
- }
- 泛型类<类型实参> 变量名; // 定义一个泛型类引用
- 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
extends Number> { - ...
- }
- 只接受 Number 的子类型作为 E 的类型实参
-
- MyArray
l1; // 正常,因为 Integer 是 Number 的子类型 - MyArray
l2; // 编译错误,因为 String 不是 Number 的子类型
方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
- public class Util {
- //静态的泛型方法 需要在static后用<>声明泛型类型参数
- public static
void swap(E[] array, int i, int j) { - E t = array[i];
- array[i] = array[j];
- array[j] = t;
- }
- }