)e).split(this, newTab, j, oldCap);else { // 采用链表处理冲突Node loHead = null, loTail = null;Node hiHead = null, hiTail = null;Node next;//通过上述讲解的原理来计算节点的新位置do {// 原索引next = e.next;//这里来判断如果等于true e这个节点在resize之后不需要移动位置if ((e.hashelseloTail.next = e;loTail = e;}// 原索引+oldCapelse {if (hiTail == null)hiHead = e;elsehiTail.next = e;hiTail = e;}} while ((e = next) != null);// 原索引放到bucket里if (loTail != null) {loTail.next = null;newTab[j] = loHead;}// 原索引+oldCap放到bucket里if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead;}}}}}return newTab;}4.3.4 删除方法(remove)理解了put方法之后 , remove方法已经没什么难度了 , 所以重复的内容就不再做详细介绍了 。
删除的话就是首先先找到元素的位置 , 如果是链表就遍历链表找到元素之后删除 。 如果是用红黑树就遍历树然后找到之后做删除 , 树小于6的时候要转链表 。
删除remove方法:
//remove方法的具体实现在removeNode方法中 , 所以我们重点看下removeNode方法public V remove(Object key) {Node e;return (e = removeNode(hash(key), key, null, false, true)) == null ?null : e.value;}removeNode方法:
final Node removeNode(int hash, Object key, Object value,boolean matchValue, boolean movable) {Node[] tab; Node p; int n, index;//根据hash找到位置//如果当前key映射到的桶不为空if ((tab = table) != nullK k; V v;//如果桶上的节点就是要找的key , 则将node指向该节点if (p.hash == hashelse if ((e = p.next) != null) {//说明节点存在下一个节点if (p instanceof TreeNode)//说明是以红黑树来处理的冲突 , 则获取红黑树要删除的节点node = ((TreeNode)p).getTreeNode(hash, key);else {//判断是否以链表方式处理hash冲突 , 是的话则通过遍历链表来寻找要删除的节点do {if (e.hash == hashbreak;}p = e;} while ((e = e.next) != null);}}//比较找到的key的value和要删除的是否匹配if (node != nullelse if (node == p)//链表删除tab[index] = node.next;elsep.next = node.next;//记录修改次数++modCount;//变动的数量--size;afterNodeRemoval(node);return node;}}return null;}4.3.5查找元素方法(get)查找方法 , 通过元素的Key找到Value 。
代码如下:
public V get(Object key) {Node e;return (e = getNode(hash(key), key)) == null ? null : e.value;}get方法主要调用的是getNode方法 , 代码如下:
final Node getNode(int hash, Object key) {Node[] tab; Node first, e; int n; K k;//如果哈希表不为空并且key对应的桶上不为空if ((tab = table) != null// 如果不是第一个元素 , 判断是否有后续节点if ((e = first.next) != null) {// 判断是否是红黑树 , 是的话调用红黑树中的getTreeNode方法获取节点if (first instanceof TreeNode)return ((TreeNode)first).getTreeNode(hash, key);do {// 不是红黑树的话 , 那就是链表结构了 , 通过循环的方法判断链表中是否存在该keyif (e.hash == hash} while ((e = e.next) != null);}}return null;}小结:
1.get方法实现的步骤:
1)通过hash值获取该key映射到的桶
2)桶上的key就是要查找的key,则直接找到并返回
3)桶上的key不是要找的key,则查看后续的节点:
a:如果后续节点是红黑树节点 , 通过调用红黑树的方法根据key获取value
推荐阅读
-
经营单位食品原料存储不符要求、消毒设施不能正常使用|24家西式快餐经营单位外卖下线
-
人工岛|459公顷!中国恐添“新省份”?多国眼红纷纷阻止:求共享
-
-
思思星座谈|藕断丝连,旧爱回归,这四大星座一往情深,直到永远,在7月上旬
-
-
九驾旧闻|姐味十足,放话不爱作妖不代表不会作妖,40岁董璇发文怼营销号
-
兵哥有话说美国撤出“爱国者”导弹,伊朗却暗自笑了!,沙特要玩完
-
美搭刊|今年这条“初恋裙”火了!清纯性感知性任你挑,18—40岁都可以穿
-
规定|贵州银行黔东南分行被罚30万元 因以票吸存等违法行为
-
-
上游新闻|澳大利亚水域鲨鱼袭击事件频发:男子用拳头猛击鲨鱼救下被咬住的妻子
-
『浮生已半世』口碑不错, 最后一款动力强悍还省油!,国内公认质量最好的4款SUV,
-
-
-
鸡胸肉|海清梳“大光明”穿香奈儿巨好看,撞脸金瑞亨,颜值被耽误太久了
-
段奕宏|“戏妖”段奕宏:不消耗人设不靠流量,撕开内娱多少明星的遮羞布
-
语文课|来剧场吃饭、上课、玩游戏 《黄粱一梦》《语文课》东艺跨年上演
-
-
价格|库存偏紧厂家将择时启动新一轮涨价潮 钛白粉概念股持续大涨
-
丽娜聊旅游哦|时速350公里,带动沿线城市发展,湖北将迎来一条新高铁