HashMap存放对象时如果Key相同那么Value会进行覆盖,那么底层为什么要数组+链表?直接数组+散列算法不就好了?反正Key一样链表中的对象也只会是最后进来的!!
解决方案 »
- JAVA编程思想的练习题,不知道是翻译问题,还是我理解能力差
- swing 实现类似Editplus的显示行数用什么组件
- 虽然比较简单,但急切希望得到各位的帮助
- 关于swing和定时器的问题
- 请教:在客户机上,applet能不能建立与服务器oracle数据库的连接????(我是菜鸟)
- 请教一个Java类的问题
- Linux装的j2sdk编译时如何显示中文?
- 在JTREE 中如何实现 所有树节点的 展开 和 收缩 功能?
- 如何将String对象的变量转化成int对象的变量
- 面试题
- 下载文件能下载但是ioException 报 closed
- 关于 ReentrantLock和CopyOnWriteArrayList一个疑惑
过程使首先根据key的hash算法,算出数组下标位置,然后遍历链表找到value。
不同的key可能映射到数组相同下标,但是随后会比较key是否相等来返回value,此时会调用equals方法。也就是说equals不相等的key,会分别存入链表的不同位置。这样下标相同,但是本质上不相等的key,就都可以保存到链表的不同位置了。反之,如果equals相等的话,说明是同一个key,直接覆盖旧值。
//节点里存了几个东西
key
value
hash //对key进行哈希运算得出的值
next //指向下一个节点
给你打个比方吧
我这里有4个 不同的 keykey1
key2
key3
key4//这里key1,和key2 的hash值相同你要知道HashMap里封装的是一个数组 只不过元素是链表(这里的数组元素都是链表的表头)
key1 和key2 因为有相同的 hash值 所以对应同一个数组元素,
put(key1,值)如果对应数组元素为null的话,恭喜了,key1去进数组里当表头去了
put(key1,值)如果对应数组元素不为空,那就顺这这条链往下找,直到找到 next为null的地方,给你加到尾部
如果哈希表里有key1,因为能顺到key1的位置,程序看到了key1 就直接把值付给这个节点里的value了