Integer的常量池数据比较

1.5jdk一下

*****************Integer a = 100; 不相当于 Integer a = value.of(100);

Integer a = value.of(127);//(-128 - 127)
Integer b= value.of(127);//(-128 - 127)
System.out.print(a==b);
System.out.print(a.equals(b));

结果是:truetrue

Integer a = value.of(128);
Integer b= value.of(128);
System.out.print(a==b);
System.out.print(a.equals(b));

结果是:falsetrue

1.5jdk以上

****************Integer a = 100; 相当于 Integer a = value.of(100);

Integer a = 127;//(-128 - 127)
Integer b= 127;//(-128 - 127)
System.out.print(a==b);
System.out.print(a.equals(b));

结果是:truetrue

Integer a = 130;
Integer b= 130;
System.out.print(a==b);
System.out.print(a.equals(b));

结果是:falsetrue

 

### 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、付费专栏及课程。

余额充值