In Java
- 使用创建的对象新操作员将被存储在堆
记忆.
- 使用创建的对象字符串字面量存储在
这字符串常量池
我正在运行以下代码来检查哈希码。
String nameOne = "Deepak";
String nameTwo = new String("Deepak");
System.out.println("nameOne address -- "+nameOne.hashCode());
System.out.println("nameTwo address -- "+nameTwo.hashCode());
代码的输出是
nameOne address -- 2043177526
nameTwo address -- 2043177526
这两个对象都是使用 new 运算符和字符串文字创建的,并相应地存储在堆内存和字符串常量池的不同位置。那么内存地址怎么是一样的呢。
如果我错了,请解释一下这个概念
比较堆和常量池是不正确的。特别是使用hashCode
.
让我们一步一步来:
由于Java 7字符串池位于堆内存内部。阅读更多 http://java-performance.info/string-intern-in-java-6-7-8/.
-
Java中的HashCode与内存地址无关*
JVM有一个arg来指定hashCode默认算法
-XX:hashCode=k
Number k
可能是以下之一:
- 帕克-米勒RNG https://en.wikipedia.org/wiki/Lehmer_random_number_generator
- foo(地址,全局状态)
- 1(常量)
- 增量 (++)
- address
- 线程局部的Xorshift https://en.wikipedia.org/wiki/Xorshift(HotSpot、java 8 中默认)
-
字符串覆盖默认值hashCode
执行。它基于字符串内容。java.lang.String
:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)