当前位置:网站首页 > 经验分享 > 正文

integer 的缓存机制

今天在学习过程中了解到一个现象,代码如下:

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装箱后比较,但是结果比较奇怪:

image-20220125143431114

一个是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的变量进行装箱操作,示例如下:

image-20220125152909413


所以结论:

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

版权声明


相关文章:

  • 减少高频功放晶体管pc的方法是:减少集电极电流的2025-08-20 07:01:04
  • 微信群管理助手开发2025-08-20 07:01:04
  • 微信小程序开发者工具界面功能介绍2025-08-20 07:01:04
  • 个人如何搭建网站2025-08-20 07:01:04
  • 谈谈跨域问题2025-08-20 07:01:04
  • iframe会触发vue的mounted2025-08-20 07:01:04
  • linux和win10双系统安装教程2025-08-20 07:01:04
  • typescript long2025-08-20 07:01:04
  • logging模块提供日志功能2025-08-20 07:01:04
  • webpack分环境打包2025-08-20 07:01:04