亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java源碼解析HashMap成員變量

 更新時間:2019年01月07日 14:33:21   作者:李燦輝  
今天小編就為大家分享一篇關(guān)于Java源碼解析HashMap成員變量,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

本文基于jdk1.8進行分析

關(guān)于HashMap的簡介,可以參考這篇文章http://chabaoo.cn/article/154177.htm

首先看一下HashMap的一些靜態(tài)常量。第一個是DEFAULT_INITIAL_CAPACITY,默認(rèn)初始大小,16。從注釋中可以了解到,大小必須為2的指數(shù)。這里的16,采用的1左移4位實現(xiàn)。而“aka”,是as known as的縮寫。

  /**
   * The default initial capacity - MUST be a power of two.
   **/
  static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

接下來是最大容量,當(dāng)通過任何一個構(gòu)造函數(shù)的參數(shù)隱式指明時使用該值。必須是2的指數(shù),且小于等于1<<30,即2的30次方。

  /**
   * The maximum capacity, used if a higher value is implicitly specified
   * by either of the constructors with arguments.
   * MUST be a power of two <= 1<<30.
   **/
  static final int MAXIMUM_CAPACITY = 1 << 30;

接下來是負(fù)載因子,默認(rèn)值為0.75F。

  /**
   * The load factor used when none specified in constructor.
   **/
  static final float DEFAULT_LOAD_FACTOR = 0.75f;

接下來是和紅黑樹相關(guān)的幾個常量。在jdk1.8中,如果哈希表中的鏈表太長,就會轉(zhuǎn)化為一個紅黑樹。

TREEIFY_THRESHOLD,表示要轉(zhuǎn)為紅黑樹的最小元素個數(shù),即8。把紅黑樹轉(zhuǎn)化為鏈表的門限個數(shù)是6. MIN_TREEIFY_CAPACITY為64,表示把鏈表轉(zhuǎn)化為紅黑樹的最小元素個數(shù)。否則,如果太多節(jié)點在一個鏈表中時,哈希表會擴容,而不會轉(zhuǎn)化為紅黑樹。

  /**
   * The bin count threshold for using a tree rather than list for a
   * bin. Bins are converted to trees when adding an element to a
   * bin with at least this many nodes. The value must be greater
   * than 2 and should be at least 8 to mesh with assumptions in
   * tree removal about conversion back to plain bins upon
   * shrinkage.
   **/
  static final int TREEIFY_THRESHOLD = 8;
  /**
   * The bin count threshold for untreeifying a (split) bin during a
   * resize operation. Should be less than TREEIFY_THRESHOLD, and at
   * most 6 to mesh with shrinkage detection under removal.
   **/
  static final int UNTREEIFY_THRESHOLD = 6;
  /**
   * The smallest table capacity for which bins may be treeified.
   * (Otherwise the table is resized if too many nodes in a bin.)
   * Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
   * between resizing and treeification thresholds.
   **/
  static final int MIN_TREEIFY_CAPACITY = 64;

接下來是table,它是保存HashMap的最主要的數(shù)據(jù)結(jié)構(gòu),如下圖。從注釋中也可以了解到,table的大小一定是2的指數(shù)。

  /**
   * The table, initialized on first use, and resized as
   * necessary. When allocated, length is always a power of two.
   * (We also tolerate length zero in some operations to allow
   * bootstrapping mechanics that are currently not needed.)
   **/
  transient Node<K,V>[] table;

接下來是entrySet,如下圖。它保存緩存的映射關(guān)系集合。注意,keySet()和values()使用的是父類AbstractMap的屬性。

  /**
   * Holds cached entrySet(). Note that AbstractMap fields are used
   * for keySet() and values().
   **/
  transient Set<Map.Entry<K,V>> entrySet;

