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

Java源碼解析HashMap簡(jiǎn)介

 更新時(shí)間:2019年01月07日 14:11:44   作者:李燦輝  
今天小編就為大家分享一篇關(guān)于Java源碼解析HashMap簡(jiǎn)介,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

本文基于jdk1.8進(jìn)行分析

HashMap是java開發(fā)中可以說(shuō)必然會(huì)用到的一個(gè)集合。本文就HashMap的源碼實(shí)現(xiàn)進(jìn)行分析。

首先看一下源碼中類的javadoc注釋對(duì)HashMap的解釋。如下圖。HashMap是對(duì)Map接口的基于hash表的實(shí)現(xiàn)。這個(gè)實(shí)現(xiàn)提供了map的所有可選操作,并且允許null值(可以多個(gè))和一個(gè)null的key(僅限一個(gè))。HashMap和HashTable十分相似,除了HashMap是非同步的且允許null元素。這個(gè)類不保證map里的順序,更進(jìn)一步,隨著時(shí)間的推移,它甚至不保證順序一直不變。

這個(gè)實(shí)現(xiàn)為get和put這樣的基本操作提供常量級(jí)性能,它假設(shè)hash函數(shù)把元素們比較好的分散到各個(gè)桶里。用迭代器遍歷集合需要的時(shí)間,和HashMap的容量與HashMap里的Entry數(shù)量的和成正比。所以,如果遍歷性能很重要的話,一定不要把初始容量設(shè)置的太大,或者把負(fù)載因子設(shè)置的太小。

一個(gè)hashmap有兩個(gè)影響它的性能的參數(shù),初始容量和負(fù)載因子。容量是哈希表中桶的數(shù)量,初始容量就是創(chuàng)建哈希表時(shí)桶的數(shù)量。負(fù)載銀子是哈希表的容量自動(dòng)擴(kuò)容前哈希表能夠達(dá)到多滿。當(dāng)哈希表中條目的數(shù)量超過(guò)當(dāng)前容量和負(fù)載因子的乘積后,哈希表會(huì)進(jìn)行重新哈希(也就是,內(nèi)部數(shù)據(jù)結(jié)構(gòu)重建),以使哈希表大約擁有2倍數(shù)量的桶。

作為一個(gè)通常的規(guī)則,默認(rèn)負(fù)載銀子(0.75) 提供了一個(gè)時(shí)間和空間的比較好的平衡。更高的負(fù)載因子會(huì)降低空間消耗但是會(huì)增加查找的消耗。當(dāng)設(shè)置初始容量時(shí),哈希表中期望的條目數(shù)量和它的負(fù)載因子應(yīng)該考慮在內(nèi),以盡可能的減小重新哈希的次數(shù)。如果初始容量比條目最大數(shù)量除以負(fù)載因子還大,那么重新哈希操作就不會(huì)發(fā)生。

如果許多entry需要存儲(chǔ)在哈希表中,用能夠容納entry的足夠大的容量來(lái)創(chuàng)建哈希表,比讓它在需要的時(shí)候自動(dòng)擴(kuò)容更有效率。請(qǐng)注意,使用多個(gè)hash值相等的key肯定會(huì)降低任何哈希表的效率。

請(qǐng)注意這個(gè)實(shí)現(xiàn)不是同步的。如果多個(gè)線程同時(shí)訪問(wèn)哈希表,并且至少有一個(gè)線程會(huì)修改哈希表的結(jié)構(gòu),那么哈希表外部必須進(jìn)行同步。

