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

Java中的WeakHashMap、LinkedHashMap、TreeMap與Set詳解

 更新時間:2023年09月08日 09:09:10   作者:超大充電寶  
這篇文章主要介紹了Java中的WeakHashMap、LinkedHashMap、TreeMap與Set詳解,在JVM中,一個對象如果不再被使用就會被當做垃圾給回收掉,判斷一個對象是否是垃圾,我們的WeakHashMap就是基于弱引用,需要的朋友可以參考下

WeakHashMap

Java中的四種引用

在JVM中,一個對象如果不再被使用就會被當做垃圾給回收掉,判斷一個對象是否是垃圾,通常有兩種方法:引用計數法和可達性分析法。不管是哪一種方法判斷一個對象是否是垃圾的條件總是一個對象的引用是都沒有了。

JDK1.2 之后,Java 對引用的概念進行了擴充,將引用分為了:強引用、軟引用、弱引用、虛引用4 種。而我們的WeakHashMap就是基于弱引用。

強引用

如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM也不會回收它,而是拋出OutOfMemoryError錯誤,使程序異常終止。比如String str = new String("hello");這時候str就是一個強引用。

軟引用

內存足夠的時候,軟引用對象不會被回收,只有在內存不足時,系統(tǒng)則會回收軟引用對象,如果回收了軟引用對象之后仍然沒有足夠的內存,才會拋出內存溢出異常。

弱引用

如果一個對象具有弱引用,在垃圾回收時候,一旦發(fā)現弱引用對象,無論當前內存空間是否充足,都會將弱引用回收。

虛引用

如果一個對象具有虛引用,就相當于沒有引用,在任何時候都有可能被回收。使用虛引用的目的就是為了得知對象被GC的時機,所以可以利用虛引用來進行銷毀前的一些操作,比如說資源釋放等。

LinkedHashMap

LinkedHashMap它雖然增加了時間和空間上的開銷,但是通過維護一個運行于所有條目的雙向鏈表,LinkedHashMap保證了元素迭代的順序。該迭代順序可以是插入順序或者是訪問順序。

LinkedHashMap存儲結構

/**
 * The head (eldest) of the doubly linked list.
 */
transient LinkedHashMap.Entry<K,V> head;
/**
 * The tail (youngest) of the doubly linked list.
 */
transient LinkedHashMap.Entry<K,V> tail;
/**
 * The iteration ordering method for this linked hash map: <tt>true</tt>
 * for access-order, <tt>false</tt> for insertion-order.
 *
 * @serial
 */
final boolean accessOrder;
/**
 * HashMap.Node subclass for normal LinkedHashMap entries.
 */
static class Entry<K,V> extends HashMap.Node<K,V> {
    Entry<K,V> before, after;
    Entry(int hash, K key, V value, Node<K,V> next) {
        super(hash, key, value, next);
    }
}

LinkedHashMap的結點結構在繼承于HashMap的基礎上,增加了 before 和 after 屬性來確保插入順序。并且還維護了頭結點 head 和尾結點 tail 。在插入數據時,不但需要通過哈希算法進行存儲,還需要通過 before 和 after 模擬雙向鏈表存儲結構,進行插入順序的維護。

LinkedHashMap所繼承于HashMap結點中的 next 屬性是用于維護HashMap中table數組中存儲的鏈表。而其獨有的 before 和 after 是模擬雙向鏈表進行結點插入順序的維護

TreeMap

在前面我們通過HashMap中插入順序無序引出了LinkedHashMap的使用,但是我們又可以發(fā)現,這兩種存儲方式在迭代時均不是按照數據的大小順序進行遍歷的,而當我們需要將數據按照大小順序迭代時,就需要此時的TreeMap集合了。

  • TreeMap是一個大小有序的key-value集合,底層結構是紅黑樹,不允許插入null值。
  • TreeMap采用紅黑樹的插入和刪除方法,通過比較key決定新元素的插入位置,也通過紅黑樹的有序性質進行刪除。
  • TreeMap需要通過Comparable或Comparator進行元素的排序。

TreeMap的存儲結構

// Red-black mechanics
private static final boolean RED   = false;
private static final boolean BLACK = true;
/**
 * Node in the Tree.  Doubles as a means to pass key-value pairs back to
 * user (see Map.Entry).
 */
static final class Entry<K,V> implements Map.Entry<K,V> {
    //key,val是存儲的原始數據
    K key;
    V value;
    //定義了結點的左孩子
    Entry<K,V> left = null;
    //定義了結點的右孩子
    Entry<K,V> right = null;
    //通過該節(jié)點可以反過來往上找到自己的父親
    Entry<K,V> parent;
    //默認情況下為黑色節(jié)點,可調整
    boolean color = BLACK;
    /**
     * Make a new cell with given key, value, and parent, and with
     * {@code null} child links, and BLACK color.
     */
    Entry(K key, V value, Entry<K,V> parent) {
        this.key = key;
        this.value = value;
        this.parent = parent;
    }
}

