java 中自动装箱 128 陷阱

31 篇文章 0 订阅
7 篇文章 0 订阅

在 java 的自动装箱中,存在一个 128 陷阱, 先看一段 代码 :

public static void main(String[] args) {
		
		Integer a = 127 ;
		Integer b = 127 ;
		Integer c = 128 ;
		Integer d = 128 ;
		Integer cc = 1000 ;
		Integer dd = 1000 ;
		
		System.out.println(( a == b  ));
		System.out.println(( c == d  ));
		System.out.println(( cc == dd  ));
		System.out.println("----------------");
		System.out.println( (a.equals( b ))  );
		System.out.println( (c.equals( d ))  );
		System.out.println( (cc.equals( dd ))  );
	}

执行结果是 : 

首先知道 Integer 是包装类 , a , b 等是包装类的对象 , " == " 号比较的是对象的地址是否一致 , 一致时返回 true ,否则返回 false . 

equals () 方法是 Integer 重写的方法, 当数值一致时 返回 true , 否则返回 false .  

导致 127 和 128 分界出结果不相等原因在于 自动装箱时存在一定规范 : 

对于 自动装箱规范要求 : boolean , byte , char <= 127 , 介于 -128 ~ 127 之间的 short 和 int 被包装到固定的对象中 . 

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

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

这就是所谓的 "128陷阱" .

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值