栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么没有在Java中缓存Integer?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么没有在Java中缓存Integer?

非常清楚的是,缓存会对性能造成不可接受的影响–每次创建Integer时,都会产生额外的if语句和内存查找。仅此一个因素就掩盖了任何其他原因,而使该线程感到痛苦的其余部分。

就“正确”响应==而言,OP在其正确性假设中是错误的。整数确实通过Java社区对正确性的期望,当然也通过规范对正确性的定义,对==做出正确的响应。也就是说,如果两个引用指向同一对象,则它们为

==
。如果两个引用指向
不同的 对象,即使它们具有相同的内容,它们 也不
==
是相同的。因此,得出的结果就不足为奇
new Integer(5) == newInteger(5)
false

更为有趣的问题是, 为什么

new Object();
每次都需要创建一个唯一的实例?即为什么
newObject();
不允许缓存?答案是
wait(...)
notify(...)
。缓存
newObject()
s会错误地导致线程在不应该同步时彼此同步。

如果不是那样的话,那么Java实现可以完全

new Object()
单例缓存s。

new Integer(5)
这就说明了为什么必须创建7个唯一的
Integer
对象(每个对象都包含值5
)需要完成7次(因为
Integer
extend
Object
)。


次要的,不太重要的东西: 自动装箱和自动拆箱功能导致本来不错的方案中的一个问题。没有该功能,您将无法进行比较

new Integer(5) ==5
。要启用这些功能,Java 会将 对象 取消装箱 (并且 不对 原语进行装箱)。因此
new Integer(5) ==5
被转换为:(
new Integer(5).intValue() == 5
不是
new Integer(5) == newInteger(5)

最后一两件事要了解是那个自动装箱

n
被做
new Integer(n)
。通过内部调用来完成
Integer.valueOf(n)

如果您认为自己了解并想要测试自己,请预测以下程序的输出:

public class Foo {  public static void main (String[] args) {    System.out.println(Integer.valueOf(5000) == Integer.valueOf(5000));    System.out.println(Integer.valueOf(5000) == new Integer(5000));    System.out.println(Integer.valueOf(5000) == 5000);    System.out.println(new Integer(5000) == Integer.valueOf(5000));    System.out.println(new Integer(5000) == new Integer(5000));    System.out.println(new Integer(5000) == 5000);    System.out.println(5000 == Integer.valueOf(5000));    System.out.println(5000 == new Integer(5000));    System.out.println(5000 == 5000);    System.out.println("=====");    System.out.println(Integer.valueOf(5) == Integer.valueOf(5));    System.out.println(Integer.valueOf(5) == new Integer(5));    System.out.println(Integer.valueOf(5) == 5);    System.out.println(new Integer(5) == Integer.valueOf(5));    System.out.println(new Integer(5) == new Integer(5));    System.out.println(new Integer(5) == 5);    System.out.println(5 == Integer.valueOf(5));    System.out.println(5 == new Integer(5));    System.out.println(5 == 5);    System.out.println("=====");    test(5000, 5000);    test(5, 5);  }  public static void test (Integer a, Integer b) {    System.out.println(a == b);  }}

为了获得额外的信用,如果所有值

==
都更改为,还可以预测输出
.equals(...)

更新: 感谢用户@sactiw的评论:“缓存的默认范围是-128到127,并且从Java 1.6开始,您可以通过从命令行传递-
XX:AutoBoxCacheMax =来重置上限值> = 127”



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569163.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号