`
victorzhzh
  • 浏览: 203048 次
  • 来自: ...
社区版块
存档分类
最新评论

Integer.valueOf()和new Integer()

 
阅读更多

1、new Integer():方法会在内存中新开辟一个内存空间;

2、valueOf():方法只有在传入的参数<-128或>127时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象。

程序表象:

如果我们要调用50万次的new Integer(4),在不去设置jvm内存参数的情况下会outOfMemery,而Integer.valueOf(4)则不会。

我们可以分别用new Integer(4)和valueOf(4)构件5万个对象,用jmap -histo:live查看一下内存中Integer对象实例的个数:

new Integer(4)情况下:

 

 num     #instances         #bytes  class name

----------------------------------------------

   1:        500259        8004144  java.lang.Integer

valueOf(4)情况下:

 

26:           259           4144  java.lang.Integer

 

对于,第二点:“valueOf():方法只有在传入的参数<-128或>127时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象。”

这里只是jdk的默认值,其实可以通过启动参数-XX:AutoBoxCacheMax修改掉最大范围,但最大值也不会超过:Integer.MAX_VALUE +128(这个源码可以看到),至于有人问为什么默认设计成(-128,127)这个还真不清楚

对于,是否需要测试的回复,呵呵个人感觉能看代码理解最好,看代码理解不了,测测也无妨

 

这是我在面试时问的一道题目,很多声称对java“精通”的人都回答不出来,我看我们对精通这个词需要好好斟酌一下了。

3
2
分享到:
评论
5 楼 zhufeng1981 2011-10-31  
Technoboy 写道
这个用得着测试吗?

呵呵,我感觉看了源码确实很容易知道结论。
4 楼 zhufeng1981 2011-10-31  
yunhun5114 写道
zhufeng1981 写道
研究的很深入,支持一下。不过我很想知道Java对

“2、valueOf():方法只有在传入的参数<-128或>127时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象”处理的原因。


去看源代码就知道了 valueOf() 的    

源代码我到是看了,没理解他的原因啊,为啥就是-128~127的时候缓存,所以才有一问,呵呵
3 楼 Technoboy 2011-10-31  
这个用得着测试吗?
2 楼 yunhun5114 2011-10-31  
zhufeng1981 写道
研究的很深入,支持一下。不过我很想知道Java对

“2、valueOf():方法只有在传入的参数<-128或>127时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象”处理的原因。


去看源代码就知道了 valueOf() 的    
1 楼 zhufeng1981 2011-10-30  
研究的很深入,支持一下。不过我很想知道Java对

“2、valueOf():方法只有在传入的参数<-128或>127时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象”处理的原因。

相关推荐

    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),它们都可以将字符串转换为整型,但它们之间有着很大的...

    进制之间的互相转换

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

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

    通过 Integer.valueOf() 方法可以将 String 转换成 int。例如: int i = Integer.valueOf(my_str).intValue(); 2. 使用 Integer.parseInt() 方法 使用 Integer.parseInt() 方法也可以将 String 转换成 int。例如...

    java中String类型转换方法.pdf

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

    Integer类的使用方法

    Integer i = Integer.valueOf("1234"); // 或者 Integer.valueOf("1234", 8); 如果字符串是八进制表示 ``` 总之,`Integer`类提供了丰富的功能,使得在Java中处理整数更加方便和高效。掌握这些方法的应用,对于...

    java类型转换参考大全

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

    Java中Integer两种转int方法比较

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

    张海 复习1

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

    JAVA数据类型转换

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

    java 类型转换 大全

    int i = Integer.valueOf(my_str).intValue(); ``` 此方法同样可以完成转换,但相比`parseInt`来说,性能稍差。 #### 其他类型转换示例 除了整数与字符串的转换外,我们还可以将其他基本数据类型如`double`、`...

    java数据类型转换

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

    整形和字符串的各种转换

    同样,我们可以使用Integer.valueOf()方法将字符串转换为整形。例如: ```java String str = "10"; int i = Integer.valueOf(str).intValue(); ``` 这样,我们就将字符串str转换为了整形i。 字符串到字符数组的转换...

    JAVA数据转换类型

    2. 使用 `Integer.valueOf()` 方法:`int i = Integer.valueOf("123").intValue();` 这两种方法都可以将字符串转换为整数,但需要注意的是,如果字符串不能被转换为整数,那么将抛出 `NumberFormatException` 异常...

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

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

    java 进制转换

    int decimalValue = Integer.valueOf(hexStr, 16).intValue(); // 结果为 65535 ``` ##### 5. `Integer.parseInt(String s, int radix)` 该方法用于解析一个字符串并将其按照指定的基数转换为整数。 - **示例**...

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

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

    day04-常用API&异常1

    - `Integer.valueOf(String s)`:返回保存指定字符串值的Integer对象,同样,如果字符串不能解析为int,会抛出`NumberFormatException`。 2. **int与String类型的相互转换** - **int转String**:通常有两种方式...

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

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

Global site tag (gtag.js) - Google Analytics