亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

[Java] 淺析Google Guava Multimap

yiliang / 3348人閱讀

摘要:類關(guān)系實(shí)現(xiàn)方法是以為的特定實(shí)現(xiàn),這個(gè)類中沒有太多的實(shí)際代碼,主要是方法中特定的產(chǎn)生一個(gè)作為。是的一個(gè)專有版本,這個(gè)類和接口一起,將的方法都重寫為。則是所有以為核心的的基本實(shí)現(xiàn),這里實(shí)現(xiàn)了所有的方法,是最重要的一部分。

類關(guān)系

ArrayListMultiMap.java

Multimap 
|
|
AbstractMultimap                   Serializable     
|__________________________________________|
|
AbstractMapBasedMultimap   
|
|
AbstractListMultimap               ListMultimap 
|__________________________________________|
|
ArrayListMultiMap

LinkedListMultiMap.java

Multimap 
|
|
AbstractMultimap               ListMultimap                  Serializable 
|__________________________________________|______________________________|
|
LinkedListMultimap

TreeMultimap.java

Multimap 
|
|
AbstractMultimap                   Serializable     
|__________________________________________|
|
AbstractMapBasedMultimap           SetMultimap     
|__________________________________________|
|
AbstractSetMultimap               SortedSetMultimap 
|__________________________________________|
|
AbstractSortedSetMultimap  
|
|
AbstractSortedKeySortedSetMultimap 
|
|
TreeMultimap
實(shí)現(xiàn)方法 ArrayListMultimap

ArrayListMultiMap.java是以ArrayList為Collection的特定實(shí)現(xiàn),這個(gè)類中沒有太多的實(shí)際代碼,主要是createCollection()方法中特定的產(chǎn)生一個(gè)ArrayList作為Collection。

AbstractListMultimap.java是AbstractMultimap的一個(gè)List專有版本,這個(gè)類和ListMultimap接口一起,將Multimap的方法都重寫為L(zhǎng)ist。

AbstractMapBasedMultimap.java則是所有以Map為核心的Multimap的基本實(shí)現(xiàn),這里實(shí)現(xiàn)了所有Multimap的方法,是最重要的一部分。

clear方法,先將每個(gè)collection清空,再把map清空

public void clear() {
    // Clear each collection, to make previously returned collections empty.
    for (Collection collection : map.values()) {
      collection.clear();
    }
    map.clear();
    totalSize = 0;
}

put方法,我們可以發(fā)現(xiàn)這里的size是每多一個(gè)KV對(duì)就加1,而不是唯一Key的數(shù)量,這點(diǎn)和Map不同

public boolean put(@Nullable K key, @Nullable V value) {
    Collection collection = map.get(key);
    // 如果這是一個(gè)新key沒有對(duì)應(yīng)的Collection
    if (collection == null) {
      // 先根據(jù)子類實(shí)現(xiàn)創(chuàng)建一個(gè)相應(yīng)的Collection
      collection = createCollection(key);
      // 將KV對(duì)加入Map中
      if (collection.add(value)) {
        totalSize++;
        map.put(key, collection);
        return true;
      } else {
        throw new AssertionError("New Collection violated the Collection spec");
      }
    // 如果已經(jīng)有這個(gè)key了,就加入它的Collection
    } else if (collection.add(value)) {
      totalSize++;
      return true;
    } else {
      return false;
    }
}

removeAll方法,需要返回刪除的Value,所以要一個(gè)臨時(shí)變量存起來

public Collection removeAll(@Nullable Object key) {
    // 先將Key移出
    Collection collection = map.remove(key);
    // 如果Value為空,則返回空集合
    if (collection == null) {
      return createUnmodifiableEmptyCollection();
    }
    // 否則將Value的值拷貝到輸出集合中,再把Value清空
    Collection output = createCollection();
    output.addAll(collection);
    totalSize -= collection.size();
    collection.clear();
    // 返回輸出集合
    return unmodifiableCollectionSubclass(output);
}

size方法,注意這里返回的是KV數(shù),而非K的唯一個(gè)數(shù)

public int size() {
    return totalSize;
}

isEmpty方法,判斷KV數(shù)是否為0

public boolean isEmpty() {
    return size() == 0;
}

get方法

public Collection get(@Nullable K key) {
    Collection collection = map.get(key);
    // 如果沒有Value就新建一個(gè)Collection
    if (collection == null) {
      collection = createCollection(key);
    }
    return wrapCollection(key, collection);
}    

AbstractMultimap.java也實(shí)現(xiàn)了一些基本方法,和上一個(gè)文件一起涵蓋了所有API

remove方法

public boolean remove(@Nullable Object key, @Nullable Object value) {
    // 從Map中按照key找到該集合
    Collection collection = asMap().get(key);
    // 如果集合不為空,則找到集合中的這個(gè)值并刪除
    return collection != null && collection.remove(value);
}

putAll方法,以key為第一參數(shù),以一個(gè)Iterable為第二參數(shù)