黑樹規(guī)則特點:

1、節(jié)點分為紅色或者黑色;

2、根節(jié)點必為黑色;

3、葉子節(jié)點都為黑色,且為null;

4、連接紅色節(jié)點的兩個子節(jié)點都為黑色(紅黑樹不會出現相鄰的紅色節(jié)點);

5、從任意節(jié)點出發(fā),到其每個葉子節(jié)點的路徑中包含相同數量的黑色節(jié)點;

6、新加入到紅黑樹的節(jié)點為紅色節(jié)點;

紅黑樹自平衡基本操作:

1、變色:在不違反上述紅黑樹規(guī)則特點情況下,將紅黑樹某個node節(jié)點顏色由紅變黑,或者由黑變紅;

2、左旋:逆時針旋轉兩個節(jié)點,讓一個節(jié)點被其右子節(jié)點取代,而該節(jié)點成為右子節(jié)點的左子節(jié)點;

3、右旋:順時針旋轉兩個節(jié)點,讓一個節(jié)點被其左子節(jié)點取代,而該節(jié)點成為左子節(jié)點的右子節(jié)點;

Set

Set集合類似于一個罐子,程序可以依次把多個對象“丟進”Set集合,而Set集合通常不能記住元素的添加順序。實際上Set就是Collection只是行為略有不同(Set不允許包含重復元素)。

Set集合不允許包含相同的元素,如果試圖把兩個相同元素加入同一個Set集合中,則添加操作失敗,add()方法返回false,且新元素不會被加入。

Set集合的特征

  • Set集合,基礎自Collection。特征是插入無序,不可指定位置訪問。
  • Set集合的實現類可說是基于Map集合去寫的。通過內部封裝Map集合來實現的比如HashSet內部封裝了HashMap。
  • Set集合的數據庫不能重復(== 或 eqauls)的元素。
  • Set集合的常用實現類有 HashSet、TreeSet。

HashSet

HashSet是Set接口的典型實現,大多數時候使用Set集合時就是使用這個實現類。HashSet按Hash算法來存儲集合中的元素,因此具有很好的存取和查找性能。底層數據結構是哈希表。

HashSet特點

HashSet具有以下特點:

  • 不能保證元素的排列順序,順序可能與添加順序不同,順序也可能發(fā)生變化;
  • HashSet不是同步的;
  • 集合元素值可以是null;

HashSet的存儲結構

當向HashSet集合中存入一個元素時,HashSet會調用該對象的hashCode方法來得到該對象的hashCode值,然后根據該hashCode值決定該對象在HashSet中的存儲位置。如果有兩個元素通過equals方法比較true,但它們的hashCode方法返回的值不相等,HashSet將會把它們存儲在不同位置,依然可以添加成功。

也就是說。HashSet集合判斷兩個元素的標準是兩個對象通過equals方法比較相等,并且兩個對象的hashCode方法返回值也相等。

即:靠元素重寫hashCode方法和equals方法來判斷兩個元素是否相等,如果相等則覆蓋原來的元素,以此來確保元素的唯一性。

TreeSet

TreeSet是SortedSet接口的實現類,TreeSet可以確保集合元素處于排序狀態(tài)。

存儲結構 TreeSet內部實現的是紅黑樹,默認整形排序為從小到大。

在這里插入圖片描述

常用方法

與HashSet集合相比,TreeSet還提供了幾個額外方法:

  • Comparator comparator():如果TreeSet采用了定制順序,則該方法返回定制排序所使用的Comparator,如果TreeSet采用自然排序,則返回null;
  • Object first():返回集合中的第一個元素;
  • Object last():返回集合中的最后一個元素;
  • Object lower(Object e):返回指定元素之前的元素。
  • Object higher(Object e):返回指定元素之后的元素。
  • SortedSet subSet(Object fromElement,Object toElement):返回此Set的子集合,含頭不含尾;
  • SortedSet headSet(Object toElement):返回此Set的子集,由小于toElement的元素組成;
  • SortedSet tailSet(Object fromElement):返回此Set的子集,由大于fromElement的元素組成;

排序方式

TreeSet支持兩種排序方法:自然排序和定制排序,在默認情況下,采用的是自然排序。

EnumSet

EnumSet類的特點:

  • EnumSet是一個專門為枚舉類設計的集合類,EnumSet中的所有元素都必須是指定枚舉類型的枚舉值,該枚舉類型在創(chuàng)建EnumSet時顯式或隱式地指定。
  • EnumSet的集合元素也是有序的,EnumSet以枚舉值在Enum類內的定義順序來決定集合元素的順序。
  • EnumSet在內部以位向量的形式存儲,這種存儲形式非常緊湊、高效,因此EnumSet對象占用內存很小,而且運行效率很好。
  • EnumSet集合不允許加入null元素。

