包装整数的时候,到底把整数放在哪了?

为了提高程序的执行效率,java把[-128,127]之间的所有数字提前包装好,放到方法区的整数型常量池中了,所以只要是使用这个区间内的数字,直接去常量池中取。也就是说在[-128,127]区间内,可以不用新建Integer对象,直接去方法区的整数型常量池中取,如果不在这个区间内,需要在堆内存中新建Integer对象

Integer i1 = 127;

Integer i2 = 127;

Integer i3 = 128;

Integer i4 = 128;

System.out.println(i1 == i2);//true,因为这两个引用都指向方法区常量池中的同一个内存空间

System.out.println(i3 == i4);//false,128超出了方法区整数型常量池所存储的数字范围,所以i3和i4都会创建新的Integer对象,将128进行包装

Integer i5 = new Integer(127);

Integer i6 = new Integer(127);

System.out.println(i5 == i6);//false,这里虽然没有超过方法区整数型常量池所存储的数字范围,但是这里确实是新建了两个Integer对象

Integer i7 = 127;

Integer i8 = new Integer(127);

System.out.println(i7 == i8);//false,这里虽然没有超过方法区整数型常量池所存储的数字范围,但是i8确实是新建了一个Integer对象存储在堆内存中,i7直接方法区整数型常量池中找的Integer对象

Integer i9 = 128;

Integer i10 = new Integer(128);

System.out.println(i9 == i10);//false,i10新建了一个Integer对象存储在堆内存中,i9超过了方法区整数型常量池所存储的数字范围,也需要重新新建一个Integer对象存储在堆内存中

int i11 = 128;

Integer i12 = new Integer(i11);

Integer i13 = new Integer(128);

System.out.println(i11 == i12);//true,比较的时候,如果有一个是基本数据类型,就会先把包装类自动拆箱成基本数据类型再进行比较

System.out.println(i11 == i13);//true,同理

System.out.println(i12 == i13);//false,都是引用数据类型,不用拆箱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值