1. 程式人生 > >HashMap中get(Object key)方法實現

HashMap中get(Object key)方法實現

  jdk1.8
  HashMap.java中獲取指定關鍵字對應的值value方法get(Object key)
 
 /* 返回指定關鍵字的值value,沒有則返回null
     */
    public V get(Object key) {
        Node<K,V> e;
        return (e = getNode(hash(key), key)) == null ? null : e.value;
    }

    /**
     * 實現Map.get()及其相關方法
     * @param hash hash for key
     * @param key the key
     * @return the node, or null if none
     */
    final Node<K,V> getNode(int hash, Object key) {
        Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
        if ((tab = table) != null && (n = tab.length) > 0 &&
            (first = tab[(n - 1) & hash]) != null) {
            if (first.hash == hash &&                         // 始終檢查第一個結點
                ((k = first.key) == key || (key != null && key.equals(k))))
                return first;
            if ((e = first.next) != null) {
                if (first instanceof TreeNode)
                    return ((TreeNode<K,V>)first).getTreeNode(hash, key);
                do {
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        return e;
                } while ((e = e.next) != null);
            }
        }
        return null;
    }
   
    (n - 1) & hash得到hash槽的索引,獲取該槽內的第一個Node, 先判斷第一個Node的關鍵字是否符合key,若符合則返回
    如果不符合,繼續判斷此Node是否是TreeNode型別,如果是,按樹遍歷的方式去查詢關鍵字;
        如果不是,按連結串列的方式繼續向下遍歷

    如果沒找到符合的,返回null。

  
    
紅黑樹查詢關鍵字的遍歷方法      

 /**
         * 呼叫樹的find()函式
         */
        final TreeNode<K,V> getTreeNode(int h, Object k) {
            return ((parent != null) ? root() : this).find(h, k, null);
        }
         /**
         * 從根節點p開始查詢指定hash值和關鍵字key的結點
         * 當第一次使用比較器比較關鍵字時,引數kc儲存了關鍵字key的 比較器類別
         */
        final TreeNode<K,V> find(int h, Object k, Class<?> kc) {
            TreeNode<K,V> p = this;
            do {
                int ph, dir; K pk;
                TreeNode<K,V> pl = p.left, pr = p.right, q;
                if ((ph = p.hash) > h)            //如果給定雜湊值小於當前節點的雜湊值,進入左節點
                    p = pl;
                else if (ph < h)                //如果大於,進入右結點
                    p = pr;
                else if ((pk = p.key) == k || (k != null && k.equals(pk)))    //如果雜湊值相等,且關鍵字相等,則返回當前節點
                    return p;
                else if (pl == null)        //如果左節點為空,則進入右結點
                    p = pr;
                else if (pr == null)        //如果右結點為空,則進入左節點
                    p = pl;
                else if ((kc != null ||
                          (kc = comparableClassFor(k)) != null) &&
                         (dir = compareComparables(kc, k, pk)) != 0)        //如果不按雜湊值排序,而是按照比較器排序,則通過比較器返回值決定進入左右結點
                    p = (dir < 0) ? pl : pr;
                else if ((q = pr.find(h, k, kc)) != null)        //如果在右結點中找到該關鍵字,直接返回
                    return q;
                else
                    p = pl;                                //進入左節點
            } while (p != null);
            return null;
        }
    




相關推薦

HashMapget(Object key)方法實現

  jdk1.8   HashMap.java中獲取指定關鍵字對應的值value方法get(Object key)   /* 返回指定關鍵字的值value,沒有則返回null */

