HashMap中get(Object key)方法實現
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; }
相關推薦
HashMap中get(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架構之session中get與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
詳解Java中的Object.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
HTTP中GET和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
Hibernate中get和load方法的區別
load方法可返回沒有載入實體資料的代理類例項,而get方法永遠返回有實體資料的物件。(對於load和get方法返回型別:好多書中都說:“get方法永遠只返回實體類”,實際上並不正確,get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被代理過的,如被load方法使用過,或者被其他
Hibernate中get()和load()方法的區別
在hibernate中我們知道如果要從資料庫中得到一個物件,通常有兩種方式,一種是通過session.get()方法,另一種就是通過session.load()方法,然後其實這兩種方法在獲得一個實體物件時是有區別的,在查詢效能上兩者是不同的。 一.load載入方式 當使用l
關於List,ArrayList中remove(object obj)方法不能刪除物件問題
先看下面程式碼,大家猜猜列印的結果是什麼?為什麼? packageshiyan; importjava.util.ArrayList; importjava.util.List; publ
有關Java實體類中get、set方法和有參無參構造方法的個人見解。
結論:(總的來說,get和set方法就是為了能以得到和設定實體類中的私有屬性值,而一個類中至少要有一個構造方法,當沒有人為新增的時候,編譯器會自動加入一個隱式的無參構造方法,當有人為新增時,編譯器就不會自動添加了。無參構造方法的作用是為了比較方便的new出一個物
Hibernate中get和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
JSP中get和post方法的區別
1、post提交資料是隱式的,get是通過在url裡面傳遞的(可以看一下你瀏覽器的位址列),用來傳遞一些不需要保密的資料。 2、用get時,傳輸資料的大小有限制 (注意不是引數的個數有限制),為2K;而post沒有此限制。 3、還有用GET的時候在SERVLET中要用DO