Java基本类型的自动装箱与自动拆箱
文章目录
一、简介
java是面入对象编程的语言,所有的都表示为对象。那么对于基本类型,java提供了对应的包装类。相应的就有自动装箱与自动拆箱操作。
二、自动装箱
2.1 定义
自动装箱是指基本类型转为对应的包装类,如int转Integer,double转为Double等。
2.2 转换方法
转换的方式是通过Integer.valueOf()、Double.valueOf()等方式(注意此时涉及到对应包装类的静态缓存问题)。
2.3 转换时机
当对包装类型的变量进行赋值或传值时,会进行自动装箱操作。特别注意,当对包装类变量进行多次运算(如循环)且值不在静态缓存内(-128到127内)时,这时会多次new相应的对象,会制造很多无用的对象实例。
2.4 在方法中传递包装类对象
此时传递的虽是对象引用,但由于经过运算修改后,方法内的变量(或者说是线程内的变量)是新建(new)的包装类,因此,方法外面的包装类变量,并不会随着方法内变量值的改变而改变。
三、自动拆箱
3.1 定义
自动拆箱是指将包装类转为基本类型,如Integer转为int、Double转为double等
3.2 转换方法
转换的方式是通过Integer.intValue()、Double.doubleValue();
3.3 转换时机
当进行算术运算或给基本类型赋值时,会进行拆箱操作。
四、代码实例
public class BaseTypeBoxingMain {
public static void main(String[] args) {
autoBoxing1(); //自动装箱例1 基本装箱操作
autoBoxing2(); //自动装箱例2 会新建多个无用的对象
unBoxing(); //自动拆箱示例
System.out.println("====================包装类对象方法间传递====================");
Integer i= 1;
System.out.println("source i:"+i);
changeValue(i); //方法调用,试图修改值,结果是不成功的
System.out.println("after invoke changeValue , i:"+i);
}
//自动装箱例1
static void autoBoxing1() {
System.out.println("======================自动装箱例1===========================");
Integer i1 = 1; //Integer.valueOf() 缓存取
Integer i2 = 1; //Integer.valueOf() 缓存取
System.out.println(i1 == i2);
Integer i5 = 222; //Integer.valueOf() new
Integer i6 = 222; //Integer.valueOf() new
System.out.println(i5 == i6);
Double d1 = 1d; //Double.valueOf() new
Double d2 = 1d; //Double.valueOf() new
System.out.println(d1 == d2);
Double d3 = 222d; //Double.valueOf() new
Double d4 = 222d; //Double.valueOf() new
System.out.println(d3 == d4);
}
//自动装箱例2
static void autoBoxing2() {
System.out.println("======================自动装箱例2===========================");
Integer cnt = 1;
for (int i = 200; i < 203; i++) { //此时会创建3个新的Integer实例
cnt += 1;
System.out.println(System.identityHashCode(cnt)); //hashcode不一样,也就是存储地址不一样,也就说不是同一个对象
}
}
//自动拆箱
static void unBoxing() {
System.out.println("======================自动拆箱示例===========================");
Integer i1 = 1;
int i2 = i1; //基本类型赋值 i2=i1.intValue()
System.out.println(i2);
int i3 = i1 + 1; // 基本类型进行运算 i3=i1.intValue()+1
System.out.println(i3);
}
static void changeValue(Integer val) {
val = 2;
System.out.println("in changeValue ,i:"+val);
}
}
运行结果:
======================自动装箱例1===========================
true
false
false
false
======================自动装箱例2===========================
1625635731
1580066828
491044090
======================自动拆箱示例===========================
1
2
====================包装类对象方法间传递====================
source i:1
in changeValue ,i:2
after invoke changeValue , i:1