第十篇:Java之Integer和int 自动装箱和拆箱

我们都知道Java是一种面向对象的语言,而八大基本数据类型不属于对象引用,而属于基本数据类型。所以Java推出了Integer等对应的包装类。

存储位置:

Integer对应的对象存储在堆上的对象中。
局部基本数据变量是直接存在虚拟机栈中的。
类非静态基本数据变量是直接存在对象实例中的。
类静态基本数据变量是直接存在class对象实例中的。

JVM中不存在基本数据类型的常量池的,我的猜测是如果要将变量存储在常量池中,还需要额外一次的访问内存。因为基本类型占据的空间比较小,所以直接存储在对象中或者虚拟机栈中,用着方便。

1、Integer的创建方式

1、Integer a = new Integer(1);
这时就是在堆中新建一个Integer对象,并且数据1直接存储在实例对象a上。
2、Integer a = Integer.valueOf(1);
这种也是生成一个Integer对象,只不过Java加入了缓存机制,默认会将取值范围[-128,127]之间的Integer对象缓存起来,当调用Integer.valueOf(xx)时,如果xx在[-128,127]之间,并且已经存在对应的对象的话,会直接返回对应的引用,如果不存在的话,才会新建对象,并将对象加入缓存中。

3、Integer a = 1;
默认调用的是Integer.valueOf(1),会将对象缓存起来。

Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(1);
System.out.println(a == b);//true
Integer a = new Integer(1);
Integer b = Integer.valueOf(1);
System.out.println(a == b);//false
//new Integer(1)不会将a对象缓存起来
Integer a = 1;
Integer b = Integer.valueOf(1);
System.out.println(a == b);//true
//Integer a = 1默认调用的Integer.valueOf(1)的,会将a对象缓存起来

2、int的创建方式

int a = 1;

局部基本数据变量是直接存在虚拟机栈中的。
类非静态基本数据变量是直接存在对象实例中的。
类静态基本数据变量是直接存在class对象实例中的。

3、Integer == int

当判断Integer 和 int是否相等的时候,是根据取值来判断的,而不是根据地址。

4、Integer == Integer

当判断Integer和Integer是否相等的时候,是根据地址来判断的,而不是根据取值。

5、自动装箱和拆箱

1、自动装箱:

Integer  a = 1;//自动装箱,就是把int装箱为Integer,调用的方法其实是Integer a = Integer.valueOf(1)
Integer b = Integer.valueOf(1);

System.out.println(a == b)//true

2、自动拆箱:

Integer a = Integer.valueOf(1);
int c = a;//自动拆箱,其实调用的是int c = a.intValue();将Integer拆箱为int
System.out.println(a==c);Integerint比较的时候,会将Integer a进行拆箱,调用intValue(),然后进行比较.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值