最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java源碼解析之超級接口Map

 更新時(shí)間:2021年05月19日 09:54:05   作者:不會(huì)編程的派大星  
今天給各位小伙伴介紹一下超級接口Map,文中對接口Map講的非常詳細(xì),對正在學(xué)習(xí)java的小伙伴們有很好的幫助喲,需要的朋友可以參考下

前言

我們在前面說到的無論是鏈表還是數(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)一步提升了。

今天我們來說一說超級接口Map。

一、接口Map

Map是基于Key-Value的數(shù)據(jù)格式,并且key值不能重復(fù),每個(gè)key對應(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對)。接口中有g(shù)etKey(),getValue方法。

// 獲取對應(yīng)的key
K getKey();

// 獲取對應(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獲取對應(yīng)的value值
V get(Object key);

// 存入key-value
V put(K key, V value);

// 移除一個(gè)key-value對
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對到Set中
Set<Map.Entry<K, V>> entrySet();

// 希望我們實(shí)現(xiàn)equals和hashCode
boolean equals(Object o);
int hashCode();

四、超級實(shí)現(xiàn)類AbstractMap

對應(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源碼解析之超級接口Map的文章就介紹到這了,更多相關(guān)Java超級接口Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中獲取Class對象的3種方式代碼示例

    Java中獲取Class對象的3種方式代碼示例

    Class對象是反射的核心,通過他可以調(diào)用類的任意方法,下面這篇文章主要給大家介紹了關(guān)于Java中獲取Class對象的3種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • java 工廠模式的實(shí)例詳解

    java 工廠模式的實(shí)例詳解

    這篇文章主要介紹了java 工廠模式的實(shí)例詳解的相關(guān)資料,這里舉例說明該如何實(shí)現(xiàn)工廠模式,需要的朋友可以參考下
    2017-09-09
  • Java操作IO對象流進(jìn)行數(shù)據(jù)的讀寫

    Java操作IO對象流進(jìn)行數(shù)據(jù)的讀寫

    這篇文章主要介紹了Java操作IO對象流進(jìn)行數(shù)據(jù)的讀寫,本文通過例子逐步介紹了java如何操作IO流,和文字解析,需要的朋友可以參考下
    2021-07-07
  • spring boot如何加入mail郵件支持

    spring boot如何加入mail郵件支持

    這篇文章主要介紹了spring boot如何加入mail郵件支持,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 修改jar包package目錄結(jié)構(gòu)操作方法

    修改jar包package目錄結(jié)構(gòu)操作方法

    這篇文章主要介紹了修改jar包package目錄結(jié)構(gòu)操作方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • Java接口和抽象類用法實(shí)例總結(jié)

    Java接口和抽象類用法實(shí)例總結(jié)

    這篇文章主要介紹了Java接口和抽象類用法,結(jié)合實(shí)例形式總結(jié)分析了Java接口與抽象類的具體定義、使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2015-12-12
  • 基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問題及解決

    基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問題及解決

    這篇文章主要介紹了基于java.lang.IllegalArgumentException異常報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • springboot如何添加task任務(wù)執(zhí)行隊(duì)列

    springboot如何添加task任務(wù)執(zhí)行隊(duì)列

    這篇文章主要介紹了springboot如何添加task任務(wù)執(zhí)行隊(duì)列問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java設(shè)計(jì)模式之橋接模式詳解(Bridge Pattern)

    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á)式,看這篇絕對夠

    java8中的lambda表達(dá)式,看這篇絕對夠

    這篇文章主要介紹了java8中的lambda表達(dá)式,看這篇絕對夠!具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

澎湖县| 新竹县| 维西| 石渠县| 琼中| 通州区| 盘锦市| 盘锦市| 会同县| 金华市| 绥棱县| 石景山区| 仲巴县| 纳雍县| 锦州市| 泸水县| 密山市| 临朐县| 腾冲县| 栖霞市| 桑植县| 拜城县| 元朗区| 泊头市| 浮山县| 娄烦县| 泰和县| 桐乡市| 丰镇市| 马龙县| 汶川县| 乐陵市| 阜宁县| 霍城县| 鄂托克旗| 通渭县| 叙永县| 平顶山市| 鹤峰县| 汽车| 桑日县|