最后是一些其他的屬性,包括HashMap中元素個數(shù)size,修改次數(shù)modCount,下一次進行resize的門限個數(shù),以及負(fù)載因子loadFactor,如下圖。需要注意的是,loadFactor是final的,也就是說,它一旦被賦值,就不能再修改了。

  /**
   * The number of key-value mappings contained in this map.
   **/
  transient int size;
  /**
   * The number of times this HashMap has been structurally modified
   * Structural modifications are those that change the number of mappings in
   * the HashMap or otherwise modify its internal structure (e.g.,
   * rehash). This field is used to make iterators on Collection-views of
   * the HashMap fail-fast. (See ConcurrentModificationException).
   **/
  transient int modCount;
  /**
   * The next size value at which to resize (capacity * load factor).
   * @serial
   **/
  // (The javadoc description is true upon serialization.
  // Additionally, if the table array has not been allocated, this
  // field holds the initial array capacity, or zero signifying
  // DEFAULT_INITIAL_CAPACITY.)
  int threshold;
  /**
   * The load factor for the hash table.
   *
   * @serial
   **/
  final float loadFactor;

This is the end.

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • Java雜談之如何消除代碼中一大串參數(shù)列表

    Java雜談之如何消除代碼中一大串參數(shù)列表

    參數(shù)列表和字面意思差不多,主要是表示該參數(shù)數(shù)量不是固定的,可能會有一個參數(shù),可能多個,不管多少個參數(shù),都放到一個數(shù)組處理,這種參數(shù)叫可變參數(shù)??勺冮L參數(shù)要放在最后一個參數(shù)位置處理,但是一個函數(shù)里面不能有倆種類型的可變參數(shù)
    2021-10-10
  • 詳解如何用SpringBoot 2.3.0.M1創(chuàng)建Docker映像

    詳解如何用SpringBoot 2.3.0.M1創(chuàng)建Docker映像

    這篇文章主要介紹了詳解如何用SpringBoot 2.3.0.M1創(chuàng)建Docker映像,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 基于MyBatis的parameterType傳入?yún)?shù)類型

    基于MyBatis的parameterType傳入?yún)?shù)類型

    這篇文章主要介紹了基于MyBatis的parameterType傳入?yún)?shù)類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring實現(xiàn)Aware接口自定義獲取bean的兩種方式

    Spring實現(xiàn)Aware接口自定義獲取bean的兩種方式

    這篇文章主要介紹了Java編程實現(xiàn)Aware接口自定義獲取bean的兩種方式,通過BeanFactoryAware和ApplicationContextAware,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • 基于Spring Data Jest的Elasticsearch數(shù)據(jù)統(tǒng)計示例

    基于Spring Data Jest的Elasticsearch數(shù)據(jù)統(tǒng)計示例

    本篇文章主要介紹了基于Spring Data Jest的Elasticsearch數(shù)據(jù)統(tǒng)計示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 三種Spring BeanName生成器,你了解嗎

    三種Spring BeanName生成器,你了解嗎

    無論我們是通過 XML 文件,還是 Java 代碼,亦或是包掃描的方式去注冊 Bean,都可以不設(shè)置BeanName,而Spring均會為之提供默認(rèn)的 beanName,本文我們就來看看 Spring 中三種處理不同情況的 beanName生成器吧
    2023-09-09
  • Springboot實現(xiàn)添加本地模塊依賴方式

    Springboot實現(xiàn)添加本地模塊依賴方式

    這篇文章主要介紹了Springboot實現(xiàn)添加本地模塊依賴方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 深入理解Java SpringCloud Ribbon 負(fù)載均衡

    深入理解Java SpringCloud Ribbon 負(fù)載均衡

    Ribbon是一個客戶端負(fù)載均衡器,它提供了對HTTP和TCP客戶端的行為的大量控制。這篇文章主要介紹了SpringCloud Ribbon 負(fù)載均衡的實現(xiàn),感興趣的小伙伴們可以參考一下
    2021-09-09
  • java線程池詳解及代碼介紹

    java線程池詳解及代碼介紹

    這篇文章主要介紹了java中線程池的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • SpringBoot+SpringSecurity處理Ajax登錄請求問題(推薦)

    SpringBoot+SpringSecurity處理Ajax登錄請求問題(推薦)

    這篇文章主要介紹了SpringBoot+SpringSecurity處理Ajax登錄請求問題,本文給大家介紹的非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-12-12

最新評論