Hel*_*nar 17 java hash hashtable object
我很好奇java如何使用Object API的hashCode()方法生成哈希值?
Pas*_*ent 24
本hashCode()的Object实际上是一个本地方法和实现其实不是纯Java.现在,关于它的工作方式,Tom Hawtin的答案在解释它时做得非常好:
许多人会声称
Object.hashCode会在内存中返回对象表示的地址.在现代实现中,对象实际上在内存中移动 而是使用对象标题的区域来存储该值,该值可以在首次请求该值时从存储器地址延迟地导出.
整个答案实际上值得一读.
Mar*_*ell 10
Java不生成hashCode(),即此处没有自动发生.但是,Object根据对象实例的内存地址生成HashCode.大多数类(特别是如果你要在任何CollectionAPI中使用它)应该实现自己的HashCode(并通过契约他们自己的equals方法).
根据Java Platform API文档,哈希码的计算基于Object的32位内部JVM地址.
确实,对象在执行期间移动(AFAIK唯一的原因是垃圾收集器).但哈希码不会改变.
所以当你有这样的对象时
Person person1 = new Person();
person1.setName("Alex");
Person person2 = new Person();
person2.setName("Alex");
Person person3 = person2;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,person1.hashCode将不等于person2.hashCode,因为这两个对象的内存地址不同.
但是person2.hashCode将等于person3,因为它们指向同一个对象.
因此,如果您需要为对象使用hashCode方法,则必须自己实现它.
顺便说一下String.hashCode的实现是不同的.它是这样的:(C#语法)
public int hashCode(String str)
{
int h = 0;
for (int i = 0; i < str.Length; i++)
h = (h * 31) + str[i];
return h;
}
Run Code Online (Sandbox Code Playgroud)
编辑:这里没有进行溢出检查,因此hashCode可能是正数或负数.
| 归档时间: |
|
| 查看次数: |
27726 次 |
| 最近记录: |