ConcurrentHashMap和HashMap和HashTable
来源:互联网 发布:如何评价王毅 知乎 编辑:程序博客网 时间:2024/06/09 13:09
ConcurrentHashMap
它包含了一个Segment数组,每个Segment包含一个HashEntity数组,加锁时候是加在Segment对象上
构造函数:
public ConcurrentHashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);// }
DEFAULT_INITIAL_CAPACITY和DEFAULT_CONCURRENCY_LEVEL默认为16
DEFAULT_LOAD_FACTOR 默认加载因子为0.75
调用的是下边这个构造函数
public ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) {// if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0) throw new IllegalArgumentException(); if (concurrencyLevel > MAX_SEGMENTS) concurrencyLevel = MAX_SEGMENTS; // Find power-of-two sizes best matching arguments int sshift = 0; int ssize = 1; while (ssize < concurrencyLevel) { ++sshift; ssize <<= 1;//左移一位 } segmentShift = 32 - sshift; segmentMask = ssize - 1; this.segments = Segment.newArray(ssize);//初始化数组长度ssize等于16 if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; int c = initialCapacity / ssize; if (c * ssize < initialCapacity) ++c; int cap = 1; while (cap < c) cap <<= 1; for (int i = 0; i < this.segments.length; ++i) this.segments[i] = new Segment<K,V>(cap, loadFactor);//初始化数组元素 cap是初始数组长度为1 ,loadFactor是加载因子为0.75 }
看下:
Segment主要元素
transient volatile HashEntry<K,V>[] table;
构造方法:
Segment(int initialCapacity, float lf) { //加载因子传多少都没用,默认是1f loadFactor = lf; setTable(HashEntry.<K,V>newArray(initialCapacity)); //根据长度初始化数组 }
static final class HashEntry<K,V> { final K key; final int hash; volatile V value;//保证修改value时候对多线程的可见性 final HashEntry<K,V> next; HashEntry(K key, int hash, HashEntry<K,V> next, V value) { this.key = key; this.hash = hash; this.next = next; this.value = value; }@SuppressWarnings("unchecked")static final <K,V> HashEntry<K,V>[] newArray(int i) { return new HashEntry[i];} }是不是跟HashMap的内部类Entity一样
整体结构如下
参考:http://ifeve.com/concurrenthashmap/
阅读全文
0 0
- HashMap HashTable和ConcurrentHashMap
- ConcurrentHashMap和HashMap和HashTable
- ConcurrentHashMap和HashMap和HashTable
- HashMap、HashTable和ConcurrentHashMap一知半解
- HashTable和HashMap和ConcurrentHashMap的区别
- HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
- HashMap HashTable和ConcurrentHashMap的区别
- HashMap HashTable和ConcurrentHashMap的区别
- ConcurrentHashMap,HashTable和Synchronized HashMap比较
- HashMap、HashTable和ConcurrentHashMap的区别
- HashMap和Hashtable以及ConcurrentHashMap的区别
- HashMap、Hashtable、HashSet 和 ConcurrentHashMap 的比较
- HashMap,HashTable和ConcurrentHashMap的区别
- HashMap,Hashtable,ConcurrentHashMap和synchronized Map
- HashMap和HashTable的区别,HashTable和ConcurrentHashMap的区别
- Hashtable 和 HashMap和concurrentHashMap和collections.synchronizedMap
- HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
- HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
- 数据结构平衡树汇总(AVL 红黑树 Treap B树 B+树 2-3 2-4)
- 自定义IOS系统弹框
- SVN更新时每个字母代表的含义
- RANSAC Fitting
- 关于memset初始化填充数组。
- ConcurrentHashMap和HashMap和HashTable
- Collection接口的常用方法
- linux 无线网卡的连接(命令行) —— network-manager(nmcli)
- java 解析SOAP字符串指定标签转换为实体类
- tcp协议系列文章(4):TCP带宽,时延和RTT等的关系
- Kotlin扩展函数与重载操作符解析
- 并发编程cas的aba问题
- ButterKnife的用法
- 让unittest框架在fail时自动截图的装饰器