Java Integer(-128~127)值的==和equals比较产生的思考

最近在项目中遇到一个问题,两个值相同的Integer型值进行==比较时,发现Integer其中的一些奥秘,顺便也复习一下==和equals的区别,先通过Damo代码解释如下:

System.out.println("<-128~127以内的Integer值,Integer x = value;的方式赋值!>");
Integer i = 127;
Integer j = 127;
System.out.println("i=" + i + ",j =" + j);
System.out.println("i == j:" + (i == j) + "<--比较-->i.equals(j):"+ i.equals(j));
System.out.println("<-128~127以外的Integer值,Integer x = value;的方式赋值!>");
Integer m = 128;
Integer n = 128;
System.out.println("m=" + m + ",n =" + n);
System.out.println("m == n:" + (m == n) + "<--比较-->m.equals(n):"+ m.equals(n));
System.out.println();
		
System.out.println("<任意Integer值,Integer x = new Integer(value);的方式赋值!>");
Integer x = new Integer(299);
Integer y = new Integer(299);
System.out.println("x=" + x + ",y =" + y);
System.out.println("x == y:" + (x == y) + "<--比较-->x.equals(y):"+ x.equals(y));


输出结果为:

<-128~127以内的Integer值,Integer x = value;的方式赋值!>
i=127,j =127
i == j:true<--比较-->i.equals(j):true
<-128~127以外的Integer值,Integer x = value;的方式赋值!>
m=128,n =128
m == n:false<--比较-->m.equals(n):true


<任意Integer值,Integer x = new Integer(value);的方式赋值!>
x=299,y =299
x == y:false<--比较-->x.equals(y):true


通过以上代码及输出结果,想必大家已经看出其中奥秘!先总结如下:
1、以上代码第一段和第二段旨在说明:在-128~127的Integer值并且以Integer x = value;的方式赋值的Integer值在进行==和equals比较时,都会返回true,因为Java里面对处在在-128~127之间的Integer值,用的是原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行==比较时只是进行int原生数据类型的数值比较,而超出-128~127的范围,进行==比较时是进行地址及数值比较。


2、第三段旨在说明:==和equals的区别,==是进行地址及值比较,无法对==操作符进行重载,而对于equals方法,Integer里面的equals方法重写了Object的equals方法,查看Integer源码可以看出equals方法进行的是数值比较。

续详解:

 首先看一段代码(使用JDK 5),如下:

[html]  view plain copy
  1. public class Hello   
  2. {   
  3.   public static void main(String[] args)   
  4.   {   
  5.     int a = 1000b = 1000;   
  6.     System.out.println(a == b);   
  7.   
  8.     Integer c = 1000d = 1000;   
  9.     System.out.println(c == d);   
  10.   
  11.     Integer e = 100f = 100;   
  12.     System.out.println(e == f);   
  13.   }   
  14. }   

输出结果:

[html]  view plain copy
  1. true  
  2. false  
  3. true  

The Java Language Specification, 3rd Edition 写道:

[html]  view plain copy
  1. 为了节省内存,对于下列包装对象的两个实例,当它们的基本值相同时,他们总是==:  
  2.  Boolean  
  3.  Byte  
  4.  Character, \u0000 - \u007f(7f是十进制的127)  
  5.  Integer, -128 — 127  

查看jdk源码,如下:

[java]  view plain
  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值