上篇文章我們介紹了HashMap集合,這是一個(gè)鍵值對(duì)集合,可以高效的按照鍵查找數(shù)值。但是它有一個(gè)缺陷:數(shù)據(jù)如果是無(wú)序的可以是很高效的,但是如果數(shù)據(jù)需要排列有順序就不適合了。本篇將要介紹的一個(gè)集合是樹(shù)集鍵值對(duì)(TreeMap),它能夠?qū)?shù)據(jù)按照鍵值有序的存儲(chǔ)。
在介紹TreeMap之前,我們來(lái)了解一種數(shù)據(jù)結(jié)構(gòu):排序二叉樹(shù)。相信學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)的同學(xué)知道,這種結(jié)構(gòu)的數(shù)據(jù)存儲(chǔ)形式在查找的時(shí)候效率非常高。
如圖所示,這種數(shù)據(jù)結(jié)構(gòu)是以二叉樹(shù)為基礎(chǔ)的,所有的左孩子的value值都是小于根結(jié)點(diǎn)的value值的,所有右孩子的value值都是大于根結(jié)點(diǎn)的。這樣做的好處在于:如果需要按照鍵值查找數(shù)據(jù)元素,只要比較當(dāng)前結(jié)點(diǎn)的value值即可(小于當(dāng)前結(jié)點(diǎn)value值的,往左走,否則往右走),這種方式,每次可以減少一半的操作,所以效率比較高。在實(shí)現(xiàn)我們的TreeMap中,使用的是紅黑樹(shù)(一種優(yōu)化了的二叉排序樹(shù))。
一、TreeMap的超接口
TreeMap主要繼承了類AbstractMap(一個(gè)對(duì)Map接口的實(shí)現(xiàn)類)和 NavigableMap(主要提供了對(duì)TreeMap的一些高級(jí)操作例如:返回第一個(gè)鍵或者返回小于某個(gè)鍵的視圖等)。主要的一些操作有:put添加元素到集合中,remove根據(jù)鍵值或者value刪除指定元素,get根據(jù)指定鍵值獲取某個(gè)元素,containsValue查看是否包含某個(gè)指定的值,containsKey 查看是否包含某個(gè)指定的key數(shù)值等。
二、構(gòu)造函數(shù)
TreeMap 的構(gòu)造函數(shù)主要有以下幾種:
private final Comparator<? super K> comparator;
public TreeMap() {comparator = null;}
public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator;
}