ITPub博客

首页 > 应用开发 > Java > 好程序员Java培训分享HashMap成员变量解析

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

原创 Java 作者:好程序员 时间:2020-10-22 17:28:20 0 删除 编辑

  好程序员 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 specified

 * by 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 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 的最主要的数据结构,如下图。从注释中也可以了解到, table 的大小一定是 2 的指数。

 

/**

 * 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 ,如下图。它保存缓存的映射关系集合。注意, keySet() values() 使用的是父类 AbstractMap 的属性。

 

/**

 * Holds cached entrySet(). Note that AbstractMap fields are used

 * for 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 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;



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69913864/viewspace-2728914/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-03-20

  • 博文量
    342
  • 访问量
    146293