杰瑞科技汇

integer int转换java

int vs. Integer

要明确两者的根本区别:

integer int转换java-图1
(图片来源网络,侵删)
  1. int (Primitive Type - 基本数据类型)

    • 它是一个原始数据类型,不是一个对象。
    • 它存储的是实际的值(10, -200, 0)。
    • 它的变量直接存储在栈内存中,速度非常快。
    • 它不能为 null,一个 int 变量必须有一个值。
  2. Integer (Wrapper Class - 包装类)

    • 它是一个对象,是 int 的包装类。
    • 它内部包含一个 int 类型的值。
    • 它存储在堆内存中。
    • 它可以为 null,表示“没有值”或“未知值”,这在处理数据库字段、可选参数等场景时非常有用。

转换方法

intInteger (基本类型 -> 对象)

这个过程在 Java 5 之后被称为自动装箱

自动装箱 (推荐)

当 Java 编译器发现你需要一个 Integer 对象,但你给了一个 int 值时,它会自动为你完成转换。

integer int转换java-图2
(图片来源网络,侵删)
// 1. 直接赋值
int primitiveInt = 100;
Integer integerObject = primitiveInt; // 自动装箱发生
System.out.println("integerObject 的值: " + integerObject); // 输出: 100
System.out.println("integerObject 的类型: " + integerObject.getClass().getName()); // 输出: java.lang.Integer
// 2. 在方法调用中
someMethod(50); // 50 会被自动装箱成 Integer 传递给方法
public static void someMethod(Integer i) {
    System.out.println("接收到 Integer: " + i);
}

显式构造 (不推荐,已过时)

在 Java 5 之前,你需要手动调用构造函数来创建 Integer 对象,虽然现在仍然可以工作,但这种写法已经过时,因为自动装箱更简洁。

int primitiveInt = 200;
Integer integerObject = new Integer(primitiveInt); // 显式构造,不推荐
System.out.println(integerObject); // 输出: 200

Integerint (对象 -> 基本类型)

这个过程在 Java 5 之后被称为自动拆箱

自动拆箱 (推荐)

当 Java 编译器发现你需要一个 int 值,但你给了一个 Integer 对象时,它会自动为你完成转换。

Integer integerObject = 300;
int primitiveInt = integerObject; // 自动拆箱发生
System.out.println("primitiveInt 的值: " + primitiveInt); // 输出: 300
// 在计算中
Integer a = 10;
Integer b = 20;
int sum = a + b; // a 和 b 都会被自动拆箱为 int,然后进行加法运算
System.out.println("sum 的值: " + sum); // 输出: 30

显式调用 .intValue() 方法

这是手动拆箱的方式,在需要明确表达意图或者在某些特殊情况下会用到。

integer int转换java-图3
(图片来源网络,侵删)
Integer integerObject = 400;
int primitiveInt = integerObject.intValue(); // 显式调用 intValue() 方法
System.out.println("primitiveInt 的值: " + primitiveInt); // 输出: 400

重要注意事项和陷阱

NullPointerException (空指针异常)

这是自动拆箱时最常见的错误,如果一个 Integer 对象是 null,当你尝试自动拆箱它时,程序会抛出 NullPointerException

Integer nullableInteger = null; // Integer 可以为 null
// 下面的代码会抛出 NullPointerException
int value = nullableInteger; // 尝试将 null 拆箱为 int
// 正确的做法是先检查是否为 null
if (nullableInteger != null) {
    int value = nullableInteger;
    System.out.println("Value is: " + value);
} else {
    System.out.println("Value is null, cannot convert to int.");
}

缓存范围 (Cache Range)

Integer 类有一个静态缓存池(IntegerCache),它会缓存 -128127 之间的 Integer 对象,这意味着:

  • 通过 new Integer(i) 或自动装箱创建的 [-128, 127] 范围内的 Integer 对象,如果值相同,它们实际上是同一个对象( 比较为 true)。
  • 超出这个范围的 Integer 对象,即使值相同,也是不同的对象( 比较为 false)。
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // 输出 true,因为 100 在缓存池中
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // 输出 false,因为 200 超出了缓存池范围
// 使用 valueOf() 方法会考虑缓存
Integer e = Integer.valueOf(100);
Integer f = Integer.valueOf(100);
System.out.println(e == f); // 输出 true
Integer g = Integer.valueOf(200);
Integer h = Integer.valueOf(200);
System.out.println(g == h); // 输出 false

最佳实践:在需要创建 Integer 对象时,优先使用 Integer.valueOf(),而不是 new Integer(),因为它可以利用缓存,提高性能和减少内存占用,自动装箱 intInteger 时,JVM 底层调用的就是 Integer.valueOf()


总结表格

转换方向 推荐方法 (Java 5+) 底层实现/原理 示例
int -> Integer 自动装箱 调用 Integer.valueOf(int) int i = 10; Integer I = i;
Integer -> int 自动拆箱 调用 Integer.intValue() Integer I = 10; int i = I;
String -> int Integer.parseInt() 将字符串解析为 int 原始类型 int i = Integer.parseInt("123");
int -> String String.valueOf() int 值转换为字符串 String s = String.valueOf(123);

希望这个详细的解释能帮助你完全理解 Java 中 intInteger 的转换!

分享:
扫描分享到社交APP
上一篇
下一篇