/**
 * Hash table based implementation of the <tt>Map</tt> interface. This
 * implementation provides all of the optional map operations, and permits
 * <tt>null</tt> values and the <tt>null</tt> key. (The <tt>HashMap</tt>
 * class is roughly equivalent to <tt>Hashtable</tt>, except that it is
 * unsynchronized and permits nulls.) This class makes no guarantees as to
 * the order of the map; in particular, it does not guarantee that the order
 * will remain constant over time.
 * <p>This implementation provides constant-time performance for the basic
 * operations (<tt>get</tt> and <tt>put</tt>), assuming the hash function
 * disperses the elements properly among the buckets. Iteration over
 * collection views requires time proportional to the "capacity" of the
 * <tt>HashMap</tt> instance (the number of buckets) plus its size (the number
 * of key-value mappings). Thus, it's very important not to set the initial
 * capacity too high (or the load factor too low) if iteration performance is
 * important.
 * <p>An instance of <tt>HashMap</tt> has two parameters that affect its
 * performance: <i>initial capacity</i> and <i>load factor</i>. The
 * <i>capacity</i> is the number of buckets in the hash table, and the initial
 * capacity is simply the capacity at the time the hash table is created. The
 * <i>load factor</i> is a measure of how full the hash table is allowed to
 * get before its capacity is automatically increased. When the number of
 * entries in the hash table exceeds the product of the load factor and the
 * current capacity, the hash table is <i>rehashed</i> (that is, internal data
 * structures are rebuilt) so that the hash table has approximately twice the
 * number of buckets.
 * <p>As a general rule, the default load factor (.75) offers a good
 * tradeoff between time and space costs. Higher values decrease the
 * space overhead but increase the lookup cost (reflected in most of
 * the operations of the <tt>HashMap</tt> class, including
 * <tt>get</tt> and <tt>put</tt>). The expected number of entries in
 * the map and its load factor should be taken into account when
 * setting its initial capacity, so as to minimize the number of
 * rehash operations. If the initial capacity is greater than the
 * maximum number of entries divided by the load factor, no rehash
 * operations will ever occur.
 * <p>If many mappings are to be stored in a <tt>HashMap</tt>
 * instance, creating it with a sufficiently large capacity will allow
 * the mappings to be stored more efficiently than letting it perform
 * automatic rehashing as needed to grow the table. Note that using
 * many keys with the same {@code hashCode()} is a sure way to slow
 * down performance of any hash table. To ameliorate impact, when keys
 * are {@link Comparable}, this class may use comparison order among
 * keys to help break ties.
 * <p><strong>Note that this implementation is not synchronized.</strong>
 * If multiple threads access a hash map concurrently, and at least one of
 * the threads modifies the map structurally, it <i>must</i> be
 * synchronized externally. (A structural modification is any operation
 * that adds or deletes one or more mappings; merely changing the value
 * associated with a key that an instance already contains is not a
 * structural modification.) This is typically accomplished by
 * synchronizing on some object that naturally encapsulates the map.
 * If no such object exists, the map should be "wrapped" using the
 * {@link Collections#synchronizedMap Collections.synchronizedMap}
 * method. This is best done at creation time, to prevent accidental
 * unsynchronized access to the map:<pre>
 *  Map m = Collections.synchronizedMap(new HashMap(...));</pre>
 * <p>The iterators returned by all of this class's "collection view methods"
 * are <i>fail-fast</i>: if the map is structurally modified at any time after
 * the iterator is created, in any way except through the iterator's own
 * <tt>remove</tt> method, the iterator will throw a
 * {@link ConcurrentModificationException}. Thus, in the face of concurrent
 * modification, the iterator fails quickly and cleanly, rather than risking
 * arbitrary, non-deterministic behavior at an undetermined time in the
 * future.
 * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
 * as it is, generally speaking, impossible to make any hard guarantees in the
 * presence of unsynchronized concurrent modification. Fail-fast iterators
 * throw <tt>ConcurrentModificationException</tt> on a best-effort basis.
 * Therefore, it would be wrong to write a program that depended on this
 * exception for its correctness: <i>the fail-fast behavior of iterators
 * should be used only to detect bugs.</i>
 * <p>This class is a member of the
 * <a href="{@docRoot}/../technotes/guides/collections/index.html" rel="external nofollow" >
 * Java Collections Framework</a>.
 * @param <K> the type of keys maintained by this map
 * @param <V> the type of mapped values
 * @author Doug Lea
 * @author Josh Bloch
 * @author Arthur van Hoff
 * @author Neal Gafter
 * @see   Object#hashCode()
 * @see   Collection
 * @see   Map
 * @see   TreeMap
 * @see   Hashtable
 * @since  1.2
 **/

This is the end。

總結(jié)

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

相關(guān)文章

  • Java使用HttpUtils實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求

    Java使用HttpUtils實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求

    這篇文章主要介紹了Java使用HttpUtils實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求,HTTP請(qǐng)求,在日常開發(fā)中,還是比較常見(jiàn)的,今天給大家分享HttpUtils如何使用,需要的朋友可以參考下
    2023-05-05
  • Java抽獎(jiǎng)算法第二例

    Java抽獎(jiǎng)算法第二例

    這篇文章主要為大家詳細(xì)介紹了Java抽獎(jiǎng)算法,根據(jù)概率將獎(jiǎng)品劃分區(qū)間,每個(gè)區(qū)間代表一個(gè)獎(jiǎng)品,然后抽取隨機(jī)數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java實(shí)現(xiàn)給圖片添加圖片水印,文字水印及馬賽克的方法示例

    Java實(shí)現(xiàn)給圖片添加圖片水印,文字水印及馬賽克的方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)給圖片添加圖片水印,文字水印及馬賽克的方法,涉及java針對(duì)圖片的讀取、水印添加、馬賽克設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • MyBatis-Plus?分頁(yè)查詢的實(shí)現(xiàn)示例

    MyBatis-Plus?分頁(yè)查詢的實(shí)現(xiàn)示例

    本文主要介紹了MyBatis-Plus?分頁(yè)查詢的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • springboot?filter配置多個(gè)時(shí),執(zhí)行順序問(wèn)題

    springboot?filter配置多個(gè)時(shí),執(zhí)行順序問(wèn)題

    這篇文章主要介紹了springboot?filter配置多個(gè)時(shí),執(zhí)行順序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 基于JDK動(dòng)態(tài)代理原理解析

    基于JDK動(dòng)態(tài)代理原理解析

    這篇文章主要介紹了基于JDK動(dòng)態(tài)代理原理解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • IntelliJ IDEA多屏后窗口不顯示問(wèn)題解決方案

    IntelliJ IDEA多屏后窗口不顯示問(wèn)題解決方案

    這篇文章主要介紹了IntelliJ IDEA多屏后窗口不顯示問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring的異常重試框架Spring Retry簡(jiǎn)單配置操作

    Spring的異常重試框架Spring Retry簡(jiǎn)單配置操作

    這篇文章主要介紹了Spring的異常重試框架Spring Retry簡(jiǎn)單配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java Native關(guān)鍵字原理及作用解析

    Java Native關(guān)鍵字原理及作用解析

    這篇文章主要介紹了Java Native關(guān)鍵字原理及作用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問(wèn)題

    Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問(wèn)題

    這篇文章主要給大家介紹了關(guān)于Maven打包所有依賴到一個(gè)可執(zhí)行jar中遇到的問(wèn)題,將依賴打入jar包,由于maven管理了所有的依賴,所以將項(xiàng)目的代碼和依賴打成一個(gè)包對(duì)它來(lái)說(shuō)是順理成章的功能,需要的朋友可以參考下
    2023-10-10

最新評(píng)論