Integer 与 int 的简单理解(Integer.valueOf()源码解析)

这篇博客总结了Integer与int之间的比较,包括自动拆箱、装箱以及在[-128, 127]范围内的等价性。通过源码分析,解释了Integer.valueOf()方法的工作原理,特别是Integer缓存机制,强调了在特定范围内Integer对象的复用以提高性能。" 6962943,1148953,C#图片上传与替换逻辑,"['C#', '文件操作', 'Web开发', '上传控件']

        本次分享来源于一次做题练习,针对这个题目,根据自己的理解做了一下总结。    

 

一、int 和 Integer 数据的比较

        众所周知,Integer作为int 的包装类,它拥有自动拆箱和自动装箱的功能,所以除了Integer new 出来的对象之外,只要在[-128,127] 这个范围内,int 和 Integer 之间就可以划等号:

        1、new Integer() 相当于在堆中开辟了一片新的空间,对于new 出来的对象,== 比较的是引用地址,故不相等

        2、如果数据在[-128,127] 这个范围内,int 和 Integer 可以完成自动的拆装箱,最终得到的结果是一致的,那如果不在这个范围内是否相等呢,以下通过Integer 的源码进行分析。

二、Integer 源码简单分析

        首先,通过java api我们知道,当程序执行

                Integer i = 100; 

的时候会调用 Integer.valueOf(100) 方法,但是我并没有找到源码中调用此方法的地方,通过javap反编译工具,终于发现了端倪:

      &nb

### Integer.valueOf()Integer.intValue() 的区别及用法 在 Java 中,`Integer.valueOf()` 和 `Integer.intValue()` 是两个 `Integer` 类相关的常用方法,但它们的功能和用途有所不同。 #### 1. **Integer.valueOf()** `Integer.valueOf()` 是一个静态方法,用于将字符串或其他类型的值转换为 `Integer` 对象。它支持多种参数类型,并且会根据参数的范围利用缓存池来优化对象创建过程[^4]。 - **功能**:将 `String` 或其他基本数据类型(如 `byte`, `char`, `short` 等)转换为 `Integer` 对象。 - **缓存机制**:当参数值在 `-128` 到 `127` 之间时,`Integer.valueOf()` 会从缓存池中返回已存在的 `Integer` 对象,而不是创建新的对象[^3]。 - **源码示例**: ```java public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10)); // 调用 parseInt 并封装为 Integer 对象 } ``` - **使用场景**: - 将字符串转换为 `Integer` 对象时,例如 `Integer.valueOf("123")`。 - 自动装箱时,例如 `Integer a = 100;` 实际上调用了 `Integer.valueOf(100)`[^4]。 #### 2. **Integer.intValue()** `Integer.intValue()` 是一个实例方法,用于将 `Integer` 对象解包为原始的 `int` 值。 - **功能**:将 `Integer` 对象转换为其对应的原始 `int` 值。 - **实现细节**:直接返回 `Integer` 对象内部存储的 `int` 值。 - **代码示例**: ```java Integer num = Integer.valueOf(100); // 创建 Integer 对象 int primitiveValue = num.intValue(); // 解包为 int System.out.println(primitiveValue); // 输出 100 ``` #### 3. **主要区别** | 特性 | `Integer.valueOf()` | `Integer.intValue()` | |--------------------|---------------------------------------------------|---------------------------------------| | 方法类型 | 静态方法 | 实例方法 | | 返回值类型 | `Integer` 对象 | `int` 原始类型 | | 参数类型 | 支持多种类型(如 `String`, `byte`, `char`, `short` 等) | 无参数 | | 缓存机制 | 使用缓存池优化对象创建过程 | 不涉及缓存 | | 使用场景 | 将其他类型转换为 `Integer` 对象 | 将 `Integer` 对象解包为 `int` | #### 4. **代码示例** 以下是一个综合示例,展示了两者的用法和区别: ```java public class Main { public static void main(String[] args) { // 使用 Integer.valueOf() 将 String 转换为 Integer 对象 Integer integerObject = Integer.valueOf("123"); // 调用静态方法 System.out.println("Integer Object: " + integerObject); // 输出 123 // 使用 Integer.intValue()Integer 对象解包为 int int primitiveValue = integerObject.intValue(); // 调用实例方法 System.out.println("Primitive Value: " + primitiveValue); // 输出 123 // 演示缓存机制 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,超出缓存范围 } } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值