本文基于jdk1.8進(jìn)行分析
10年積累的成都做網(wǎng)站、成都網(wǎng)站設(shè)計經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先制作網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有龍港免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
HashMap是java開發(fā)中可以說必然會用到的一個集合。本文就HashMap的源碼實(shí)現(xiàn)進(jìn)行分析。
首先看一下源碼中類的javadoc注釋對HashMap的解釋。如下圖。HashMap是對Map接口的基于hash表的實(shí)現(xiàn)。這個實(shí)現(xiàn)提供了map的所有可選操作,并且允許null值(可以多個)和一個null的key(僅限一個)。HashMap和HashTable十分相似,除了HashMap是非同步的且允許null元素。這個類不保證map里的順序,更進(jìn)一步,隨著時間的推移,它甚至不保證順序一直不變。
這個實(shí)現(xiàn)為get和put這樣的基本操作提供常量級性能,它假設(shè)hash函數(shù)把元素們比較好的分散到各個桶里。用迭代器遍歷集合需要的時間,和HashMap的容量與HashMap里的Entry數(shù)量的和成正比。所以,如果遍歷性能很重要的話,一定不要把初始容量設(shè)置的太大,或者把負(fù)載因子設(shè)置的太小。
一個hashmap有兩個影響它的性能的參數(shù),初始容量和負(fù)載因子。容量是哈希表中桶的數(shù)量,初始容量就是創(chuàng)建哈希表時桶的數(shù)量。負(fù)載銀子是哈希表的容量自動擴(kuò)容前哈希表能夠達(dá)到多滿。當(dāng)哈希表中條目的數(shù)量超過當(dāng)前容量和負(fù)載因子的乘積后,哈希表會進(jìn)行重新哈希(也就是,內(nèi)部數(shù)據(jù)結(jié)構(gòu)重建),以使哈希表大約擁有2倍數(shù)量的桶。
作為一個通常的規(guī)則,默認(rèn)負(fù)載銀子(0.75) 提供了一個時間和空間的比較好的平衡。更高的負(fù)載因子會降低空間消耗但是會增加查找的消耗。當(dāng)設(shè)置初始容量時,哈希表中期望的條目數(shù)量和它的負(fù)載因子應(yīng)該考慮在內(nèi),以盡可能的減小重新哈希的次數(shù)。如果初始容量比條目最大數(shù)量除以負(fù)載因子還大,那么重新哈希操作就不會發(fā)生。
如果許多entry需要存儲在哈希表中,用能夠容納entry的足夠大的容量來創(chuàng)建哈希表,比讓它在需要的時候自動擴(kuò)容更有效率。請注意,使用多個hash值相等的key肯定會降低任何哈希表的效率。
請注意這個實(shí)現(xiàn)不是同步的。如果多個線程同時訪問哈希表,并且至少有一個線程會修改哈希表的結(jié)構(gòu),那么哈希表外部必須進(jìn)行同步。
/** * Hash table based implementation of the Map interface. This * implementation provides all of the optional map operations, and permits * null values and the null key. (The HashMap * class is roughly equivalent to Hashtable, 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. *This implementation provides constant-time performance for the basic * operations (get and put), assuming the hash function * disperses the elements properly among the buckets. Iteration over * collection views requires time proportional to the "capacity" of the * HashMap 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. *
An instance of HashMap has two parameters that affect its * performance: initial capacity and load factor. The * capacity 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 * load factor 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 rehashed (that is, internal data * structures are rebuilt) so that the hash table has approximately twice the * number of buckets. *
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 HashMap class, including * get and put). 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. *
If many mappings are to be stored in a HashMap * 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. *
Note that this implementation is not synchronized. * If multiple threads access a hash map concurrently, and at least one of * the threads modifies the map structurally, it must 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:
* Map m = Collections.synchronizedMap(new HashMap(...));*The iterators returned by all of this class's "collection view methods" * are fail-fast: if the map is structurally modified at any time after * the iterator is created, in any way except through the iterator's own * remove 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. *
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 ConcurrentModificationException on a best-effort basis. * Therefore, it would be wrong to write a program that depended on this * exception for its correctness: the fail-fast behavior of iterators * should be used only to detect bugs. *
This class is a member of the * * Java Collections Framework. * @param
the type of keys maintained by this map * @param 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é)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對創(chuàng)新互聯(lián)的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接