Java   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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装箱后比较,但是结果比较奇怪

Integer缓冲区相关问题--valueOf()方法

一个是true一个是false

首先要明确两点:

  1. Integer是包装类而不是基本数据类型,类型相比是要复杂一些的
  2. 装箱过程在编译器内进行了默认的valueOf()操作

所以该比较是比较的类,并且比较的是通过装箱操作的包装类。

回到重点,那么为什么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

譬如刚刚的例子中:

  1. 当num=100,此时判断在这个范围内,则将Integer(100)变成Integer cache[228]无论是地址还是内容都是cache[228],所以num1 == num2
  2. 当num=200,它就不在这个范围内了,那么根据函数,直接返回Integer(200),类的存储是在堆中存储的,num3,num4分别new了一个Integer,各自是不同的对象了,所以num3 !=num4

这里画一个图更容易理解,对象存储在堆中,基本类型变量存储在栈中,装箱经过从栈到堆的转换,这里创建两个100和两个200的变量进行装箱操作,示例如下:

Integer缓冲区相关问题--valueOf()方法


所以结论:

当显式或者间接使用valuOf()方法时,若数值在Integer缓冲区范围内,则无论创造多少次对象都是取的缓冲区数组cache[]的原有对象,这些对象都是完全相同的;但如果不在缓冲区范围,无论创建多少次对象都是新创建的,即使内容一致也不是同一个对象。

欢迎各位提出见解

大佬总结

以上是大佬教程为你收集整理的Integer缓冲区相关问题--valueOf()方法全部内容,希望文章能够帮你解决Integer缓冲区相关问题--valueOf()方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: