java - 为什么相同的整数值在 Java 中有不同的内存地址?

标签 java memory

<分区>

今天是我第一次尝试Java语言。当我尝试这段代码时,我感到很奇怪:

int a =500;
System.out.println(System.identityHashCode(500));
System.out.println(System.identityHashCode(500));
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(a));

所有这些结果都是不同的。但是当我将 500 改为 50 时,它变成了相同的结果。

这是为什么?

最佳答案

But when I changed 500 to 50, It become the same result.

自动装箱缓存基元到对象的转换。小值获得相同的对象,大值则不然。

注意:虽然始终缓存 -128 到 127 之间的值,但可以缓存更高的值,具体取决于命令行设置。有关详细信息,请参阅 Integer 的源代码。

这也称为 Flyweight Pattern


您可以设置整数缓存的最大大小

-Djava.lang.Integer.IntegerCache.high=NNNN
-XX:AutoBoxCacheMax=NNNN
-XX:+AggressiveOpts  // sets it higher depending on the version e.g. 10000

http://martykopka.blogspot.co.uk/2010/07/all-about-java-integer-cache.html

http://www.javaspecialists.eu/archive/Issue191.html

I feel very strange

我知道你读这个问题的意思。 ;)

关于java - 为什么相同的整数值在 Java 中有不同的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11882235/

相关文章:

Java 十进制转二进制 - 大数转二进制

java - TextView:淡出 + 阅读更多 - 单击展开

java - 获取错误 : PKIX path building failed: unable to find valid certification path to requested target

java - 如何开始使用JFreeChart?

c++ - 为什么删除分配的数组会导致内存错误?

javascript - 如何轻松获取 Javascript for 循环的当前迭代属性?

java - 无法同时运行两个着色器程序,但是每个单独使用时都可以正常工作

ruby - 使用交换时进程退出时出现 Errno::ENOMEM

我可以指定堆的位置来序列化我的数据吗?

c - C 中 float 组的内存分配