HashMap的get方法大致流程

1. 根據key的hashcode找出key的位置,如果Map數組中該位置上的節點爲空,返回null

2. 如果Map數組中該位置上的節點非空

1. 該位置節點,也就是首節點正是要查找的節點,則返回該首節點

2. 如果要查找的key與首節點的key不相同,

1. 如果位置節點是紅黑樹,則在紅黑樹中查詢key,找到返回對應的節點,找不到返回null

2. 如果該位置節點是鏈表,則在鏈表中遍歷查詢,找到返回對應的節點,找不到返回null

final Node getNode(int hash, Object key) { Node[] tab; Node first, e; int n; K k; //如果HashMap的節點數組非空,根據key的hash值&(n-1)位與運算,找到數組中的位置,這個位置上的節點可以看做是首節點(想想數組+鏈表結構中,數組中的節點就是這個鏈表的首節點),同時判斷該首節點是否爲空,如果爲空,則說明key值在HashMap中不存在,返回null if ((tab = table) != null && (n = tab.length) > 0 && (first = tab[(n - 1) & hash]) != null) { //首節點非空,要查詢的key的hashcode值與首節點的hash值相等,同時key值與首節點的key值相等,說明該首節點就是想要的節點,則返回該首節點 if (first.hash == hash && // always check first node ((k = first.key) == key || (key != null && key.equals(k)))) return first; //如果要查詢的key的hashcode值與首節點的hash值相等,但是key值不相等則遍歷該數組位置的鏈表或者紅黑樹 //注意這裏有個隱含的條件,就是在HashMap執行put操作時,key的hashcode相同的鍵值對,會放在HashMap數組的同一個位置,這些key的hashcode相同的鍵值對會在這個位置組成一個鏈表結構或者紅黑樹結構 if ((e = first.next) != null) { //如果該位置的數據結構是一個紅黑樹,則從紅黑樹中查詢想要的節點,有則返回,無則返回null if (first instanceof TreeNode) return ((TreeNode)first).getTreeNode(hash, key); //如果該位置的數據結構是一個鏈表,遍歷節點,找到key值相同的節點返回,找不到返回null do { if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } while ((e = e.next) != null); } } return null; }

查看原文 >>
相關文章