HashMap和ConcurrentHashMap的一些默认值

238 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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();