大佬教程收集整理的这篇文章主要介绍了Integer缓冲区相关问题--valueOf()方法,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
今天在学习过程中了解到一个现象,代码如下:
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1==num2?true:falsE);
//***********************************************
Integer num3 = 200;
Integer num4 = 200;
System.out.println(num3==num4?true:falsE);
这串代码,上面比较的是100装箱后比较和200装箱后比较,但是结果比较奇怪:
一个是true一个是false
首先要明确两点:
所以该比较是比较的类,并且比较的是通过装箱操作的包装类。
回到重点,那么为什么100之间和200之间的比较完全不同?这涉及到Integer缓冲区的问题,我们可以查询一下Integer内的valueOf()方法:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
解释一下这串代码,就是说装箱操作并不是简简单单就装进去就完事,其中需要判断该数i是不是满足 low <= i <= high
而缓冲区内:
int low = -128;
int high = 127;
而在这个范围,就把这个装箱后的结果取作cache数组内原有的某个结果,cache的数组区间为:
cache = new Integer[(high - low) + 1];//也就是256
譬如刚刚的例子中:
这里画一个图更容易理解,对象存储在堆中,基本类型变量存储在栈中,装箱经过从栈到堆的转换,这里创建两个100和两个200的变量进行装箱操作,示例如下:
所以结论:
当显式或者间接使用valuOf()方法时,若数值在Integer缓冲区范围内,则无论创造多少次对象都是取的缓冲区数组cache[]的原有对象,这些对象都是完全相同的;但如果不在缓冲区范围,无论创建多少次对象都是新创建的,即使内容一致也不是同一个对象。
欢迎各位提出见解
以上是大佬教程为你收集整理的Integer缓冲区相关问题--valueOf()方法全部内容,希望文章能够帮你解决Integer缓冲区相关问题--valueOf()方法所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。