java hashcode。用于快速索引对象内存地址。 new两个对象。显然正常哈希码是不同的。
javahashcode。用于快速索引对象内存地址。new两个对象。显然正常哈希码是不同的。地址也不同。如果为了重写equals,也把hashcode重写了。这样哈希码可...
java hashcode。用于快速索引对象内存地址。
new两个对象。显然正常哈希码是不同的。地址也不同。如果为了重写equals,也把hashcode重写了。这样哈希码可能返回值是一样的。那这个哈希码对应了两个内存地址??
再就是这个哈希值是保存在哪里?对象内?还是单独有个哈希表,每当有对象创建就添加这个对象的哈希值??
实在有点糊涂了,干嘛也要重写它啊?
求大神帮忙! 展开
new两个对象。显然正常哈希码是不同的。地址也不同。如果为了重写equals,也把hashcode重写了。这样哈希码可能返回值是一样的。那这个哈希码对应了两个内存地址??
再就是这个哈希值是保存在哪里?对象内?还是单独有个哈希表,每当有对象创建就添加这个对象的哈希值??
实在有点糊涂了,干嘛也要重写它啊?
求大神帮忙! 展开
2个回答
展开全部
在 Java 中,Object 对象的 hashCode() 方法会根据不同的对象生成不同的哈希值,默认情况下为了确保这个哈希值的唯一性,是通过将该对象的内部地址转换成一个整数来实现的。
HashCode 其实只是在需要用到哈希算法的数据结构中才有用,比如在 HashMap 和 Hashtable中。
HashCode 的用途是为了方便快速地查找对象,当你重写了 hashCode() 后,HashCode 就不再是默认的对象内部地址了,而是你自己定义的一个值。
举个例子你或许更明白点:假如 a 和 b 是两个对象,你重写了 equals() 方法,你的目的肯定是希望它们两个相等。
现在有一个 HashMap,它的值是这样的 map.put(a,c); map 中插入了一条数据,键是 a 值是 c,现调用 map.get(a) 可以返回对象 c,但是调用 map.get(b); 却不能返回对象 c, 而在你最开始的定义中,a 和 b 两个对象是相等的,相等的对象却得不到相同的结果,这段代码就不符合逻辑了。因为 HashMap 是根据键对象的 HashCode 来进行快速查找的,所以你必须保证 a 和 b 这两个相同对象的 HashCode 也相同,因此你需要重写 hashCode() 方法。另外,如果你要用到 HashSet,在这个例子中 a 和 b 可以同时插入到 HashSet 中,然而这两个对象在逻辑上有时相等的,这不符合 HashSet 的定义。
总之,重写 hashCode 是为了让 Java 中所有使用到 Hash 算法的数据结构能够正常运行,当然如果你保证你的程序中完全不会用到 Hash 算法,那么你也可以不用重写。
HashCode 其实只是在需要用到哈希算法的数据结构中才有用,比如在 HashMap 和 Hashtable中。
HashCode 的用途是为了方便快速地查找对象,当你重写了 hashCode() 后,HashCode 就不再是默认的对象内部地址了,而是你自己定义的一个值。
举个例子你或许更明白点:假如 a 和 b 是两个对象,你重写了 equals() 方法,你的目的肯定是希望它们两个相等。
现在有一个 HashMap,它的值是这样的 map.put(a,c); map 中插入了一条数据,键是 a 值是 c,现调用 map.get(a) 可以返回对象 c,但是调用 map.get(b); 却不能返回对象 c, 而在你最开始的定义中,a 和 b 两个对象是相等的,相等的对象却得不到相同的结果,这段代码就不符合逻辑了。因为 HashMap 是根据键对象的 HashCode 来进行快速查找的,所以你必须保证 a 和 b 这两个相同对象的 HashCode 也相同,因此你需要重写 hashCode() 方法。另外,如果你要用到 HashSet,在这个例子中 a 和 b 可以同时插入到 HashSet 中,然而这两个对象在逻辑上有时相等的,这不符合 HashSet 的定义。
总之,重写 hashCode 是为了让 Java 中所有使用到 Hash 算法的数据结构能够正常运行,当然如果你保证你的程序中完全不会用到 Hash 算法,那么你也可以不用重写。
追问
还有一个地方纠结着
java通过对象的哈希值去 哈希表里查找对象地址。。我重写了哈希值,那它对应的地址不变吗?、甚至 同一个哈希值对应 N多不同对象的地址?
看了个视频:说java通过哈希表去找对应的 对象地址。把我搞糊涂了。
追答
通过哈希算法去查找对象没错,至于是不是对象地址这个就不一定了。
展开全部
我来说说吧.希望对楼主有帮助
首先你重写的equals方法 很明显是 用于比较两个 对象是否相等
比如A a=new A("123") 和A b= new A("123") 如果你没重写的话a.equals(b)显然返回是false,如果你重写了(你懂我的意思吧)了就返回true,对Arraylist这种东西来说就有通过equals来判定两个东西是不是一样.
然后你说的hashcode重写的话除了保证和equals保持一致,
在hashmap的时候hashmap(key,value)的key判断是否已经存在就是根据你的key的hashCode来判定是否已经存在这个key了~..
put(a,"xxxx")
put(b,"yyyy")
如果你的hashcode重写了,那你get(a)返回的就是yyyy
---------
额~..没怎么组织语言~...就路过顺手谢谢自己的看法~希望可以帮到楼主..大家如果发现我有什么说错的地方,欢迎指正.
首先你重写的equals方法 很明显是 用于比较两个 对象是否相等
比如A a=new A("123") 和A b= new A("123") 如果你没重写的话a.equals(b)显然返回是false,如果你重写了(你懂我的意思吧)了就返回true,对Arraylist这种东西来说就有通过equals来判定两个东西是不是一样.
然后你说的hashcode重写的话除了保证和equals保持一致,
在hashmap的时候hashmap(key,value)的key判断是否已经存在就是根据你的key的hashCode来判定是否已经存在这个key了~..
put(a,"xxxx")
put(b,"yyyy")
如果你的hashcode重写了,那你get(a)返回的就是yyyy
---------
额~..没怎么组织语言~...就路过顺手谢谢自己的看法~希望可以帮到楼主..大家如果发现我有什么说错的地方,欢迎指正.
追问
Object的哈希码不是与内存地址相关吗。如果我重写了哈希码,那它还与原来的地址映射吗?、
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询