散列表(Hash table,也叫哈希表)
根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
HashMap重要参数说明:
1、initSize-->初始化大小
2、expansionFactor-->扩容因子
3、expansionMode-->扩容模式
当且仅当:实际大小乘以扩容因子小于长度(size*expansionFactor <= length),进行扩容,扩容为原来的2倍;
其他说明:
如果扩容因子越大,碰撞的概率也就越大,发生碰撞后的代价也更大,结果导致效率大打折扣。
因此扩容因子=0.75也是一个空间换时间的考虑,0.75这个数值应该是经过充分的考虑决定的。
ConcurrentHashMap
ConcurrentHashMap在性能以及安全性方面,明显比Collections.synchronizedMap()更加有优势;
1、SynchronizedMap的put封装了HashMap的put方法,并加上互斥锁保证了安全性;
2、JDK1.8的ConcurrentHashMap取消了segments字段,采用了transient volatile HashEntry<K,V>[] table保存数据;
· static class Segment<K,V> extends ReentrantLock implements Serializable;
· 这样对每个table数组元素加锁,可以减少并发冲突的概率,提高并发性能;
案例代码:
import java.io.Serializable;
import com.what21.structure.map.hashmap.case01.mode01.MyMap;
public class SynchronizedMap<K, V> implements MyMap<K, V>, Serializable {
private static final long serialVersionUID = 1L;
private MyMap<K, V> myMap;
final Object mutex;
public SynchronizedMap(MyMap<K, V> myMap) {
this.myMap = myMap;
this.mutex = this;
}
/**
* @param myMap
* @param mutex-->互斥锁
*/
public SynchronizedMap(MyMap<K, V> myMap, Object mutex) {
this.myMap = myMap;
this.mutex = mutex;
}
@Override
public void put(K key, V value) {
synchronized (mutex) {
this.myMap.put(key, value);
}
}
@Override
public V get(K key) {
synchronized (mutex) {
return this.myMap.get(key);
}
}
@Override
public void remove(K key) {
synchronized (mutex) {
this.myMap.remove(key);
}
}
@Override
public int size() {
synchronized (mutex) {
return this.myMap.size();
}
}
@Override
public void print() {
synchronized (mutex) {
this.myMap.print();
}
}
}
public class SynchronizedMapDemo {
public static void main(String[] args) {
MyMap<Integer, String> hashMap = new SynchronizedMap<>(new MyHashMap<Integer, String>());
System.out.println(hashMap);
for (int i = 1; i < 40; i ) {
hashMap.put(i, 'value:' i);
}
hashMap.print();
}
}
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapDemo {
public static void main(String[] args) {
Map<Integer, String> hashMap = new ConcurrentHashMap<Integer, String>();
System.out.println(hashMap);
for (int i = 1; i < 40; i ) {
hashMap.put(i, 'value:' i);
}
System.out.println(hashMap);
}
}