Java常量池——Integer

本文探讨了Java中Byte等六种基本类型的常量池特性,特别关注这些类型的值在-128到127范围内如何共享相同的实例。通过示例代码展示了Integer在不同值下的对象比较行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:http://blog.youkuaiyun.com/shw2004/article/details/5678703

Java的8种基本类型(Byte, Short, Integer, Long, Character, Boolean, Float, Double), 除Float和Double以外, 其它六种都实现了常量池, 但是它们只在大于等于-128并且小于等于127时才使用常量池。

由如下例子可以看出:

[java]  view plain  copy
  1. public static void main(String[] args) {  
  2.     Integer a = 127;  
  3.     Integer b = 127;  
  4.     System.out.println("等于127:");  
  5.     System.out.println(a == b);  
  6.     System.out.println("*****************");  
  7.   
  8.     a = 128;  
  9.     b = 128;  
  10.     System.out.println("等于128:");  
  11.     System.out.println(a == b);  
  12.     System.out.println("*****************");  
  13.   
  14.     a = -128;  
  15.     b = -128;  
  16.     System.out.println("等于-128:");  
  17.     System.out.println(a == b);  
  18.     System.out.println("*****************");  
  19.   
  20.     a = -129;  
  21.     b = -129;  
  22.     System.out.println("等于-129:");  
  23.     System.out.println(a == b);  
  24.     System.out.println("*****************");  
  25.   
  26.     // <a href="http://lib.youkuaiyun.com/base/softwaretest" class='replace_word' title="软件测试知识库" target='_blank' style='color:#df3434; font-weight:bold;'>测试</a>Boolean  
  27.     System.out.println("测试Boolean");  
  28.     Boolean c = true;  
  29.     Boolean d = true;  
  30.     System.out.println(c == d);  
  31.     d = new Boolean(true);  
  32.     System.out.println(c == d);  
  33. }  

结果如下:

等于127:
true
*****************
等于128:
false
*****************
等于-128:
true
*****************
等于-129:
false
*****************
测试Boolean
true
false

 

当我们给Integer赋值时,实际上调用了Integer.valueOf(int)方法,查看源码,其实现如下:

[java]  view plain  copy
  1. public static Integer valueOf(int i) {  
  2.     if(i >= -128 && i <= IntegerCache.high)  
  3.         return IntegerCache.cache[i + 128];  
  4.     else  
  5.         return new Integer(i);  
  6. }  

而IntegerCache实现如下:

[java]  view plain  copy
  1. private static class IntegerCache {  
  2.     static final int high;  
  3.     static final Integer cache[];  
  4.   
  5.     static {  
  6.         final int low = -128;  
  7.   
  8.         // high value may be configured by property  
  9.         int h = 127;  
  10.         if (integerCacheHighPropValue != null) {  
  11.             // Use Long.decode here to avoid invoking methods that  
  12.             // require Integer's autoboxing cache to be initialized  
  13.             int i = Long.decode(integerCacheHighPropValue).intValue();  
  14.             i = Math.max(i, 127);  
  15.             // Maximum array size is Integer.MAX_VALUE  
  16.             h = Math.min(i, Integer.MAX_VALUE - -low);  
  17.         }  
  18.         high = h;  
  19.   
  20.         cache = new Integer[(high - low) + 1];  
  21.         int j = low;  
  22.         for(int k = 0; k < cache.length; k++)  
  23.             cache[k] = new Integer(j++);  
  24.     }  
  25.   
  26.     private IntegerCache() {}  
  27. }  

注意cache数组是静态的。

所以,Integer类型最好不要直接用==比较。
### Java常量池默认存储的数据类型 Java常量池是一种用于优化内存使用的机制,主要用于存储编译期已知的字面量和符号引用。以下是Java常量池中默认包含的主要数据类型及其特点: #### 1. **基本数据类型常量** 基本数据类型常量值会被存储在常量池中,这些值包括但不限于整数 `int`、浮点数 `float`、双精度浮点数 `double`、字符 `char` 和布尔值 `boolean` 等[^1]。 #### 2. **包装类的缓存对象** 部分基本数据类型的包装类实现了常量池技术。具体而言: - 对于 `Byte`, `Short`, `Integer`, 和 `Long` 这些包装类,默认会缓存 `-128` 到 `127` 范围内的值[^2]。 - `Character` 缓存的是 `[0, 127]` 范围内的值。 - `Boolean` 只有两个可能的值:`true` 和 `false`,因此它们也被视为常量并直接返回。 浮点数类型的包装类 (`Float` 和 `Double`) 并未实现类似的常量池技术。 #### 3. **字符串常量** 字符串常量池专门用于存储通过双引号定义的字符串字面量。当程序中多次使用相同的字符串字面量时,只会创建一个实际的对象,并将其放入字符串常量池中以节省内存[^3]。 #### 4. **Class 文件中的符号引用** 在加载 `.class` 文件时,其中涉及的方法名、字段名以及其他符号引用也会被放置到运行时常量池中。这是为了支持动态链接和解析操作。 #### 5. **其他特殊处理** 自 JDK 7 开始,字符串常量池的位置发生了变化——从永久代 (PermGen) 移动到了堆空间中,这一改动有助于更灵活地管理内存资源[^5]。 ```java // 示例代码展示 Integer 缓存行为 public class ConstantPoolExample { public static void main(String[] args) { Integer a = 100; Integer b = 100; System.out.println(a == b); // 输出 true,因为都在 [-128, 127] 范围内 Integer c = 200; Integer d = 200; System.out.println(c == d); // 输出 false,超出范围不再共享同一对象 } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值