2 m0 37402140 m0_37402140 于 2017.08.28 10:10 提问

hashmap的一些问题解析

相信大家都看过一些集合的源码,不对,肯定看过。我也浅读了一些源码下面两个问题不太理解 hashmap的父类已经实现了map接口,为什么hashmap还要实现map接口,还有hashmap的hash方法里面的算法我自己觉得hashcode得值生成是有一定规律的,而在存储时容易发生碰撞,hash方法主要是打乱顺序,减少碰撞,毕竟这只是我的猜测,需要各位大佬的讲解

3个回答

li_ling_ren
li_ling_ren   2017.08.28 10:33

父类实现的接口子类可以不去再进行实现,而你看到的这种情况java里应该是不止一次的出现,
比如ArrayList,HashSet 等都出现了同样的问题。或许是为了方便查看实现类实现的接口,使文档更多的可读性,
也有可能就是作者的手误,这个你不比太过纠结。
对于还有hashmap的hash方法里面的算法hashcode得值生成是有一定规律的,这个是肯定有规律的,同一个对象,每次生成的hashcode必定一样。
所以,一般你要重写一个类的hashcode方法是时,一定要重写equals方法。

m0_37402140
m0_37402140 回复li_ling_ren: 我不理解的是hashmap中的hash()方法
3 个月之前 回复
liugstick
liugstick   2017.08.28 14:59

java面向对象就是这样的实现的,举个简单例子,list和set都基于Collections,你可以发现set继承了所有的功能,为啥还要有个set呢,便于和list进行区分

tianbiandetianbian
tianbiandetianbian   2017.08.28 17:14

stackoverflow上有人说:HashMap的这种继承实现关系其实在现在看来是一个失误,这个是java集合框架的编写者Josh Bloch自己承认的,不知道真假。至于hash()方法是为了防止hashCode()算出的一些比较容易产生冲突的情况,最终目的肯定是尽量避免冲突的发生,具体理解可见:
https://www.zhihu.com/question/20733617。

Csdn user default icon
上传中...
上传图片
插入图片