`
zhang_xzhi_xjtu
  • 浏览: 538348 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

object的hash code

    博客分类:
  • java
阅读更多
sun的jvm默认的hash code返回的是对象的内部地址构造的int。
那么就有了2个问题。
1 会不会重复。
2 同一个对象的hash code在gc移动了该对象之后会不会改变。

当然会重复了。无限的对象,有限的地址空间,hash是可以重复的。

同一个对象的hash code即使gc移动了该对象也不会改变。
jvm内部在object上加了标识位(2bits加上按需分配的存储hashcode的32bits),用来决定是用对象的地址还是存储的值,如果对象被gc移动过,如果以前该对象的hash code被调用过的话,会对标识位置位,并存储以前的hashcode供以后使用。按需存储可以减少内存损耗。



分享到:
评论
10 楼 mercyblitz 2011-01-04  
zhang_xzhi_xjtu 写道
mercyblitz 写道
1.hashcode的重复,不是因为地址空间,而是数据类型的长度限制。hashcode的原生Object算法不一定是对象地址哦!JVM实现不同!

2.为什么必要这么做啊,你的理论依据是?




1 你说的是对的。不过我的地址空间的本意就是数据类型限制,(太隐晦了,汗),int的类型决定了只有2的32次幂个hashcode。jvm实现不同,的确是这样,我讨论的是sun的jvm。
2 必须这么做,你想想hash的本意就会明白的。如果同一对象2次hash的值不一样,java世界就乱套了。



你误会我的意思啦,我的意思是说,他没有必要做偏移~

如果hashCode只是内部(逻辑)偏移地址的话,GC移动的物理地址就行了啊!
9 楼 whaosoft 2011-01-04  
zhang_xzhi_xjtu 写道
mercyblitz 写道
1.hashcode的重复,不是因为地址空间,而是数据类型的长度限制。hashcode的原生Object算法不一定是对象地址哦!JVM实现不同!

2.为什么必要这么做啊,你的理论依据是?




1 你说的是对的。不过我的地址空间的本意就是数据类型限制,(太隐晦了,汗),int的类型决定了只有2的32次幂个hashcode。jvm实现不同,的确是这样,我讨论的是sun的jvm。
2 必须这么做,你想想hash的本意就会明白的。如果同一对象2次hash的值不一样,java世界就乱套了。


如果同一对象2次hash的值不一样,java世界就乱套了
感觉这个靠谱 不可能java把自己弄的很繁琐很变态吧
8 楼 RednaxelaFX 2011-01-03  
首先Object的identity hash code跟地址没有必然的联系。规范里从来没说要有。

其次,在实际实现中也是有多种策略的。直接跟JVM相关的讨论可以参考Xiao-Feng Li以前发的一篇文章,相当不错:Object hashcode implementation(请自备梯子)

再次,如果想了解HotSpot VM所采用的具体策略,请参考这个源文件:synchronizer.cpp
留意其中的get_next_hash(),自身就是混合了多种策略的,目的就是让hash更加的分散。
7 楼 freish 2011-01-03  
从hashCode方法的javadoc描述可以看出一些端倪:



hashCode 的常规协定是:

在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)


只要jvm表现出来如同上面描述的那样就ok,至于怎么实现jvm,实在是仁者见仁智者见智的事情了
6 楼 zhang_xzhi_xjtu 2011-01-03  
mercyblitz 写道
1.hashcode的重复,不是因为地址空间,而是数据类型的长度限制。hashcode的原生Object算法不一定是对象地址哦!JVM实现不同!

2.为什么必要这么做啊,你的理论依据是?




1 你说的是对的。不过我的地址空间的本意就是数据类型限制,(太隐晦了,汗),int的类型决定了只有2的32次幂个hashcode。jvm实现不同,的确是这样,我讨论的是sun的jvm。
2 必须这么做,你想想hash的本意就会明白的。如果同一对象2次hash的值不一样,java世界就乱套了。

5 楼 mercyblitz 2011-01-03  
1.hashcode的重复,不是因为地址空间,而是数据类型的长度限制。hashcode的原生Object算法不一定是对象地址哦!JVM实现不同!

2.为什么必要这么做啊,你的理论依据是?



4 楼 zhang_xzhi_xjtu 2011-01-03  
yangyi 写道
zhang_xzhi_xjtu 写道
yangyi 写道
这个标志的长度是多少?既然java cache了hashcode,为什么不cache所有的呢,以至于effective java让我们在应用里cache自定义hashcode

标识是2位。存储32位。
cache所有的太占空间,所以是按需cache。

这个应该是lazy cache,用链表实现,所以空间应该不是问题。effective java2 p34页用的也是一个lazy的cache,为了保证堆上的一致,还用了volatile。
这个设计我觉得真的是值得商榷,本身就是给集合类用的一个工具方法,为什么不像comparator那样完全交给用户来处理呢?还有那个序列化的接口,给对象加入readobject writeobject,标记版本这种高耦合的都想得出来。
不知道算不算jdk早期版本遗留的败笔。

程序员当然希望有选择的自由,但是都是有代价的。
我记着把hashmap的load暴露给程序员后,很多程序员传入的参数都是不合理的。
至于hashcode的用法,当然可以覆盖hashcode了,这个问题不大。原生的hashcode只是提供一个默认实现。
系列化我也觉得不好,但是这个问题本身比较复杂,也没有想到什么好的办法。



3 楼 yangyi 2011-01-03  
zhang_xzhi_xjtu 写道
yangyi 写道
这个标志的长度是多少?既然java cache了hashcode,为什么不cache所有的呢,以至于effective java让我们在应用里cache自定义hashcode

标识是2位。存储32位。
cache所有的太占空间,所以是按需cache。

这个应该是lazy cache,用链表实现,所以空间应该不是问题。effective java2 p34页用的也是一个lazy的cache,为了保证堆上的一致,还用了volatile。
这个设计我觉得真的是值得商榷,本身就是给集合类用的一个工具方法,为什么不像comparator那样完全交给用户来处理呢?还有那个序列化的接口,给对象加入readobject writeobject,标记版本这种高耦合的都想得出来。
不知道算不算jdk早期版本遗留的败笔。
2 楼 zhang_xzhi_xjtu 2011-01-03  
yangyi 写道
这个标志的长度是多少?既然java cache了hashcode,为什么不cache所有的呢,以至于effective java让我们在应用里cache自定义hashcode

标识是2位。存储32位。
cache所有的太占空间,所以是按需cache。
1 楼 yangyi 2011-01-03  
这个标志的长度是多少?既然java cache了hashcode,为什么不cache所有的呢,以至于effective java让我们在应用里cache自定义hashcode

相关推荐

    hash code 一种常用的哈希算法

    哈希码(Hash Code)是一种在计算机科学中广泛使用的数据处理技术,主要应用于查找和存储。标题中的"hash code"指的是这种技术,特别是在Java中的`Hashtable`类中的应用。哈希函数是哈希码的核心,它能够将任意大小...

    javaee_tedu_day09.zip

    ATM系统 Clone方法 toString方法:表示返回对象的字符串表示形式 包名.类名@hashCode(内存地址) ...返回一个hash code码,Integer,内存地址有关的hash算法 如果equal返回true的话,hashCode相同,重写hashCode方法

    【IT十八掌徐培成】Java基础第11天-03.Map集合-hash原理2.zip

    哈希原理的核心在于将键(Key)转化为一个唯一的哈希码(Hash Code),这个过程称为哈希化。哈希码是一个整数值,用于确定键值对在存储时的位置。Java中的Object类定义了hashCode()方法,所有类默认继承这个方法。当...

    MD5Code.zip

    private void btnCalculate_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { string filePath = openFileDialog1.FileName; string md5Hash = CalculateMD5...

    Redis-Code:redis键值数据库源码分析

    t_hash.c hash在服务器/客户端中的应答操作。主要通过redisObject进行类型转换。 t_list.c list在服务器/客户端中的应答操作。主要通过redisObject进行类型转换。 t_set.c set在服务器/客户端中的应答操作。

    SHA-512.zip_SHA_SHA 512 code_SHA-512_sha 512

    hash_object = hashlib.sha512(message.encode('utf-8')) hex_dig = hash_object.hexdigest() print("SHA-512 Hash:", hex_dig) ``` 在提供的压缩包文件"SHA-512.zip"中,可能包含了一个或多个实现SHA-512算法的...

    数据库工具类DatabaseUtil.java

    * @return a <code>ResultSet</code> object that contains the data produced * by the given query; never <code>null</code> */ public ResultSet executeQuery(String sql) { try { Statement statement =...

    learn-redis-source-code:redis原始码学习-redis source code

    学习-redis-源代码 ...下面开始一个包一个包的介绍: 测试:(测试) memtest.c内存检测 redis_benchmark.c用于redis性能测试...主要通过redisObject进行类型转换。 t_list.c list在服务器/客户端中的应答操作。主要通过

    Advanced Data Structures

    orthogonal range search structures, heaps, union-find structures, dynamization and persistence of structures, structures for strings, and hash tables. This is the first volume to show data structures...

    易语言HmacSHA256加密

    HMAC(Hash-based Message Authentication Code)是基于哈希函数的一种密码学概念,通过将密钥和消息一起输入哈希函数来生成一个固定长度的摘要,以此来验证消息的完整性和发送者的身份。SHA256(Secure Hash ...

    使用Java code 远程访问 Redis 服务器 代码(Jedis).zip

    List<Object> results = jedis.exec(); ``` 6. **关闭连接**: - 在完成操作后,确保调用`close()`方法关闭连接。 ```java jedis.close(); ``` 以上就是使用Java和Jedis库远程访问Redis服务器的基本操作。在...

    java面试题,java基础,javaweb,spring,springmvc,mybatis等

    2. 两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?对的,因为 hash code 只是对象的标识符。 3. Object 类中定义的方法有:clone()、equals()、finalize()、getClass()、hashCode...

    国外数据结构教材 Advanced Data Structures

    structures for strings, and hash tables. Instead of relegating data structures to trivial material used to illustrate object-oriented programming methodology, this is the first volume to show data ...

    hash-tables:在 C# 中从头开始哈希表

    首先,哈希表的核心思想是将键通过哈希函数转化为哈希码(Hash Code),这个过程称为哈希化。哈希码是一个整数值,用于在数组中快速定位元素。理想情况下,不同的键应该映射到不同的哈希码,以避免冲突。但在实际...

    hashcode使用方法

    `hashCode` 方法返回的是一个整数,这个整数是对象的一个哈希码(hash code),用于快速比较两个对象是否相等。当两个对象通过 `equals` 方法被判断为相等时,它们的 `hashCode` 必须也相等。但是,即使两个对象的 `...

    uniapp oss直传需要的文件资源(base64.js,crypto.js, hmac.js, sha1.js)

    HMAC(Hash-based Message Authentication Code)是基于哈希函数的消息认证码,它结合了密钥和哈希函数来生成一个简短固定长度的摘要信息,用于验证数据的完整性和来源。在阿里云OSS的直传过程中,HMAC可能被用来...

    Loving Lisp

    - **Hash Tables**: Utilizing hash tables for efficient key-value mapping. - **Evaluation**: Understanding how Lisp evaluates expressions. - **Text Editing**: Using text editors specifically designed ...

    ObjCRuntimeGuide

    Objective-C, as a superset of the C programming language, brings object-oriented programming capabilities while maintaining compatibility with C code. One of its key features is the ability to handle ...

Global site tag (gtag.js) - Google Analytics