Integer.valueOf方法详解

Integer.valueOf 是 Java 中 Integer 类的一个静态方法,它用于将给定的字符串或基本数据类型转换成一个 Integer 对象。

使用场景

  1. 从字符串转换 :将字符串形式的数字转换为 Integer 对象。
java 复制代码
Integer num = Integer.valueOf("123");
  1. 从基本数据类型转换 :将基本数据类型(如 int)的值转换为 Integer 对象。
java 复制代码
int i = 123;  
Integer num = Integer.valueOf(i);
  1. 从包装类转换 :如果你已经有了一个 Integer 对象,并想将其转换回基本数据类型,可以使用 intValue 方法。
java 复制代码
Integer num = Integer.valueOf(123);  
int i = num.intValue(); // i now holds the value 123

注意事项

  1. 性能考虑 :使用 Integer.valueOf 通常比直接使用 new Integer(int) 更高效,因为它会重用已缓存的 Integer 对象。如果你频繁地创建大量的短期 Integer 对象,使用 new Integer(int) 可能会导致内存占用增加,因为这些对象不会被垃圾收集器立即回收。

    举例:

    java 复制代码
    public class LearnMain {
       public static void main(String[] args) {
          Integer n1 = Integer.valueOf(100);
          Integer n2 = Integer.valueOf(100);
          System.out.println(n1 == n2); // true
          Integer n3 = Integer.valueOf(128);
          Integer n4 = Integer.valueOf(128);
          System.out.println(n3 == n4); // false
       }
    }

上述实例中:对象n1和n2 重用已缓存的 Integer 对象;是同一个内存地址,所以比较结果为true;对象n3和n4是新创建的 Integer 对象,放在不同的内存地址中,所以比较结果为false

拓展 :在Java中,对于基本数据类型,== 用于比较值是否相等;对于对象引用类型,== 比较的是引用是否指向同一个对象,而不是对象的内容是否相等 。要比较对象的内容是否相等,应使用对象的 equals() 方法。

  1. 处理异常**:如果字符串无法转换为有效的整数,Integer.valueOf 会抛出 NumberFormatException。在使用此方法时,应确保处理或捕获这种异常。

  2. null 值 :如果字符串为 nullInteger.valueOf 会抛出 NullPointerException。在使用此方法时,应确保字符串不为 null

  3. 缓存 :从 Java 5 开始,Integer.valueOf 使用了缓存机制,这意味着它会重用某些特定范围的 Integer 对象。例如,如果你连续调用 Integer.valueOf(45),可能会得到同一个对象引用。这是因为 45 在这个范围内被缓存了。这种缓存有助于减少内存占用和提高性能。

  4. 基本数据类型和包装类 :虽然 Integer.valueOf(int)new Integer(int) 在功能上是等效的,但使用前者更为推荐,因为它能更好地利用缓存机制。同时,基本数据类型和包装类之间的转换(如 intInteger)应该小心处理,因为自动装箱和拆箱可能会导致意外的行为。例如,当你将一个大的整数值赋值给一个 int 基本数据类型时,Java 会自动将其装箱为一个 Integer 对象,这可能会导致性能问题或内存溢出。

相关推荐
c++逐梦人1 分钟前
C++11——— 包装器
开发语言·c++
爱丽_6 分钟前
Spring 事务:传播行为、失效场景、回滚规则与最佳实践
java·后端·spring
zihao_tom19 分钟前
Go环境搭建(vscode调试)
开发语言·vscode·golang
timi先生26 分钟前
语料库全栈项目部署 (Vue + Java + CQPweb)
java·前端·vue.js
IT方大同28 分钟前
(实时操作系统)线程管理
c语言·开发语言·嵌入式硬件
阿kun要赚马内43 分钟前
Python面向对象:@property装饰器
开发语言·前端·python
sunwenjian8861 小时前
Java进阶--IO流
java·开发语言
wildlily84271 小时前
C++ Primer 第5版章节题 第十三章(二)
开发语言·c++
意法半导体STM321 小时前
【官方原创】STM32H7双核芯片通过 STlink连接失败问题分析 LAT1654
开发语言·前端·javascript·stm32·单片机·嵌入式硬件
深蓝海拓1 小时前
使用@property将类方法包装为属性
开发语言·python