星空网 > 软件开发 > Java

再谈包装类Integer对象的比较

public class CompareDemo {  public static void main(String[] args) {    int a = 128, b = 128;    System.out.println(a == b); // true         Integer c = 128, d = 128;    System.out.println(c == d); // false        System.out.println(c.equals(d)); // true         Integer e = -128, f = -128;    System.out.println(e == f); // true  }}

 

我们在命令行执行一下 

1. javac CompareDemo.java

2. javap -c CompareDemo

 

部分截图如下:

再谈包装类Integer对象的比较

可以看到在 在执行 Integer c = 128, d = 128; 时调用了两次 Integer.valueOf()函数

所以语句  Integer c = 128 ; 等同于 Integer c = Integer.valueOf(128);

 Integer d = 128 ; 等同于 Integer d = Integer.valueOf(128);

我们从源码中看下这个函数的实现:

public static Integer valueOf(int i) {  final int offset = 128;  if (i >= -128 && i <= 127) { // must cache     return IntegerCache.cache[i + offset];  }    return new Integer(i);  }

很明显当i >= -128 且 i <= 127 时,我们返回的是缓存中的Integer的对象。

 

内部类 IntegerCache 定义如下:

private static class IntegerCache {  private IntegerCache(){}  static final Integer cache[] = new Integer[-(-128) + 127 + 1];  static {    for(int i = 0; i < cache.length; i++)    cache[i] = new Integer(i - 128);  }  }

 

这就解释了为什么 c == d 返回的为什么是false了, c,d 这里都是对象,== 比较的是引用的地址,

c.equals(d) 才是对象中值的比较。正是因为c,d 的128超出了IntegerCache缓存的范围,所以c,d

是两个不同的对象,自然引用地址也不同。

而e , f 的-128 则在缓存的范围内,故返回的是同一个对象。引用地址相同。




原标题:再谈包装类Integer对象的比较

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

​anke建站提供简易方便高效的服务:https://www.kjdsnews.com/a/1515288.html
月出40万单利润7000元,Temu卖家要卷死同行:https://www.kjdsnews.com/a/1515289.html
又一大卖要上市!:https://www.kjdsnews.com/a/1515290.html
TikTok“西游记直播”火了?博主一个月吸粉过万:https://www.kjdsnews.com/a/1515291.html
从0到1,做好这关键5步,B2B内容营销事半功倍!:https://www.kjdsnews.com/a/1515292.html
跨境平台做测评、采退、Lu卡、lu货要怎么做安全?:https://www.kjdsnews.com/a/1515293.html
北京丰台区水上乐园哪家好玩?:https://www.vstour.cn/a/366177.html
23点聊电商:“潮起钱塘·境遇未来”2024年跨境电商全平台发展大会圆满完成 :https://www.kjdsnews.com/a/1836652.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流