EnumSet類沒有暴露任何構造器來創(chuàng)建該類的實例,EnumSet類提供了以下類方法來創(chuàng)建EnumSet對象。

  • EnumSet allOf(Class elementType):創(chuàng)建一個包含指定枚舉類里所有枚舉值的EnumSet集合。
  • EnumSet complementOf(EnumSet s):創(chuàng)建一個其元素類型與指定EnumSet里元素類型相同的EnumSet集合,新的集合里包含原集合不包含的枚舉值。
  • EnumSet copyOf(Collection c):使用一個普通集合來創(chuàng)建EnumSet集合;
  • EnumSet copyOf(EnumSet s):復制原集合;
  • EnumSet noneOf(Class elementType):創(chuàng)建一個元素類型為指定枚舉類型的空EnumSet;
  • EnumSet of(E first,E...rest):創(chuàng)建一個包含一個或多個枚舉值的EnumSet集合。傳入的枚舉值必須是同一枚舉類。
  • EnumSet range(E from,E to):創(chuàng)建一個包含從from到to枚舉值范圍所有枚舉值的EnumSet集合。

到此這篇關于Java中的WeakHashMap、LinkedHashMap、TreeMap與Set詳解的文章就介紹到這了,更多相關Java的WeakHashMap、TreeMap與Set內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于SpringBoot使用Tika實現文檔解析

    基于SpringBoot使用Tika實現文檔解析

    Apache?Tika是開源內容分析工具,支持多格式文本提取與元數據解析,具備語言檢測和MIME類型識別功能,適用于搜索引擎、數據分析等場景,在SpringBoot中集成需注意性能及配置問題,支持流式處理和自定義擴展,下面介紹SpringBoot使用Tika實現文檔解析,感興趣的朋友一起看看吧
    2025-07-07
  • Spring Batch讀取txt文件并寫入數據庫的方法教程

    Spring Batch讀取txt文件并寫入數據庫的方法教程

    這篇文章主要給大家介紹了Spring Batch讀取txt文件并寫入數據庫的方法,SpringBatch 是一個輕量級、全面的批處理框架。這里我們用它來實現文件的讀取并將讀取的結果作處理,處理之后再寫入數據庫中的功能。需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Java實現簡易拼圖游戲的方法詳解

    Java實現簡易拼圖游戲的方法詳解

    這篇文章主要介紹了如何利用Java語言實現簡易拼圖游戲,幫助大家更好的理解和使用Java開發(fā)游戲,感興趣的朋友可以跟隨小編一起學習一下
    2022-05-05
  • java如何根據模板導出數據到word文檔中(表格、自定義標簽等)

    java如何根據模板導出數據到word文檔中(表格、自定義標簽等)

    這篇文章主要介紹了關于java如何根據模板導出數據到word文檔中(表格、自定義標簽等)的相關資料,主要包括創(chuàng)建docx文檔,配置模板信息,以及利用XDocReport+FreeMarker技術進行實現,詳細介紹了在Word模板中如何設置字段以及如何通過代碼填充這些字段,需要的朋友可以參考下
    2024-11-11
  • 實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)開發(fā)醫(yī)院科室及排班的接口

    實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)開發(fā)醫(yī)院科室及排班的接口

    這篇文章主要為大家介紹了實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)開發(fā)醫(yī)院科室及排班的接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2022-04-04
  • SpringBoot之bootstrap和application的區(qū)別解讀

    SpringBoot之bootstrap和application的區(qū)別解讀

    這篇文章主要介紹了SpringBoot之bootstrap和application的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java如何在項目中實現excel導入導出功能

    java如何在項目中實現excel導入導出功能

    這篇文章主要介紹了java如何在項目中實現excel導入導出功能的相關資料,EasyExcel是一個基于Apache?POI開發(fā)的開源Java庫,用于簡化Excel文件的讀寫操作,文中將用法介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • SpringBoot項目使用?axis?調用webservice接口的實踐記錄

    SpringBoot項目使用?axis?調用webservice接口的實踐記錄

    這篇文章主要介紹了SpringBoot項目使用?axis?調用webservice接口,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Java 正則表達式 解釋說明

    Java 正則表達式 解釋說明

    java正則知識小結,一些常見的正則都包括在里面,推薦收藏。
    2009-06-06
  • java驗證碼生成的基本流程

    java驗證碼生成的基本流程

    這篇文章主要介紹了java驗證碼生成的基本流程,需要的朋友可以參考下
    2015-11-11

最新評論

章丘市| 莲花县| 安泽县| 阿巴嘎旗| 佳木斯市| 漯河市| 岚皋县| 龙泉市| 安新县| 青浦区| 疏附县| 印江| 武乡县| 抚远县| 祁阳县| 龙江县| 大埔县| 蒙阴县| 隆德县| 海兴县| 伽师县| 克拉玛依市| 武宣县| 渭源县| 中江县| 化德县| 牟定县| 安化县| 调兵山市| 上犹县| 五峰| 慈溪市| 五家渠市| 土默特左旗| 冕宁县| 交口县| 虞城县| 秭归县| 连平县| 礼泉县| 合作市|