Integer底层设计

100 == 100为true,1000 == 1000却为false?

之前也写过String的==与equals的注意点,这次写下Integer的底层设计,不妨先运行下下面代码:

Integer a = 1000, b = 1000;
System.out.println(a == b);//1
Integer c = 100, d = 100;
System.out.println(c == d);//2

基本知识:我们知道,如果两个引用指向同一个对象,用 == 表示它们是相等的。如果两个引用指向不同的对象,用 == 表示它们是不相等的,即使它们的内容相同。

这里就涉及到Integer底层的IntegerCache.java,它缓存了从 - 128 到 127 之间的所有的整数对象。

具体实现就是:当所有的小整数在内部缓存,然后当我们声明类似——

Integer c = 100;

实际做的是

Integer i = Integer.valueOf(100);

而内部valueof实现

public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i
return IntegerCache.cache\[i + (-IntegerCache.low)\];
return new Integer(i);
}

如果值的范围在 - 128 到 127 之间,它就从高速缓存返回实例,C与D的引用其实都是指向同一对象,所以相同,而不再这个值得a,b就不从高速缓存放回实例,所以不指向同一对象。

综上所述:java中,像String,Integer这些不要用==进行比较,因为比较的是引用(基本数据类型除外),应该使用equals,这也符合sonarlint规范。

下面给出高速缓存的魅力吧!

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

    Class cache = Integer.class.getDeclaredClasses()[0]; //1
Field myCache = cache.getDeclaredField("cache"); //2
myCache.setAccessible(true);//3 Integer[] newCache = (Integer[]) myCache.get(cache); //4
newCache[132] = newCache[133]; //5 int a = 2;
int b = a + a;
System.out.printf("%d + %d = %d", a, a, b); // 2 + 2= 5;
}

最新文章

  1. GOLANG 赋值
  2. flash flex 程序出现错误 Error #2032
  3. js 函数声明方式以及javascript的历史
  4. html input type="button" 页面跳转
  5. 关于HTTP返回码301、302区别与SEO
  6. MySQL源码 解析器
  7. CSS 相关知识总结
  8. JavaScript创建读取cookie代码示例【附:跨域cookie解决办法】
  9. yii2 windows 安装
  10. python——爬虫&问题解决&思考(三)
  11. VisualSVN Server启动错误(0x8007042a)
  12. Ionic3关闭弹出页面,跳转到列表后刷新父页面
  13. ios日期显示NaN
  14. python开发遇到的坑(1)xpath解析ValueError: Unicode strings with encoding declaration are not supported
  15. 图文解说Win7系统机器上发布C#+ASP.NET网站
  16. jTimer
  17. zookeeper集群环境搭建(使用kafka的zookeeper搭建zk集群)
  18. [LeedCode]279. 完全平方数
  19. jmeter安装教程与新手入门(附jdk安装教程)
  20. crm lookup

热门文章

  1. 题解 Luogu P1514 【引水入城】
  2. MyBatis-Plus使用(3)-条件构造器
  3. 符合AUTOSAR(AP&CP)的嵌入式系统和软件设计工具
  4. MinIO很强-让我放弃FastDFS拥抱MinIO的8个理由
  5. .Net 异常最佳做法
  6. [机器学习] keras:MNIST手写数字体识别(DeepLearning 的 HelloWord程序)
  7. CSS动画实例:图文切换
  8. 动态路由 - EIGRP
  9. 9个常用ES6特性归纳(一般用这些就够了)
  10. 使用Prometheus监控Golang服务-基于YoyoGo框架