hashmap不保證資料有序,linkedhashmap保證資料可以保持插入順序,而如果我們希望map可以保持key的大小順序的時候,我們就需要利用treemap了。
treemaptmap =
new
treemap();
tmap.put(
1
,
"語文"
);
tmap.put(
3
,
"英語"
);
tmap.put(
2
,
"數學"
);
tmap.put(
4
,
"政治"
);
tmap.put(
5
,
"歷史"
);
tmap.put(
6
,
"地理"
);
tmap.put(
7
,
"生物"
);
tmap.put(
8
,
"化學"
);
for
(entryentry : tmap.entryset())
其大致的結構如下所示:
使用紅黑樹的好處是能夠使得樹具有不錯的平衡性,這樣操作的速度就可以達到log(n)的水平了。具體紅黑樹的實現不在這裡贅述。
如果存在的話,old value被替換;如果不存在的話,則新添乙個節點,然後對做紅黑樹的平衡操作。
public
v put(k key, v value)
int
cmp;
entryparent;
// split comparator and comparable paths
comparator
super
k> cpr = comparator;
// 如果該節點存在,則替換值直接返回
if
(cpr !=
null
)
while
(t !=
null
);
}
else
while
(t !=
null
);
}
// 如果該節點未存在,則新建
entrye =
new
entry<>(key, value, parent);
if
(cmp <
0
)
parent.left = e;
else
parent.right = e;
// 紅黑樹平衡調整
fixafterinsertion(e);
size++;
modcount++;
return
null
;
}
get函式則相對來說比較簡單,以log(n)的複雜度進行get
final
entrygetentry(object key)
return
null
;
}
public
v get(object key)
treemap是如何保證其迭代輸出是有序的呢?其實從巨集觀上來講,就相當於樹的中序遍歷(ldr)。我們先看一下迭代輸出的步驟
for
(entryentry : tmap.entryset())
根據the enhanced for statement,for語句會做如下轉換為:
for
(iterator> it = tmap.entryset().iterator() ; tmap.hasnext(); )
在it.next()的呼叫中會使用nextentry呼叫successor
這個是過的後繼的重點,具體實現如下:
static
treemap.entrysuccessor(entryt)
else
return
p;
}
}
怎麼理解這個successor呢?只要記住,這個是中序遍歷就好了,l-d-r。具體細節如下:
a. 空節點,沒有後繼b. 有右子樹的節點,後繼就是右子樹的「最左節點」c. 無右子樹的節點,後繼就是該節點所在左子樹的第乙個祖先節點a.好理解,不過b, c,有點像繞口令啊,沒關係,上圖舉個例子就懂了!
有右子樹的節點,節點的下乙個節點,肯定在右子樹中,而右子樹中「最左」的那個節點則是右子樹中最小的乙個,那麼當然是右子樹的「最左節點」,就好像下圖所示:
無右子樹的節點,先找到這個節點所在的左子樹(右圖),那麼這個節點所在的左子樹的父節點(綠色節點),就是下乙個節點。
Java TreeMap的排序效果
treemap預設按照key的大小公升序排列 public class test else list list newarraylist map.entryset for entry e list 結果為 public class test else 根據value來排序,將鍵值對儲存到list,用...
簡述hdfs工作原理 HDFS的工作原理
hdfs 的工作原理 hadoop 分布式檔案系統 hdfs 是一種被設計成適合執行在通用硬體上的分布式檔案系統。hdfs 是乙個高度容錯性的系統,適合部署在廉價的 機器上。它能提供高吞吐量的資料訪問,非常適合大規模資料集上的應用。要理解 hdfs 的內部工作原理,首先要理解什麼是分布式 檔案系統。...
mysql nfs原理 nfs工作原理
nfs其最大功能時可以通過網路讓不同作業系統的計算機可以共享資料,所以也可以將其看作時一台檔案伺服器.nfs有屬於自己的協議與使用的埠號,但是在傳送資料或者其他相關資訊時候,nfs伺服器使用乙個稱i 遠端過程呼叫 rpc 的協議來協助nfs伺服器本身的執行 nfs協議 使用nfs,客戶端可以透明地訪...