Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java整数池。为什么?_Java_Object Comparison - Fatal编程技术网

Java整数池。为什么?

Java整数池。为什么?,java,object-comparison,Java,Object Comparison,我到处都读到过,当在Java中定义一个介于-128到127之间的整数时,它会返回一个已经创建的对象,而不是创建一个新对象 除了让新手程序员将整数对象与=进行比较,看看它们是否是相同的数字之外,我认为这样做没有任何意义,但我认为这是不好的,因为他们肯定认为他们可以将任何整数与=进行比较,而且,在任何编程语言中教授这也是一种糟糕的做法:用=比较两个“不同”对象的内容 为什么要这样做还有其他原因吗?或者,在我看来,在JavaScript中设计类似可选分号的语言时,这只是一个错误的决定 编辑:我在这里看

我到处都读到过,当在Java中定义一个介于-128到127之间的整数时,它会返回一个已经创建的对象,而不是创建一个新对象

除了让新手程序员将整数对象与
=
进行比较,看看它们是否是相同的数字之外,我认为这样做没有任何意义,但我认为这是不好的,因为他们肯定认为他们可以将任何整数与
=
进行比较,而且,在任何编程语言中教授这也是一种糟糕的做法:用
=
比较两个“不同”对象的内容

为什么要这样做还有其他原因吗?或者,在我看来,在JavaScript中设计类似可选分号的语言时,这只是一个错误的决定

编辑:我在这里看到他们解释了这种行为:


我想问的是,为什么他们设计它具有这种行为,而不是为什么会发生这种行为。

我认为创建任何对象都比从符号表中获取要花更多的时间。此外,如果我没有弄错的话,堆上的每个对象都会为标头占用24字节的额外空间。现在,如果程序员编写他/她的程序,大多数操作都是在小整数(在本例中是小整数)上完成的。因此,它可以节省大量空间并稍微提高性能。

它被称为,用于最小化内存使用

这些数字很可能会被重复使用,而像
Integer
这样的自动框类型是不可变的(请注意,这不仅仅适用于
Integer
)。缓存它们可以减少实例数量,并减少GC(垃圾收集)工作

JLS在本节中特别说明了这一点:

如果要装箱的值p为true、false、一个字节或\u0000到\u007f范围内的字符,或一个介于-128和127(包括-128和127)之间的整数或短数字,则让r1和r2为p的任意两个装箱转换的结果。r1==r2总是这样

理想情况下,装箱一个给定的原语值p,总是会产生一个相同的引用。在实践中,使用现有的实现技术可能不可行。上述规则是一种务实的妥协。上面的最后一条要求将某些公共值始终装箱到不可区分的对象中。实现可以延迟或急切地缓存这些数据。对于其他值,此公式不允许程序员对装箱值的标识进行任何假设。这将允许(但不要求)共享部分或所有这些引用

这确保了在大多数常见情况下,行为将是所需的,而不会造成不适当的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有char和short值,以及-32K到+32K范围内的int和long值


当新对象是不可变的并且可以共享时,分配新对象和占用内存感觉有点不必要。也许内存优化是一个答案,不要想它。它节省内存,速度更快,并且减少了垃圾收集器的压力。重用对象可以大大加快速度,因此有些选项会将整数缓存大小增加到10000或20000。。为什么是24岁?在哪个JVM上?是的,现在更有意义了。。。没有想到记忆,真是太遗憾了。谢谢你。我想到了大部分。我不知道为什么头球正好是24分。我想一定有签名之类的东西如果总内存不能被8整除,那么也会添加填充(如果Integer是int-24(header)+4(int)+4(padding)的包装),这不是第一个答案,而是更详细的答案。我不喜欢java优化软件。我认为优化软件属于开发者。我的意思是,他们改变了对象的工作方式,只是为了优化用户软件。如果开发人员想要优化它,他们应该制作自己的整数池。但这是我的观点:现在我读到了你的拳击转换编辑,而且更有意义。Java在数百万个硬件差异很大的设备下工作,因此他们不得不考虑不惜任何代价降低内存使用。很好的工作Java:PI认为像Java这样的高级语言的全部要点是尽可能向最终用户隐藏血淋淋的细节;)但这尤其是。。。呃,我可以选择任何一种方式。现在,由于Java内存分配非常便宜,池变得不那么重要了()。JVM现在支持从Java7和JavaSE6U23开始的转义分析,因此临时对象创建的影响更小()。