Guava原始碼解析十二 Multiset原始碼解析

2021-09-05 10:35:48 字數 2553 閱讀 4959

對於multiset集合可以儲存重複的值,他的強大之處是他的同乙個值個數統計功能。實現類為hashmulitset類,他的繼承關係圖為:

從multiset介面開始分析原始碼:

public inte***ce multisetextends collection

}

對於multiset的介面中方法的實現在abstractmapbasedmultiset抽象類中,下面針對abstractmapbasedmultiset類的儲存資料結構。add、remove、count和迭代器的實現進行分析

private transient mapbackingmap;

可以看到他的實際儲存結構為乙個map,key為儲存元素,count型別儲存是key這個元素的個數,看一下count原始碼:

final class count implements serializable

//獲取當前個數

public int get()

//加上指定個數,先加在返回加完後的值

public int getandadd(int delta)

//加上指定個數,先返回,在進行想加

public int addandget(int delta)

//直接設定當前個數

public void set(int newvalue)

//先設定新的值在返回這個值大小

public int getandset(int newvalue)

public int hashcode()

public boolean equals(@nullable object obj)

public string tostring()

}

protected abstractmapbasedmultiset(mapbackingmap)
public int add(@nullable e element, int occurrences)  else );

//根據想要插入的元素在map中找到count

count frequency = (count)this.backingmap.get(element);

int oldcount;

//如果key所對應的count為null

if(frequency == null) else );

//為key所對應的count新增occurrences個

frequency.getandadd(occurrences);

}//將當前的size加上occurrences

this.size += (long)occurrences;

//返回原來資料

return oldcount;}}

public int remove(@nullable object element, int occurrences)  else );

//根據要刪除的值作為key獲取到他的count

count frequency = (count)this.backingmap.get(element);

//如果對應的count為null,則返回0

if(frequency == null) else else

//設定這個元素對應的count

frequency.addandget(-numberremoved);

this.size -= (long)numberremoved;

return oldcount;}}

}

public int count(@nullable object element)
public iteratoriterator()
可以看到multiset中有乙個實現了iterator介面的類:

private class mapbasedmultisetiterator implements iterator

//根據當前迭代器判斷是否還有元素

public boolean hasnext()

public e next()

//因為是獲取乙個元素,所以減去這乙個

--this.occurrencesleft;

this.canremove = true;

return this.currententry.getkey();

}public void remove() else

abstractmapbasedmultiset.access$110(abstractmapbasedmultiset.this);

this.canremove = false;}}

}

這個迭代器的好處是,儲存多個相同的值,不會占用多個地方,只會占用1個位置。

Guava原始碼閱讀 Strings

靜態實用方法,屬於string或者charsequence例項。nulltoempty public static string nulltoempty nullabledecl string string 返回字串非null,返回原字串。否則返回空字串。emptytonull nullablede...

Guava原始碼閱讀之Ints

package com.google.common.primitives ints是int的工具類 說說ints裡面的方法 1.public static listaslist int.backingarray 傳入int型別資料,返回乙個list,感覺像是比較常用的樣子。示例 listlist i...

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...