Java-学习日记(100 == 100为true,1000 == 1000却为false?)
2024-09-02 16:10:17
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;
}
最新文章
- GOLANG 赋值
- flash flex 程序出现错误 Error #2032
- js 函数声明方式以及javascript的历史
- html input type=";button"; 页面跳转
- 关于HTTP返回码301、302区别与SEO
- MySQL源码 解析器
- CSS 相关知识总结
- JavaScript创建读取cookie代码示例【附:跨域cookie解决办法】
- yii2 windows 安装
- python——爬虫&;问题解决&;思考(三)
- VisualSVN Server启动错误(0x8007042a)
- Ionic3关闭弹出页面,跳转到列表后刷新父页面
- ios日期显示NaN
- python开发遇到的坑(1)xpath解析ValueError: Unicode strings with encoding declaration are not supported
- 图文解说Win7系统机器上发布C#+ASP.NET网站
- jTimer
- zookeeper集群环境搭建(使用kafka的zookeeper搭建zk集群)
- [LeedCode]279. 完全平方数
- jmeter安装教程与新手入门(附jdk安装教程)
- crm lookup
热门文章
- 题解 Luogu P1514 【引水入城】
- MyBatis-Plus使用(3)-条件构造器
- 符合AUTOSAR(AP&;CP)的嵌入式系统和软件设计工具
- MinIO很强-让我放弃FastDFS拥抱MinIO的8个理由
- .Net 异常最佳做法
- [机器学习] keras:MNIST手写数字体识别(DeepLearning 的 HelloWord程序)
- CSS动画实例:图文切换
- 动态路由 - EIGRP
- 9个常用ES6特性归纳(一般用这些就够了)
- 使用Prometheus监控Golang服务-基于YoyoGo框架