关于Integer缓冲池的小结

本文详细解析了Java中Integer类型的缓存池机制及其等值判断方式,通过具体代码实例展示了Integer对象的创建过程,并阐述了在不同情况下(如自赋值、缓冲池内取值与使用new关键字创建)对象相等性的区别。

public static void main(String[] args) {
  Integer i1 = 128;
  Integer i2 = 128;
  System.out.println(i1==i2);
  System.out.println(i1.equals(i2));
 
  Integer i3 = 127;
  Integer i4 = 127;
  System.out.println(i3==i4);
  System.out.println(i3.equals(i4));
  
  Integer i5 = new Integer(-128);
  Integer i6 = new Integer(-128);
  System.out.println(i5==i6);
  System.out.println(i5.equals(i6));
 }

程序最终的运行结果是false、true、true、true、false、true。

i1到i4使用等号赋值是JDK5的特性,相当于Integer.valueOf(x)。

在java中,Integer具有一个-128至127的缓冲池,在这个区间内赋值,不创建新的对象,而是直接在缓冲池中取值。故(i3==i4)为真。

若是使用new Integer(x),则是在堆内存中创建新的对象,故(i5==i6)为假。

 

### 原理 - **Integer常量池**:Integer类存在缓存池,其范围是 -128 到 127。当使用语法 `Integer i = 整数值` 时,如果该整数值在 -128 到 127 之间,会直接从缓存池中获取对应的 Integer 对象;若不在此范围,则会创建一个新的 Integer 对象。这是为了提高频繁使用小整数时的性能和减少内存开销 [^1]。 - **String常量池**:String类型的常量池主要用于存储字符串常量。直接使用双引号声明出来的 String 对象会直接存储在常量池中。对于不是用双引号声明的 String 对象,可使用 `String.intern()` 方法。若运行时常量池中已包含与之内容相同的字符串,则返回常量池中该字符串的引用;JDK1.7前(不含1.7)会在常量池中创建相同内容的字符串并返回其引用,JDK1.7及之后则在常量池中记录此字符串的引用并返回 [^2]。 ### 使用 - **Integer常量池**:可以直接采用 `Integer i = 整数值` 的方式创建 Integer 对象,当值在 -128 到 127 之间时,会复用缓存池中的对象。例如: ```java Integer i1 = 120; Integer i2 = 120; System.out.println(i1 == i2); // 输出 true,因为复用了缓存池中的对象 ``` - **String常量池**:直接使用双引号声明字符串会放入常量池,对于非双引号声明的字符串,可使用 `intern()` 方法将其与常量池关联。例如: ```java String str1 = "hello"; String str2 = new String("hello"); String str3 = str2.intern(); System.out.println(str1 == str3); // 输出 true ``` ### 区别 - **范围**:字符串常量池不存在任何范围限制,可存储任意字符串;而 Integer 类的缓存池范围是 -128 到 127 [^1]。 - **创建方式**:Integer 常量池通过 `Integer i = 整数值` 的方式创建对象时利用缓存池;字符串常量池除了直接用双引号声明外,还可通过 `intern()` 方法将非双引号声明的字符串与常量池关联 [^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值