`
jameswxx
  • 浏览: 776507 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

说说new Integer和Integer.valueOf

    博客分类:
  • java
阅读更多

看看这两个语句

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);
    }


 当传入的整数i:-128<i<=127时,从缓存里取出整数对应的Integer对象,否则创建一个Integer对象。基本上平时的程序中,这个范围的整数是最常用的。


  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预先创建了这些Integer对象。


所以,要注意的是,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


结论:在没有对Integer创建有特殊要求时,比如纯数字计算或比较,最好用Integer.valueOf。

分享到:
评论
10 楼 han0917 2014-10-23  
学习!习惯用valueOf
9 楼 chenjian1567 2012-11-06  
学习咯。。呵呵。。原来是这样滴。。
8 楼 qichao88888 2011-11-05  
看楼主的文章收货真的很大,希望看到更多精彩的文章。
7 楼 laitaogood 2011-05-08  
呵呵,我记得原来面试的时候面试官提过一个这个相关的问题,可惜当时不知道啊
6 楼 avajworm 2011-02-28  
berdy 写道
还可以设置系统属性,让缓存的int范围扩大,不再局限于-128~127。

这个怎么设置呀?
5 楼 纳兰无聊聊 2011-01-28  
我发现楼主脾气不错啊,别人提出友善的评论都可以,礼貌地给予答复!知识点虽然简单,但是说明的Java基本数据类型封装类对象池的原理。唉,学东西有时真的还是看源码快啊
4 楼 jameswxx 2010-11-12  
slippy 写道
直接用Integer a = 1; 最方便了,编译器会使用valueOf方法的,而不是new一个Integer对象


恩,hehe ,我在这里的意思是比较的new和valueof,不是看到底有多少种手段去创建Integer
3 楼 slippy 2010-11-12  
直接用Integer a = 1; 最方便了,编译器会使用valueOf方法的,而不是new一个Integer对象
2 楼 berdy 2010-11-12  
还可以设置系统属性,让缓存的int范围扩大,不再局限于-128~127。
1 楼 danni505 2010-11-11  
恩,有时间是要读读源码,这样能知道很多看是简单,但不一定知道的知识。

相关推荐

    Java Integer.ValueOf()的一些了解

    这是因为在Integer.ValueOf()方法中,会首先判断传入的整数值是否在-128到127之间,如果在这个范围内,就从IntegerCache中取出对应的缓存对象返回,因为i01和i02都是59,所以他们实际上是同一个对象的引用。...

    Java Integer.valueOf()和Integer.parseInt()的区别说明

    Java Integer.valueOf()和Integer.parseInt()的区别说明 Java 中的 Integer 类中有两个静态方法,Integer.valueOf(String s) 和 Integer.parseInt(String s),它们都可以将字符串转换为整型,但它们之间有着很大的...

    java中int_char_string三种类型的相互转换

    Integer integer = Integer.valueOf(str); 三、将 int 转换成 String 将 int 转换成 String 可以使用以下三种方法: 1. 使用 String.valueOf() 方法 String s = String.valueOf(i); 2. 使用 Integer.toString()...

    进制之间的互相转换

    十进制与八进制与十六进制之间的转换可以使用 Integer.toOctalString() 方法、Integer.toHexString() 方法和 Integer.valueOf() 方法。例如: ```java int dec = 150; String octal = Integer.toOctalString(dec);//...

    Integer类的使用方法

    - **valueOf方法**:`valueOf`方法可以将字符串或特定进制的字符串转换为`Integer`对象。 ```java Integer i = Integer.valueOf("1234"); // 或者 Integer.valueOf("1234", 8); 如果字符串是八进制表示 ``` 总之...

    将 BigDecimal 类型转换为 Integer 类型.pdf

    当 BigDecimal 的值超过 Integer 的最大值 `Integer.MAX_VALUE`(即 `2^31 - 1`),调用 `intValue()` 方法时,会抛出 `java.lang.ArithmeticException`,提示“Out of range”。例如: ```java BigDecimal ...

    Java 基础.pdf_电子版pdf版

    Integer z = Integer.valueOf(123); Integer k = Integer.valueOf(123); System.out.println(z == k); // 输出 true,因为使用了缓存 ``` 5. Integer的valueOf方法实现 valueOf方法首先检查给定的数值是否在缓存池...

    Java实训教程 Java软件开发实战 Java类库 第3章 包装器类等 共40页.pptx

    Integer iVal = Integer.valueOf(100); Long lVal = Long.valueOf(100L); Boolean bVal = Boolean.valueOf(false); ``` ##### 四、特定包装器类 - **`Boolean`类**: - 用于处理需要将`boolean`原始类型转换为...

    Java中Integer两种转int方法比较

    在Java编程语言中,将`Integer`对象转换为基本数据类型`int`有两种常见的方法:`Integer.parseInt()`和`Integer.valueOf()`。理解这两种方法的区别和应用场景对于编写高效且正确的Java代码至关重要。 首先,我们来...

    第7讲 int和Integer有什么区别1

    查看`Integer`的源码可以帮助我们更深入地理解其内部机制,比如`Integer.valueOf()`方法如何实现值缓存,以及`Integer`对象的比较操作是如何进行的。 6. **扩展讨论**: - 自动装箱/拆箱发生的时间:这些操作发生...

    Integer创建对象

    实际上,Java编译器会自动执行`Integer.valueOf(40)`方法,这是由于Java的自动装箱机制。`Integer.valueOf()`方法的目的是优化性能,因为它利用了对象池机制。对象池在`Integer`类中以内部类`IntegerCache`的形式...

    java数据类型转换

    可以通过`Integer.valueOf()`或`Integer.parseInt()`方法实现: ```java String str = "25"; int i = Integer.valueOf(str).intValue(); // 使用valueOf // 或者 int i = Integer.parseInt(str); // 使用parseInt `...

    java中String类型转换方法.pdf

    * 使用 `Integer.valueOf()` 方法:`String str = "25"; int i = Integer.valueOf(str).intValue();` 字符串到浮点型 将字符串转换为浮点型可以使用以下方法: * 使用 `Double.parseDouble()` 方法:`String str ...

    Java面向对象(高级)- 包装类(wrapper)的使用

    - `valueOf` 方法:`Integer num = Integer.valueOf(100);`,推荐使用此方法,因为它可以复用已有的对象,减少内存开销。 - 拆箱(unboxing):将包装类对象转换回基本数据类型。 - 直接赋值:`int i = num;` - ...

    java 类型转换 大全

    Integer integer = Integer.valueOf(intStr); return integer.intValue(); } // 将整数类型转换为字符串类型 public static String intToString(int value) { Integer integer = new Integer(value); return...

    JAVA数据类型转换

    例如,`stringToInt`方法使用`Integer.valueOf()`将字符串转换为`Integer`对象,然后通过`intValue()`得到`int`值。其他方法如`stringToFloat`和`floatToString`遵循相同的概念。 总的来说,理解并正确使用Java中的...

    张海 复习1

    另一方面,对于-128到127之间的Integer对象,Java提供了缓存机制,因此`Integer.valueOf(-128) == Integer.valueOf(-128)`为真。对于大于127的值,如`Integer.valueOf(128)`,缓存行为未定义,因此比较结果不确定。...

    Android期末考试题库

    tv.setText(String.valueOf(length)); ``` 2. **最大值显示** - **题目**: 编写一个程序,在两个文本框中分别输入两个数,点击按钮,在`TextView`控件中显示最大的那个数。 - **实现思路**: - 使用两个`...

    通过实例了解Java Integer类和int的区别

    在Java中,我们可以直接声明Integer i = 10,这将自动装箱变为Integer i = Integer.valueOf(10);同时Integer i 也可以自动拆箱为 i.intValue()。 知识点2:Integer.valueOf()方法 Integer.valueOf()方法会将int...

    java类型转换参考大全

    - **使用`Integer.valueOf().intValue()`**:将字符串转换为整型。 ```java String str = "25"; int i = Integer.valueOf(str).intValue(); ``` - **使用`Integer.parseInt()`**:将字符串转换为整型。 ```java...

Global site tag (gtag.js) - Google Analytics