Java源碼解析之超級(jí)接口Map
前言
我們?cè)谇懊嬲f到的無論是鏈表還是數(shù)組,都有自己的優(yōu)缺點(diǎn),數(shù)組查詢速度很快而插入很慢,鏈表在插入時(shí)表現(xiàn)優(yōu)秀但查詢無力。哈希表則整合了數(shù)組與鏈表的優(yōu)點(diǎn),能在插入和查找等方面都有不錯(cuò)的速度。我們之后要分析的HashMap就是基于哈希表實(shí)現(xiàn)的,不過在JDK1.8中還引入了紅黑樹,其性能進(jìn)一步提升了。
今天我們來說一說超級(jí)接口Map。
一、接口Map
Map是基于Key-Value的數(shù)據(jù)格式,并且key值不能重復(fù),每個(gè)key對(duì)應(yīng)的value值唯一。Map的key也可以為null,但不可重復(fù)。
在看Map接口的方法前,我們先來看看Map.Entry接口。
二、接口Map.Entry
keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一個(gè)Set集合,此集合的類型為Map.Entry。
Map.Entry是Map聲明的一個(gè)內(nèi)部接口,此接口為泛型,定義為Entry<K,V>。它表示Map中的一個(gè)實(shí)體(一個(gè)key-value對(duì))。接口中有g(shù)etKey(),getValue方法。
// 獲取對(duì)應(yīng)的key
K getKey();
// 獲取對(duì)應(yīng)的value
V getValue();
// 替換原有的value
V setValue(V value);
// 希望我們實(shí)現(xiàn)equals和hashCode
boolean equals(Object o);
int hashCode();
// 從1.8起,還提供了比較的方法,類似的方法共四個(gè)
public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getKey().compareTo(c2.getKey());
}
三、一些重要的方法
// 返回當(dāng)前數(shù)據(jù)個(gè)數(shù) int size(); // 是否為空 boolean isEmpty(); // 判斷是否包含key,這里用到了key的equals方法,所以key必須實(shí)現(xiàn)它 boolean containsKey(Object key); // 判斷是否有key保存的值是value,這也基于equals方法 boolean containsValue(Object value); // 通過key獲取對(duì)應(yīng)的value值 V get(Object key); // 存入key-value V put(K key, V value); // 移除一個(gè)key-value對(duì) V remove(Object key); // 從其他Map添加 void putAll(Map<? extends K, ? extends V> m); // 清空 void clear(); // 返回所有的key至Set集合中,因?yàn)閗ey是不可重的,Set也是不可重的 Set<K> keySet(); // 返回所有的values Collection<V> values(); // 返回key-value對(duì)到Set中 Set<Map.Entry<K, V>> entrySet(); // 希望我們實(shí)現(xiàn)equals和hashCode boolean equals(Object o); int hashCode();
四、超級(jí)實(shí)現(xiàn)類AbstractMap
對(duì)應(yīng)于AbstractCollection,AbstractMap的作用也是類似的,主要是提供一些方法的實(shí)現(xiàn),減少具體實(shí)現(xiàn)類的代碼量,可以方便繼承。下面我們看看它都實(shí)現(xiàn)了哪些方法:
在看方法之前,先來看看定義的兩個(gè)變量吧:
transient Set<K> keySet; transient Collection<V> values;
方法:
// 返回大小,這里大小基于entrySet的大小
public int size() {
return entrySet().size();
}
public boolean isEmpty() {
return size() == 0;
}
//基于entrySet操作
public boolean containsKey(Object key) {
Iterator<Map.Entry<K,V>> i = entrySet().iterator();
if (key==null) {
while (i.hasNext()) {
Entry<K,V> e = i.next();
if (e.getKey()==null)
return true;
}
} else {
while (i.hasNext()) {
Entry<K,V> e = i.next();
if (key.equals(e.getKey()))
return true;
}
}
return false;
}
public boolean containsValue(Object value) {
//...
}
public V get(Object key) {
//...
}
public V remove(Object key) {
//...
}
public void clear() {
entrySet().clear();
}
除此之外,還提供了許多默認(rèn)的實(shí)現(xiàn)方法,我們看其中一個(gè)吧
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new AbstractSet<K>() {
public Iterator<K> iterator() {
return new Iterator<K>() {
private Iterator<Entry<K,V>> i = entrySet().iterator();
public boolean hasNext() {
return i.hasNext();
}
public K next() {
return i.next().getKey();
}
public void remove() {
i.remove();
}
};
}
public int size() {
return AbstractMap.this.size();
}
public boolean isEmpty() {
return AbstractMap.this.isEmpty();
}
public void clear() {
AbstractMap.this.clear();
}
public boolean contains(Object k) {
return AbstractMap.this.containsKey(k);
}
};
keySet = ks;
}
return ks;
}
除了以上的方法外,AbstractMap還實(shí)現(xiàn)了equals、hashCode、toString、clone等方法,這樣在具體實(shí)現(xiàn)時(shí)可以省去很多工作。
到此這篇關(guān)于Java源碼解析之超級(jí)接口Map的文章就介紹到這了,更多相關(guān)Java超級(jí)接口Map內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java操作IO對(duì)象流進(jìn)行數(shù)據(jù)的讀寫
這篇文章主要介紹了Java操作IO對(duì)象流進(jìn)行數(shù)據(jù)的讀寫,本文通過例子逐步介紹了java如何操作IO流,和文字解析,需要的朋友可以參考下2021-07-07
修改jar包package目錄結(jié)構(gòu)操作方法
這篇文章主要介紹了修改jar包package目錄結(jié)構(gòu)操作方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07
基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問題及解決
這篇文章主要介紹了基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
springboot如何添加task任務(wù)執(zhí)行隊(duì)列
這篇文章主要介紹了springboot如何添加task任務(wù)執(zhí)行隊(duì)列問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java設(shè)計(jì)模式之橋接模式詳解(Bridge Pattern)
橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,旨在將抽象部分與其實(shí)現(xiàn)部分分離,從而使兩者可以獨(dú)立地變化,橋接模式通過組合關(guān)系代替繼承關(guān)系,將抽象和實(shí)現(xiàn)解耦,使代碼更具擴(kuò)展性和維護(hù)性2025-02-02
java8中的lambda表達(dá)式,看這篇絕對(duì)夠
這篇文章主要介紹了java8中的lambda表達(dá)式,看這篇絕對(duì)夠!具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

