为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回fa
来源:互联网 发布:手机淘宝体检中心截图 编辑:程序博客网 时间:2024/05/18 20:34
为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回false
Integer i =100实际在内部做了
Integer i = Integer.valueOf(100)的操作。
来看Integer.class源码
这个方法的首先断言了IntegerCache.high的值大于等于127(关于这里assert 大于等于127解释请看补充),否则退出方法。
接着if条件内i需要在low值和high值之间。
可以看到low为-128,即if条件需要i在-128和127之间,那么返回i+128作为整型数组 cache的下标,用来放在缓存中。这样也就是说任意一个Integer的数,如果在-128和127之间,那么它们之间的内存地址是相同的。
这也就解释了为什么Integer a=100,b=100时候a==b返回true。
而如果if条件不满足则返回new Integer(i)。
此时不放入缓存,也就是说不在-128和127范围内的数它们的内存地址是不相同的,这也就解释了为什么Integer c=1000,d=1000时候c==d返回false。
补充:
补充说明assert断言IntegerCache.high的值大于等于127才执行该方法。
看源码
可以看到high本身没有值,是h=127赋给它的,而h的值在这之前可能会改变。也就是说缓存上限的127其实是可以改变,可以从VM这个java.lang.Integer.IntegerCache.high中读取为上限,但是需要满足这个上限的值确实在-128和127之间。也就是说缓存的容量其实是可以改变的。基于这个特点,如果缓存的容量在-128到127之间,那么我们为了使用内存数据的高效性,可以将范围内大小的Integer放在同一缓存数组中,而不在范围内的则不放在缓存数组中,这也就是为什么下面的ValueOf方法中需要断言assert high值>=127的原因。
阅读全文
0 0
- 为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回fa
- 为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回false
- Integer a = 128, Integer b = 128, a==b ; Integer c = 1 , integer d =1 , c==d
- 逗号表达式 c = a,b; d = (a,b);
- (a*b)%d=(a%d*b%d)%d
- a= b?c:d 问号表达式
- 在java中String a="a",b="a";a==b为什么返回true?
- printf("a=%d\nb=%d\nc=%d\n",a,b,c);
- Integer (a=127,b=127; a!=b?)
- HDU3307A^B = C mod D,已知A,C,D,求解B
- Integer a= 127 与 Integer b = 127
- Java表达式y=a<b?c:d>a?b:c的运算解释
- [Google]find a,b,c such that a+b+c<=d
- 计算a^3=b^3+c^3+d^3
- String s = "a" + "b" + "c" + "d" + "e"对象问题
- max = (a>b) ? (c>d ? 1 : 2) : 3
- uva 10125 - Sumsets(a+b+c=d)
- 中序式转后序式?(a+b)*(c+d)=>ab+cd+*
- hdu2647 Reward【拓扑排序】
- 用ngrok实现外网访问本地WEB项目的方法
- HTML5 2017.07.21
- LeetCode
- RESTful架构简介
- 为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回fa
- jQuery回溯处理的设计
- greenplum gp 常用命令
- 谈谈互联网后端基础设施
- solr 使用场景
- github常见操作和常见错误!错误提示:fatal: remote origin already exists.
- Oracle/MySql/SqlServer
- C#和JS交互 WebBrowser实例
- 28. Implement strStr()