java實現HashMap的按照key的字典順序排序輸出

      public String sign1(Map params){   JSONObject     reqObj = JSONObject.fromObject(params);   JS

hibernate架構之sessionget與load方法的區別

r.java one 升級版 數據庫 apache appenders 進行 方法 main hibernate是一個用於連接數據庫的升級版JDBC,與一般JDBC不同的是,hibernate架構是通過hql進行查找,通過session建立連接。其工作原理是:將實例分為瞬時

servlet表單get和post方法的區別

pos span 轉化 不可見 上傳文件 post div font 支持 Form中的get和post方法,在數據傳輸過程中分別對應了HTTP協議中的GET和POST方法。二者主要區別如下:1、Get是用來從服務器上獲得數據,而Post是用來向服務器上傳遞數據。2、Get

詳解JavaObject.getClass()方法

詳解Java中的Object.getClass()方法   詳解Object.getClass()方法,這個方法的返回值是Class型別,Class c = obj.getClass(); 通過物件c,我們可以獲取該物件的所有成員方法,每個成員方法都是一個Method物件;我們也可以獲取該物件的

Spring在web應用獲得Bean的方法 實現getBean方法

1.新建類,並實現 org.springframework.context.ApplicationContextAware 介面. package com.abc.framework.util; import org.springframework.beans.BeansExc

HTTPGET和POST方法的區別

HTTP請求的方法有很多:GET、POST、HEAD、TRACE、OPTIONS等,但是GET和POST是兩個最常用的方法。 GET是最簡單的一種請求方法,其主要功能是從伺服器端獲取使用者所需資源,並將其作為響應返回給客戶端,需要注意的是:GET方法的作用主要用來獲取伺

Python幾種常見方法實現斐波那契數列

Python常見斐波那契解決方案 n=35 #1.遞迴求斐波那契 def fibo(n): return 1 if n<3 else fibo(n-1)+fibo(n-2) print(fibo(n)) #2.迴圈求斐波那契 f1,f2=0,1 for i

Hibernateget和load方法的區別

load方法可返回沒有載入實體資料的代理類例項,而get方法永遠返回有實體資料的物件。(對於load和get方法返回型別:好多書中都說:“get方法永遠只返回實體類”,實際上並不正確,get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被代理過的,如被load方法使用過,或者被其他

Hibernateget()和load()方法的區別

在hibernate中我們知道如果要從資料庫中得到一個物件,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得一個實體物件時是有區別的,在查詢效能上兩者是不同的。 一.load載入方式 當使用l

關於List,ArrayListremove(object obj)方法不能刪除物件問題

先看下面程式碼,大家猜猜列印的結果是什麼?為什麼? packageshiyan; importjava.util.ArrayList; importjava.util.List; publ

有關Java實體類get、set方法和有參無參構造方法的個人見解。

結論:(總的來說,get和set方法就是為了能以得到和設定實體類中的私有屬性值,而一個類中至少要有一個構造方法,當沒有人為新增的時候,編譯器會自動加入一個隱式的無參構造方法,當有人為新增時,編譯器就不會自動添加了。無參構造方法的作用是為了比較方便的new出一個物

Hibernateget和load方法

get方法和find方法都是直接從資料庫中檢索,而load方法的執行則比較複雜。首先查詢session的persistent Context中是否有快取,如果有則直接返回如果沒有則判斷是否是lazy,如果不是直接訪問資料庫檢索,查到記錄返回,查不到丟擲異常;如果是lazy則需要建立代理物件,物件的initia

http協議get與post方法header的區別

HTTP(HyperTextTransferProtocol)即超文字傳輸協議,目前網頁傳輸的的通用協議。HTTP協議採用了請求/響應模型,瀏覽器或其他客戶端發出請求,伺服器給與響應。就整個網路資源傳輸而言,包括message-header和message-body兩部

在Android如何使用clipPath()方法實現簡單的裁剪圓形圖片

裁剪圓形圖片的方式有很多,這篇文章主要為大家介紹如何使用clipPath()方法裁剪圓形圖片。 首先,我們先看效果圖: 裁剪前: 裁剪後: 接下來,我們來一步一步的實現。 1.新建一個

ViewPager新增Fragment的方法實現

有時候我們在使用ViewPager的時候可以向裡面加入一個自定義的view,也可以加入一個Fragment,那如何加入Fragement 建立一個Viewpager的介面卡,然後需要繼承FragementPagerAdapter類,在該類中,需要建立一個構造方法,實現ge

HashMap紅黑樹操作實現

// 紅黑樹操作方法實現, 從CLR引入 static <K,V> TreeNode<K,V> rotateLeft(TreeNode<K,V> root,

在類定義抽象方法,同時在子類通過重寫的方法實現該抽象方法

建立抽象類: package my; abstract class Fruit { public String color; public Fruit(){ color="綠色"; } public abstract voi

http協議get和post方法的優點和缺點

在資料傳輸過程中分別對應了HTTP協議中的GET和POST方法。二者主要區別如下: 1、Get是用來從伺服器上獲得資料,而Post是用來向伺服器上傳遞資料。 2、Get將表單中資料的按照variable=value的形式,新增到action所指向的URL後面,並且兩者使用“?”連線,而各個變數之間使用 “&a

JSPget和post方法的區別

1、post提交資料是隱式的,get是通過在url裡面傳遞的(可以看一下你瀏覽器的位址列),用來傳遞一些不需要保密的資料。 2、用get時,傳輸資料的大小有限制 (注意不是引數的個數有限制),為2K;而post沒有此限制。 3、還有用GET的時候在SERVLET中要用DO