java中INTEGER的取值范围解析

作者:袖梨 2026-06-02

深入理解Java中Integer类型的取值范围及其底层实现原理,对于开发者掌握数据类型特性至关重要。本文将详细解析Integer的数值范围及缓存机制。

Java中INTEGER的取值范围

public static void main(String[] args) 
{
    Integer a = new Integer(1);//使用new创建时a,b比较必为false
    int c = 1;
    Integer b = 1;

    System.out.println(a == c); // true
    System.out.println(a == b); // false
        
    Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
        
    System.out.println(f1 == f2); // true
    System.out.println(f3 == f4); // false

为何f3 == f4返回false?

public class AutoboxingTest {
    public static void main(String args[]) {
        // 示例1:基本类型比较
        int i1 = 1;
        int i2 = 1;
        System.out.println("i1==i2 : " + (i1 == i2)); // true

        // 示例2:混合类型比较
        Integer num1 = 1; // 自动装箱
        int num2 = 1;
        System.out.println("num1 == num2 : " + (num1 == num2)); // true

        // 示例3:特殊缓存情况
        Integer obj1 = 1; // 调用Integer.valueOf()
        Integer obj2 = 1; // 返回相同缓存对象
        System.out.println("obj1 == obj2 : " + (obj1 == obj2)); // true

        // 示例4:新建对象比较
        Integer one = new Integer(1);
        Integer anotherOne = new Integer(1);
        System.out.println("one == anotherOne : " + (one == anotherOne)); // false
    }
}
 
输出结果:
i1==i2 : true
num1 == num2 : true
obj1 == obj2 : true
one == anotherOne : false

第三个示例展示了特殊情况,obj1和obj2初始化时都触发了自动装箱。由于JVM会缓存-128到127之间的Integer对象,因此这两个引用指向同一个对象。

java中INTEGER的取值范围详解

对象比较的本质

Java编译时会将Integer a = 100转换为Integer.valueOf(100)。值得注意的是,当数值超出-128到127范围时,会新建对象而非使用缓存。

public static void main(String []args) {
    Integer a = 100;
    Integer b = a; // b指向a的堆地址
    a++; // a指向新地址101
    System.out.println(a==b); // false
}

Integer类型占用4字节32位二进制空间,其中1位表示符号位,实际可表示范围为-2^31至2^31-1。

缓冲机制详解

当Integer通过直接赋值而非new创建时:

Integer b1 = 12;
Integer b2 = 12;

这种情况会使用常量池中的同一空间存储12,因此b1和b2指向相同地址。

Java语言规范(JSL)明确规定Integer缓冲范围为-128到127。超出此范围将创建新对象。

补码表示原理

计算机中使用补码存储数据:

  1. 正数的原码、反码、补码相同
  2. 负数需将原码符号位不变,其余位取反得到反码,再加1获得补码

本文详细解析了Java中Integer类型的取值范围、缓存机制及底层实现原理,希望能帮助开发者更好地理解和使用该数据类型。

  1. 深度解析Java常量池中的Integer缓冲池和String常量池
  2. Java中Integer的valueOf()方法用法及说明
  3. Java实现String转Integer的四种方案对比
  4. 一文详解Java中Integer是如何应用享元模式的
  5. Java中Integer.equals的用法与特殊情况
  6. Java中Integer128陷阱

相关文章

精彩推荐