一、包装类
1、基本数据类型和对应的包装类
例如(byte——>>Byte)
2、拆箱和装箱
装箱:新建一个Interger类型对象,将i的值放入对像的某个属性当中
Integer ij = Integer.valueOf(i);
Integer ij = new Integer(i);
拆箱:将Integer 对象中的值取出,放到一个基本的数据类型中
int j = ii.intValue();
3、自动装箱与拆箱
int i=10;
//自动装箱
Integer ii = i;
Integer ij=(Integer)i;
//自动拆箱
int j = ii;
int k = (int)ii;
自动装箱(Autoboxing)是 Java 中的一种自动转换机制,允许将基本数据类型(如 int、double 等)自动转换为对应的包装类(如 Integer、Double 等)。这种转换由编译器在编译时自动完成,本质上是调用了包装类的 valueOf() 方法。
触发场景
当基本数据类型出现在需要包装类对象的上下文中时,会自动触发装箱:
- 赋值操作:将基本数据类型赋值给包装类变量。
- 方法参数:将基本数据类型传递给需要包装类参数的方法。
- 集合操作:向泛型集合(如
List<Integer>)中添加基本数据类型。 - 返回值:方法返回基本数据类型,但声明的返回类型是包装类。
示例代码
java
运行
// 1. 赋值操作中的装箱
Integer wrapper = 100; // 自动装箱:Integer.valueOf(100)
// 2. 方法参数中的装箱
List<Integer> list = new ArrayList<>();
list.add(200); // 自动装箱:Integer.valueOf(200)
// 3. 返回值中的装箱
public Integer getNumber() {
return 300; // 自动装箱:Integer.valueOf(300)
}
缓存机制
Java 对部分包装类(如 Integer、Byte、Short、Character)提供了缓存机制,默认缓存范围如下:
Integer:-128 到 127(可通过 JVM 参数-XX:AutoBoxCacheMax调整上限)。- 其他包装类:
Byte、Short、Character(范围为 0~127),Boolean(缓存TRUE和FALSE)。
示例:
java
运行
Integer a = 127; // 缓存范围内,使用缓存对象
Integer b = 127; // 复用缓存对象
System.out.println(a == b); // true(引用相同)
Integer c = 128; // 超出缓存范围,创建新对象
Integer d = 128; // 创建另一个新对象
System.out.println(c == d); // false(引用不同)
注意事项
-
性能开销
自动装箱会创建包装类对象,频繁装箱可能导致内存占用增加和垃圾回收压力。 -
空指针异常
包装类对象可能为null,拆箱时需注意避免NullPointerException。java
运行
Integer nullable = null; int value = nullable; // 运行时抛出 NPE -
比较陷阱
使用==比较包装类对象时,比较的是引用而非值。建议使用equals()方法比较值。java
运行
Integer x = 1000; Integer y = 1000; System.out.println(x == y); // false(引用不同) System.out.println(x.equals(y)); // true(值相同)
自动拆箱(Auto-unboxing)是 Java 中的一种自动转换机制,允许将包装类(如 Integer、Double 等)自动转换为对应的基本数据类型(如 int、double 等)。这种转换是编译器提供的语法糖,在运行时会被转换为对包装类的 xxxValue() 方法的调用(例如 intValue()、doubleValue() 等)。
触发场景
当包装类对象出现在需要基本数据类型的上下文中时,会自动触发拆箱:
- 赋值操作:将包装类对象赋值给基本数据类型变量。
- 算术运算:包装类对象参与数学运算(如
+、-、*等)。 - 比较操作:包装类对象与基本数据类型进行比较(如
==、>、<等)。 - 方法参数:将包装类对象传递给需要基本数据类型参数的方法。
示例代码
java
运行
Integer wrapper = 100; // 自动装箱:Integer.valueOf(100)
// 1. 赋值操作中的拆箱
int primitive = wrapper; // 自动拆箱:wrapper.intValue()
// 2. 算术运算中的拆箱
int sum = wrapper + 200; // 等价于 wrapper.intValue() + 200
// 3. 比较操作中的拆箱
boolean isEqual = wrapper == 100; // 等价于 wrapper.intValue() == 100
// 4. 方法参数中的拆箱
printNumber(wrapper); // 自动拆箱后传递给方法
// 方法接收基本数据类型参数
public static void printNumber(int num) {
System.out.println(num);
}
注意事项
-
空指针异常(NullPointerException)
如果包装类对象为null,自动拆箱时会抛出异常。java
运行
Integer nullable = null; int value = nullable; // 运行时抛出 NullPointerException -
缓存机制的影响
自动装箱时可能会复用缓存对象(如Integer缓存-128~127),但拆箱后比较的是值本身。java
运行
Integer a = 127; Integer b = 127; System.out.println(a == b); // true(缓存对象引用相同) System.out.println(a > 126); // true(拆箱后比较值) -
性能考虑
频繁的装箱和拆箱会产生额外的对象创建和方法调用,可能影响性能,尤其在循环中需注意。
总结
自动拆箱简化了代码书写,避免了显式调用 xxxValue() 方法,但需注意空指针风险和缓存机制的影响。合理使用包装类与基本数据类型,可以提高代码的安全性和性能。
自动装箱
自动装箱(Autoboxing)是 Java 中的一种自动转换机制,允许将基本数据类型(如 int、double 等)自动转换为对应的包装类(如 Integer、Double 等)。这种转换由编译器在编译时自动完成,本质上是调用了包装类的 valueOf() 方法。
触发场景
当基本数据类型出现在需要包装类对象的上下文中时,会自动触发装箱:
- 赋值操作:将基本数据类型赋值给包装类变量。
- 方法参数:将基本数据类型传递给需要包装类参数的方法。
- 集合操作:向泛型集合(如
List<Integer>)中添加基本数据类型。 - 返回值:方法返回基本数据类型,但声明的返回类型是包装类。
示例代码
java
运行
// 1. 赋值操作中的装箱
Integer wrapper = 100; // 自动装箱:Integer.valueOf(100)
// 2. 方法参数中的装箱
List<Integer> list = new ArrayList<>();
list.add(200); // 自动装箱:Integer.valueOf(200)
// 3. 返回值中的装箱
public Integer getNumber() {
return 300; // 自动装箱:Integer.valueOf(300)
}
缓存机制
Java 对部分包装类(如 Integer、Byte、Short、Character)提供了缓存机制,默认缓存范围如下:
Integer:-128 到 127(可通过 JVM 参数-XX:AutoBoxCacheMax调整上限)。- 其他包装类:
Byte、Short、Character(范围为 0~127),Boolean(缓存TRUE和FALSE)。
示例:
java
运行
Integer a = 127; // 缓存范围内,使用缓存对象
Integer b = 127; // 复用缓存对象
System.out.println(a == b); // true(引用相同)
Integer c = 128; // 超出缓存范围,创建新对象
Integer d = 128; // 创建另一个新对象
System.out.println(c == d); // false(引用不同)
注意事项
-
性能开销
自动装箱会创建包装类对象,频繁装箱可能导致内存占用增加和垃圾回收压力。 -
空指针异常
包装类对象可能为null,拆箱时需注意避免NullPointerException。java
运行
Integer nullable = null; int value = nullable; // 运行时抛出 NPE -
比较陷阱
使用==比较包装类对象时,比较的是引用而非值。建议使用equals()方法比较值。java
运行
Integer x = 1000; Integer y = 1000; System.out.println(x == y); // false(引用不同) System.out.println(x.equals(y)); // true(值相同)
***自动拆箱(Auto-unboxing)是 Java 中的一种自动转换机制,允许将包装类(如 Integer、Double 等)自动转换为对应的基本数据类型(如 int、double 等)。这种转换是编译器提供的语法糖,在运行时会被转换为对包装类的 xxxValue() 方法的调用(例如 intValue()、doubleValue() 等)。
触发场景
当包装类对象出现在需要基本数据类型的上下文中时,会自动触发拆箱:
- 赋值操作:将包装类对象赋值给基本数据类型变量。
- 算术运算:包装类对象参与数学运算(如
+、-、*等)。 - 比较操作:包装类对象与基本数据类型进行比较(如
==、>、<等)。 - 方法参数:将包装类对象传递给需要基本数据类型参数的方法。
示例代码
java
运行
Integer wrapper = 100; // 自动装箱:Integer.valueOf(100)
// 1. 赋值操作中的拆箱
int primitive = wrapper; // 自动拆箱:wrapper.intValue()
// 2. 算术运算中的拆箱
int sum = wrapper + 200; // 等价于 wrapper.intValue() + 200
// 3. 比较操作中的拆箱
boolean isEqual = wrapper == 100; // 等价于 wrapper.intValue() == 100
// 4. 方法参数中的拆箱
printNumber(wrapper); // 自动拆箱后传递给方法
// 方法接收基本数据类型参数
public static void printNumber(int num) {
System.out.println(num);
}
注意事项
-
空指针异常(NullPointerException)
如果包装类对象为null,自动拆箱时会抛出异常。java
运行
Integer nullable = null; int value = nullable; // 运行时抛出 NullPointerException -
缓存机制的影响
自动装箱时可能会复用缓存对象(如Integer缓存-128~127),但拆箱后比较的是值本身。java
运行
Integer a = 127; Integer b = 127; System.out.println(a == b); // true(缓存对象引用相同) System.out.println(a > 126); // true(拆箱后比较值) -
性能考虑
频繁的装箱和拆箱会产生额外的对象创建和方法调用,可能影响性能,尤其在循环中需注意。
8786

被折叠的 条评论
为什么被折叠?



