jdk1.8-ConcurrentHashMap源码
对着HashMap进行比较https://www.cnblogs.com/wqff-biubiu/p/8963817.html
ConcurrentHashMap与HashMap实现的接口
相同:AbstractMap,Serializable,Map----->可序列化的键值对
差别:ConcurrentHashMap比HashMap
- 少实现了Cloneable接口---------不支持clone()
- 多实现了ConcurrentMap接口------------重写并添加了部分方法
ConcurrentMap接口:
@Override default V getOrDefault(Object key, V defaultValue) {} @Override default void forEach(BiConsumer<? super K, ? super V> action) {} V putIfAbsent(K key, V value); boolean remove(Object key, Object value); boolean replace(K key, V oldValue, V newValue); V replace(K key, V value); @Override default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {} @Override default V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction) {} @Override default V computeIfPresent(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {} @Override default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {} @Override default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {}
ConcurrentHashMap变量与常量:
private static final int MAXIMUM_CAPACITY = 1 << 30;//最大容量,hash32位前两位为控制位 private static final int DEFAULT_CAPACITY = 16;//初始值0,首次put,默认扩容至16,之后扩容*2 static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//虚拟机限制的最大数组长度 private static final int DEFAULT_CONCURRENCY_LEVEL = 16;//默认并发等级,没用但兼容早版本 private static final float LOAD_FACTOR = 0.75f;//加载因子,超过总容量*x扩容,通常不适用浮点值,用n>>>2表示,3>>>2==0.75 static final int TREEIFY_THRESHOLD = 8;//链表转化红黑树的阈值,链表节点大小超过8,转化为红黑树的条件之一 static final int UNTREEIFY_THRESHOLD = 6;//扩容时,红黑树转化为链表的阈值,红黑树节点小于6,转化为链表 static final int MIN_TREEIFY_CAPACITY = 64;//链表转化为红黑树的条件二,节点总数(键值对)需>64 private static final int MIN_TRANSFER_STRIDE = 16; private static int RESIZE_STAMP_BITS = 16; private static final int MAX_RESIZERS = (1 << (32 - RESIZE_STAMP_BITS)) - 1; private static final int RESIZE_STAMP_SHIFT = 32 - RESIZE_STAMP_BITS; static final int MOVED = -1; static final int TREEBIN = -2; static final int RESERVED = -3; static final int HASH_BITS = 0x7fffffff; static final int NCPU = Runtime.getRuntime().availableProcessors(); transient volatile Node<K,V>[] table; private transient volatile Node<K,V>[] nextTable; private transient volatile long baseCount; private transient volatile int sizeCtl; private transient volatile int transferIndex; private transient volatile int cellsBusy; private transient volatile CounterCell[] counterCells; private transient KeySetView<K,V> keySet; private transient ValuesView<K,V> values; private transient EntrySetView<K,V> entrySet; private static final sun.misc.Unsafe U; private static final long SIZECTL; private static final long TRANSFERINDEX; private static final long BASECOUNT; private static final long CELLSBUSY; private static final long CELLVALUE; private static final long ABASE; private static final int ASHIFT;