128陷阱解析(Java中的128陷阱)

原始类型:boolean,char,byte,short,int,long,float,double;

包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double;

上面是比较常见的数据类型;下面说一下int 和Integer的区别吧

Ingeter是int的包装类,Integer变量必须实例化后才能使用,实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,常自动装箱拆箱;

简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型

而int则是直接存储数据值 ,int的初值为0,Ingeter的初值为null

Integer s =10;
//自动装箱
Integer a1= Integer.valueOf(10)//存在于堆里的对象
s=11;//相当于将s的值指到了11的地址.
//自动装箱

自动装箱

integer a=10;
int b=a.intValue;//拆箱

Integer c=a+4;//自动装箱和自动拆箱
system.out.println(c);

由上述的代码的到的不同结果,得到了 自动装箱规范要求 : boolean , byte , char <= 127 , 介于 -128 ~ 127 之间的 short 和 int 被包装到固定的对象中 .

所以当 Integer a = 127 , Integer b = 127 时 , a 和 b 被包装到同一个对象中 , 所以 用 == 号判断时, 认为是相等的. 而当等于

128 时,则是分装在两个对象中的 , 自然地址也不会相等 , 所以 == 号 判断结果为 false . 超过128 结果也是一样的 .

所以在比较两个包装类的对象时, 尽量使用 equals 方法 ,这样可以得到你想要的结果 , 使用 == 号容易导致 128陷阱 .

简单来讲就是:在小于127大于-128的时候,自动装箱的是同一个地址存在的数值.大于127时,自动装箱的不是同一个。
这就是所谓的 “128陷阱” .

注:
包装器的存在使得构造的值不能改变.
equals:判断的是两个对象的内容
==判断的是地址是否相同

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值