为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回false
来源:互联网 发布:打击网络谣言的法律 编辑:程序博客网 时间:2024/06/10 00:08
为什么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返回false
- 为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回fa
- 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?
- 为什么Java中1000==1000为false而100==100为true?(Integer)
- 为什么Java 两个Integer 中1000==1000为false而100==100为true?
- 为什么1000 == 1000返回为False,而100 == 100会返回为True?
- 为什么1000 == 1000返回为False,而100 == 100会返回为True?
- 【译】在Java中,为什么1000 == 1000 返回false,而100 == 100 返回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
- 为什么1000 == 1000 返回false 100 == 100 返回 true
- Integer a= 127 与 Integer b = 127
- Java表达式y=a<b?c:d>a?b:c的运算解释
- 使用photoview+viewpager实现图片缩放切换(类似微信朋友圈图片查看)
- 图片找不到之后,用固定图片替换
- MySQL基础
- MyEclipse
- 经典查找算法 --- R树
- 为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回false
- Gradle for Android 第七篇( Groovy入门 )
- hadoop Corrupt blocks或Missing replicas问题处理方法
- 学习记录 初学MATLAB
- Qt 快速写Excel
- C++string类常用函数总结
- HADOOP 安全体系-Authentication 1
- android数据库之BaseColumns接口作用理解
- 深层学习为何要“Deep”(上)