分享

Java,数据结构和算法,八大数据结构,哈希表HashMap

 zhuxrgf 2021-02-14

Java,数据结构和算法,八大数据结构,哈希表HashMap

IT小奋斗2021-02-13 20:05:06

散列表(Hash table,也叫哈希表)

根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

Java,数据结构和算法,八大数据结构,哈希表HashMap

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数组元素加锁,可以减少并发冲突的概率,提高并发性能;

Java,数据结构和算法,八大数据结构,哈希表HashMap

案例代码:

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); } }
收藏
举报
0 条评论

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多