好程序员Java培训分享HashMap成员变量解析

it2026-04-13  2

好程序员Java培训分享HashMap成员变量解析,,首先看一下HashMap的一些静态常量。第一个是DEFAULT_INITIAL_CAPACITY,默认初始大小,16。从注释中可以了解到,大小必须为2的指数。这里的16,采用的1左移4位实现。而“aka”,是asknownas的缩写。

/**

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

接下来是最大容量,当通过任何一个构造函数的参数隐式指明时使用该值。必须是2的指数,且小于等于1<<30,即2的30次方。

/**

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

接下来是负载因子,默认值为0.75F。

/**

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

接下来是和红黑树相关的几个常量。在jdk1.8中,如果哈希表中的链表太长,就会转化为一个红黑树。

TREEIFY_THRESHOLD,表示要转为红黑树的最小元素个数,即8。把红黑树转化为链表的门限个数是6.MIN_TREEIFY_CAPACITY为64,表示把链表转化为红黑树的最小元素个数。否则,如果太多节点在一个链表中时,哈希表会扩容,而不会转化为红黑树。

/**

The bin count threshold for using a tree rather than list for abin. Bins are converted to trees when adding an element to abin with at least this many nodes. The value must be greaterthan 2 and should be at least 8 to mesh with assumptions intree removal about conversion back to plain bins uponshrinkage. / static final int TREEIFY_THRESHOLD = 8; /The bin count threshold for untreeifying a (split) bin during aresize operation. Should be less than TREEIFY_THRESHOLD, and atmost 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 conflictsbetween resizing and treeification thresholds. **/ static final int MIN_TREEIFY_CAPACITY = 64;

接下来是table,它是保存HashMap的最主要的数据结构,如下图。从注释中也可以了解到,table的大小一定是2的指数。

/**

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

接下来是entrySet,如下图。它保存缓存的映射关系集合。注意,keySet()和values()使用的是父类AbstractMap的属性。

/**

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

最后是一些其他的属性,包括HashMap中元素个数size,修改次数modCount,下一次进行resize的门限个数,以及负载因子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 modifiedStructural modifications are those that change the number of mappings inthe HashMap or otherwise modify its internal structure (e.g.,rehash). This field is used to make iterators on Collection-views ofthe 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;
最新回复(0)