GSON原始碼LinkedTreeMap學習

2022-07-25 03:51:08 字數 2182 閱讀 9177

在學習gson的過程中,發現了gson的基礎資料型別linkedtreemap,因此展開學習。

private final linkedtreemapmembers =

new linkedtreemap();

linkedtreemap,一切如此的熟悉,在jdk中有linkedmap有treemap有treemap,這個linkedtreemap是個什麼,顧名思義,這應該是乙個連續的且有序的集合。

package com.google.gson.internal;

一看包名,這是google自己實現的map。

nodeparent;

nodeleft;

noderight;

nodenext;

nodeprev;

final k key;

v value;

int height;

咋一看,這是啥啊。乙個結點包含了父節點,左右結點和前後結點,但是不要慌我們接著往下看。

接著回到linkedtreemap,在類的最開時定義了乙個比較器natural_order

private static final comparatornatural_order = new comparator() 

};

這個比較器在構造linkhashmap時傳入,如果傳入的比較器是空(該類沒有實現comparator)則使用natural_order比較器進行比較,此處略微介紹comparator和comparable的區別,實現comparable 介面的類即支援排序(因為實現了compareto)方法,而如果乙個類不支援排序(沒有實現compareable介面)則可以使用comparator比較器來實現比較方法。

為什麼要先介紹這個比較器呢,因為在linktreemap進行新增結點和查詢結點都需要使用到這個比較器,在find()方法裡,首先判斷根節點是否為空。

nodefind(k key, boolean create) 

// if it exists, the key is in a subtree. go deeper.

nodechild = (comparison < 0) ? nearest.left : nearest.right;

if (child == null)

nearest = child;

}

在這迴圈中根據返回值判斷要尋找的結點可能存在的位置,當值比比較的結點小時在他的左子樹上繼續查詢,反之查詢右子樹直到找到或者當前物件為空。

緊接著,如果create為false則結束find方法,此時nearest就是要查詢的值或者根節點。

如果create為true則建立結點,且nearest為null,nearest為null只有一種情況:當前樹是乙個空樹

created = new node(nearest, key, header, header.prev);

root = created;

new node幹的事

/** create a regular entry */

node(nodeparent, k key, nodenext, nodeprev)

當樹不是空樹時則根據最後一次比較的結果進行插入。

else  else 

rebalance(nearest, true);

}

進行調整。

private void rebalance(nodeunbalanced, boolean insert)  else 

if (insert)

}

當左節點比右結點低2時,儲存右左結點,右右結點,右左結點高度,右右結點高度,並計算高度差。當高度等於1或等於0時進行左旋。當高度差為1是進行右結點右旋,根節點左旋。

當右節點比左結點低2時,反之。

當高度差為0時,修改節點高度。

else if (delta == 0) 

}

當左右節點差為1時,設定高度為左右結點高度更高者加一。以高度差作為約束,約束左右結點高度差不高於2,當等於2時根據左右高度差進行旋轉,最終的儲存結構是乙個有插入順序的鍊錶和排序二叉樹

基於Android的Gson原始碼閱讀心得

compile com.google.code.gson gson 2.7 3 建立子執行緒 讀取json檔案,並採用gson庫中的介面,對其進行解析 4 在ui 主線程中採用handle獲取解析的資料進行展示 5 原始碼說明 使用接觸最多的就是gson和gsonbuilder類。其中,gsonbu...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...