new Integer(1)和Integer.valueOf(1)的区别

本文详细解释了Java中Integer类的valueOf方法如何利用缓存机制提高效率。通过具体示例展示了当整数值位于-128到127范围内时,valueOf会返回同一个对象,而new Integer则总是创建新对象。

java.lang包中的Integer类是我们比较常用的类,比如以下代码:

Integer a=new Integer(1)

Integer a=Integer.valueOf(1);

两个都是得到一个Integer对象,但是Integer.valueOf的效率高。为什么呢?因为Integer.valueOf用到了缓存机制。

其中Integer.valueOf方法代码如下:

public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache 
   return IntegerCache.cache[i + offset];
}
        return new Integer(i);
 }

在这个类中使用到了一个辅助类IntegerCache,其中IntegerCache的源代码如下:

private static class IntegerCache {
private IntegerCache(){}


static final Integer cache[] = new Integer[-(-128) + 127 + 1];


static {
   for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
    }

可以看到在IntegerCache中已经初始化了cache数组。所以,要注意的是,new Integer返回的永远是不同的对象,但是当整数范围在-128<i<=127时,Integer.valueOf返回的是同一个对象。

看下面代码:

Integer a=new Integer(1);   
        Integer b=new Integer(1);   
          
        //整数范围在-128到127之间,返回的是同一个对象   
        Integer c=Integer.valueOf(1);   
        Integer d=Integer.valueOf(1);   
          
        //返回的不是同一个对象   
        Integer e=Integer.valueOf(200);   
        Integer f=Integer.valueOf(200);   
          
        System.out.println(a==b);   
        System.out.println(c==d);   
        System.out.println(e==f);

 

程序运行的结果为:

false

true

false

在 Java 中,`Integer.parseInt` `Integer.valueOf` 都能将字符串转换为整型,但存在诸多区别: - **返回值类型**:`parseInt()` 返回的是基本类型 `int`,而 `valueOf()` 返回的是包装类 `Integer`。`Integer` 可以使用对象方法,而 `int` 类型不能 `Object` 类型进行互相转换[^1]。 - **参数类型**:`Integer.parseInt` 的参数类型只能为 `String`;`Integer.valueOf` 的参数可以为多种类型,当参数为 `byte`、`char`、`short`、`string` 等自动转换为 `int` 类型时会自动转换,当为 `float` 或 `double` 时会提示错误。当参数类型为 `char` 时,`Integer.valueOf()` 会自动计算 `char` 类型的 ASCII 码,如对于 `char ch = 'a'`,使用 `Integer.valueOf(ch)` 输出 97 [^3]。 - **实现机制**:查看 `Integer` 源码可知,当调用 `valueOf(int)` 时,实际上为 `int` 的装箱操作。当调用 `valueOf(String s)` 时,实际上是调用 `parseInt(s, 10)` 方法,并包装为 `Integer` 类型。而 `parseInt()` 的参数只能为 `String`,返回的是 `int` 类型 [^4]。 - **比较情况**:`int` 整型常量比较时,`==` 是值比较。`new Integer()` 每次构造一个新的 `Integer` 对象,`Integer.parseInt` 每次构造一个 `int` 常量。`Integer.valueOf` 返回一个 `Integer` 对象,默认在 -128~127 之间时返回缓存中的已有对象(如果存在的话),注意值的区间是否在 -128~127 之间,如果在,则构造的相同值的对象是同一个对象,`==` 比较后返回 `true`,否则返回 `false`。`int` `Integer` 之间的比较,结果是值比较 [^5]。 以下是简单的代码示例: ```java public class Main { public static void main(String[] args) { String numStr = "123"; // 使用 parseInt int num1 = Integer.parseInt(numStr); // 使用 valueOf Integer num2 = Integer.valueOf(numStr); System.out.println("parseInt 返回值: " + num1); System.out.println("valueOf 返回值: " + num2); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值