一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
前言
HashMap时java使用非常频繁的数据结构,读写性能都非常高,今天先了解一下他的一些常用的默认值
HashMap
/**
* 默认初始容量 - 必须时2的幂次方. 默认16
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
/**
* 最大容量也必须时2的幂次方,由于int是32位的二进制最高位为符号位,因此最大的只能是第31位是1
* 01000000 00000000 00000000 00000000
*/
static final int MAXIMUM_CAPACITY = 1 << 30;
/**
* 负载因子0.75 size/capacity
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;
/**
* 链表转红黑树的阈值8
*/
static final int TREEIFY_THRESHOLD = 8;
/**
* 红黑树转为链表的阈值6
*/
static final int UNTREEIFY_THRESHOLD = 6;
/**
* 链表转化为红黑树的最小容量64
* 需要整个map的容量最小达到64才会转化,容量太小通过扩容来减少冲突,顺便减少链表的长度
*/
static final int MIN_TREEIFY_CAPACITY = 64;
ConcurrentHashMap
/**
* 最大容量也必须时2的幂次方,由于int是32位的二进制最高位为符号位,因此最大的只能是第31位是1
* 01000000 00000000 00000000 00000000
*/
private static final int MAXIMUM_CAPACITY = 1 << 30;
/**
* 默认初始容量 - 必须时2的幂次方. 默认16
*/
private static final int DEFAULT_CAPACITY = 16;
/**
* 最大(非二次幂)数组大小。toArray和相关方法所需。
*/
static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* 默认并发级别,未使用但为与此类的早期版本兼容而定义。
*/
private static final int DEFAULT_CONCURRENCY_LEVEL = 16;
/**
* 负载因子0.75 size/capacity
*/
private static final float LOAD_FACTOR = 0.75f;
/**
* 链表转红黑树的阈值8
*/
static final int TREEIFY_THRESHOLD = 8;
/**
* 红黑树转为链表的阈值6
*/
static final int UNTREEIFY_THRESHOLD = 6;
/**
* 链表转化为红黑树的最小容量64
* 需要整个map的容量最小达到64才会转化,容量太小通过扩容来减少冲突,顺便减少链表的长度
*/
static final int MIN_TREEIFY_CAPACITY = 64;
/**
* 不管哪个线程一次转移任务中最小要处理的数量,避免过多的内存争用
*/
private static final int MIN_TRANSFER_STRIDE = 16;
/**
* 用于生成 stamp sizeCtl的位数.
* 对于32位的数,最小需要是6
*/
private static int RESIZE_STAMP_BITS = 16;
/**
* 可以帮助调整大小的最大线程数。
* 必须是(32—RESIZE_STAMP_BITS)位大小。
*/
private static final int MAX_RESIZERS = (1 << (32 - RESIZE_STAMP_BITS)) - 1;
/**
* 在sizeCtl中记录大小戳的位移位。
*/
private static final int RESIZE_STAMP_SHIFT = 32 - RESIZE_STAMP_BITS;
/** cpu数量 */
static final int NCPU = Runtime.getRuntime().availableProcessors();