sar*_*nan 40 java caching integer
这里他们是同一个实例:
Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2); // outputs "true"
Run Code Online (Sandbox Code Playgroud)
但在这里他们是不同的实例:
Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2); // outputs "false"
Run Code Online (Sandbox Code Playgroud)
为什么包装器对象仅在值127内共享同一实例?
axt*_*avt 35
因为它是由Java语言规范指定的.
如果该值
p被装箱是true,false,一个byte,或一个char在所述范围内\u0000对\u007f或int或short-128和127(含)之间的数字,然后让和是任何两个装箱转换的结果.情况总是如此.r1r2pr1 == r2理想情况下,装箱给定的原始值
p总是会产生相同的参考.实际上,使用现有的实现技术可能不可行.上述规则是一种务实的妥协.上面的最后一个条款要求将某些常见值装入无法区分的对象中.实现可以懒惰地或急切地缓存这些.对于其他值,此公式不允许对程序员的盒装值的身份进行任何假设.这将允许(但不要求)共享部分或全部这些引用.这确保了在大多数常见情况下,行为将是期望的行为,而不会造成过度的性能损失,尤其是在小型设备上.较少的内存限制的实施方式中可能,例如,高速缓存的所有
char和short价值,以及int和long值中的-32K至+ 32K的范围内.
Lac*_*lev 12
java.lang.Integer的来源:
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);
}
Run Code Online (Sandbox Code Playgroud)
干杯!
顺便说一句,你可以缩短你的代码
System.out.println("Integer 127 == " + ((Integer) 127 == (Integer) 127));
System.out.println("Integer 128 == " + ((Integer) 128 == (Integer) 128));
for(int i=0;i<5;i++) {
System.out.println(
"Integer 127 system hash code " + System.identityHashCode((Integer) 127)
+ ", Integer 128 system hash code "+System.identityHashCode((Integer) 128));
}
Run Code Online (Sandbox Code Playgroud)
版画
Integer 127 == true
Integer 128 == false
Integer 127 system hash code 1787303145, Integer 128 system hash code 202703779
Integer 127 system hash code 1787303145, Integer 128 system hash code 1584673689
Integer 127 system hash code 1787303145, Integer 128 system hash code 518500929
Integer 127 system hash code 1787303145, Integer 128 system hash code 753416466
Integer 127 system hash code 1787303145, Integer 128 system hash code 1106961350
Run Code Online (Sandbox Code Playgroud)
您可以看到每次127是相同的对象,而128的对象是不同的.
| 归档时间: |
|
| 查看次数: |
5824 次 |
| 最近记录: |