首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java Integer包装类相关

Java Integer包装类相关
EN

Stack Overflow用户
提问于 2016-03-17 17:11:42
回答 2查看 60关注 0票数 4
代码语言:javascript
运行
复制
public class TestMe{
 public static void main(String[] args)  {
   Integer i = 128;
   Integer j = 128;

   Integer k = 12;
   Integer l = 12;

   System.out.println(i == j);  
   System.out.println(k == l);
  }
}

我得到了输出: false,true

为什么第一个是假的,第二个是真的?

EN

回答 2

Stack Overflow用户

发布于 2016-03-17 17:20:26

请参阅:http://javapapers.com/java/java-integer-cache/

简短的回答:

在Java5中,引入了一个新特性来节省内存并提高Integer类型对象处理的性能。整数对象在内部缓存,并通过相同的引用对象重用。

这适用于-127到+127范围内的整数值。

此Integer缓存仅适用于自动装箱。使用构造函数生成整数对象时,它们将不会被缓存。

票数 6
EN

Stack Overflow用户

发布于 2016-03-17 17:21:36

为Integer.valueOf(...)缓存介于-128和127之间的整数值许多操作符经常使用的方法,自动装箱,并在幕后由编译器调用。您可以通过VM选项-XX:AutoBoxCacheMax=size增加此缓存范围。

你的台词:

代码语言:javascript
运行
复制
Integer k = 12;
Integer l = 12;

实际上是由编译器翻译成:

代码语言:javascript
运行
复制
Integer k = Integer.valueOf(12);
Integer l = Integer.valueOf(12);

这就是为什么k和l实例只有一个对缓存实例的相互Integer引用。这一原则也适用于其他包装类。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36056005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档