public boolean putAll(@Nullable K key, Iterable values) {
    checkNotNull(values);
    // make sure we only call values.iterator() once
    // and we only call get(key) if values is nonempty
    if (values instanceof Collection) {
      Collection valueCollection = (Collection) values;
      // 拿出Collection然后把新的addAll進(jìn)去
      return !valueCollection.isEmpty() && get(key).addAll(valueCollection);
    } else {
      Iterator valueItr = values.iterator();
      // 拿出Iterator然后把新的addAll進(jìn)去
      return valueItr.hasNext() && Iterators.addAll(get(key), valueItr);
    }
}

putAll方法,以另一個(gè)Multimap為參數(shù)

public boolean putAll(Multimap multimap) {
    boolean changed = false;
    for (Map.Entry entry : multimap.entries()) {
      changed |= put(entry.getKey(), entry.getValue());
    }
    return changed;
}

replace方法

public Collection replaceValues(@Nullable K key, Iterable values) {
    checkNotNull(values);
    // 先移除所有
    Collection result = removeAll(key);
    // 在加入新的值
    putAll(key, values);
    return result;
}

containsValue方法

public boolean containsValue(@Nullable Object value) {
    // 檢查每一個(gè)Collection是否有這個(gè)值
    for (Collection collection : asMap().values()) {
      if (collection.contains(value)) {
        return true;
      }
    }
    return false;
}

containsEntry方法,實(shí)際上是用get來判斷是否有這個(gè)key,然后再看是否有這個(gè)值

public boolean containsEntry(@Nullable Object key, @Nullable Object value) {
    Collection collection = asMap().get(key);
    return collection != null && collection.contains(value);
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64679.html

相關(guān)文章

  • 淺析guava容器multimap

    摘要:它主要做了件事初始化容器,并將元素添加到容器里維護(hù)這樣我們?cè)僬{(diào)用的方法直接就返回了,不需要再次遍歷和統(tǒng)計(jì)的過程。維護(hù)實(shí)時(shí)的維護(hù),及時(shí)刪除總結(jié)整體上是對(duì)底層的二次封裝,很好的處理了各種細(xì)節(jié),比如子容器的判空處理,的計(jì)算效率,的維護(hù)等。 在日常開發(fā)中我們通常有需要對(duì) List 容器進(jìn)行分組的情況,比如對(duì)下面的list數(shù)據(jù)根據(jù)name字段來進(jìn)行分組: [ { date...

    yy13818512006 評(píng)論0 收藏0
  • 近幾個(gè)月Github上最熱門的Java項(xiàng)目一覽

    摘要:今天逛了逛,順手精選出了一下近幾個(gè)月以來上最熱門的個(gè)項(xiàng)目。相關(guān)閱讀正式開源,幫助應(yīng)用快速容器化未來可能會(huì)上熱門的項(xiàng)目地址介紹哈哈,皮一下很開心。這是我自己開源的一份文檔,目前仍在完善中,歡迎各位英雄好漢一起完善。 showImg(https://segmentfault.com/img/remote/1460000015766827?w=391&h=220);今天逛了逛Github,順...

    cyqian 評(píng)論0 收藏0
  • 推薦10個(gè)Java方向最熱門的開源項(xiàng)目(8月)

    摘要:設(shè)計(jì)模式可以通過提供經(jīng)過驗(yàn)證的經(jīng)過驗(yàn)證的開發(fā)范例來加速開發(fā)過程。將流程作為突破點(diǎn),并在多個(gè)領(lǐng)域工作,包括流量控制,并發(fā),斷路和負(fù)載保護(hù),以保護(hù)服務(wù)穩(wěn)定性。 1. JCSprout(Java核心知識(shí)庫) Github地址: https://github.com/crossoverJie/JCSprout star: 12k 介紹: 處于萌芽階段的 Java 核心知識(shí)庫。 2....

    wushuiyong 評(píng)論0 收藏0
  • eclipse collections入門

    摘要:配合一下方法使用類似的方法,用于提取一個(gè)里頭的一個(gè)屬性出來。當(dāng)然,也可以簡(jiǎn)寫為主要用來過濾集合。配合使用功能與相同,只是把該篩選條件內(nèi)置在中然后這里直接使用,傳入?yún)?shù)與功能相反集合分區(qū)只取出一個(gè)符合條件的計(jì)數(shù)與條件滿足判斷其他轉(zhuǎn)參考 Function 配合一下方法使用: collect flatCollect groupBy minBy maxBy toSortedListBy so...

    LeexMuller 評(píng)論0 收藏0
  • Guava 源碼分析(Cache 原理)

    摘要:緩存本次主要討論緩存。清除數(shù)據(jù)時(shí)的回調(diào)通知。具體不在本次的討論范圍。應(yīng)該是以下原因新起線程需要資源消耗。維護(hù)過期數(shù)據(jù)還要獲取額外的鎖,增加了消耗。 showImg(https://segmentfault.com/img/remote/1460000015272232); 前言 Google 出的 Guava 是 Java 核心增強(qiáng)的庫,應(yīng)用非常廣泛。 我平時(shí)用的也挺頻繁,這次就借助日...

    wangxinarhat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<