【Java学习】Java学习之HashMap分析与理解
来源:互联网 发布:淘宝图片优化软件 编辑:程序博客网 时间:2024/06/06 07:27
HashMap知识
1.基础知识
- 数据结构:数组+链表+红黑树(JDK1.8);
- hash表存储数据,使用开放地址法和链地址法来解决hash冲突。Java中的HashMap使用的是链地址法,即数组+链表,在每个数组元素上都有一个链表结构,先获取数据hash值得到数组下标,然后把数据放在链表后面。为了避免存放位置一致即Hash碰撞,这就需要优秀的Hash算法以及扩容机制。
- HashMap根据键的hashCode存储数据,但不保证获取数据顺序与存储一致;
- 允许最多一条键为null,但值允许多个null;
- 初始化长度length为16,负载因子Load factor为0.75,HashMap能够容纳的最大数据量键值对threshold为length*Load factor。超过最大容量就需要进行resize扩容,扩容后是之前的两倍。在阿里巴巴开发规范中建议初始化时定义length。
- 为解决拉链过长,JDK1.8中加入了红黑树,当链表长度过长(默认超过8),链表就会转换为增删改查速度快的红黑树提高对它的操作性能。
2.线程安全
2.1Collections.synchronizedMap()
HashMap是线程不安全的,可以使用Collections.synchronizedMap()方法进行包装普通HashMap。
Map<String,Object> map = new HashMap<String,Object>(16); Map<String, Object> synchronizedMap = Collections.synchronizedMap(map);
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { return new SynchronizedMap<>(m); }
通过mutex实现对该m的互斥操作,来保证线程安全,但是在多线程条件下性能有些不足,每次的操作都需要获取mutex的锁。
private static class SynchronizedMap<K,V> implements Map<K,V>, Serializable { private static final long serialVersionUID = 1978198479659022715L; private final Map<K,V> m; // Backing Map final Object mutex; // Object on which to synchronize SynchronizedMap(Map<K,V> m) { this.m = Objects.requireNonNull(m); mutex = this; } SynchronizedMap(Map<K,V> m, Object mutex) { this.m = m; this.mutex = mutex; }get方法:需要先获取mutex的锁。
public V get(Object key) { synchronized (mutex) {return m.get(key);} }
2.2使用分段锁的ConcurrentHashMap
使用减少锁粒度的方法来削弱多线程锁的竞争,因此ConcurrentHashMap内部细分了若干个小的HashMap,默认情况下为16段。比如put时,根据hashcode判断需要放进的段,然后对之加锁来完成put操作。多线程下,只要被加入的数据不存放在同一个段中,即能有效提高性能。获取全局的信息比如size时,需要同时获得所有段的锁才能计算size(一般先用无锁方式进行获取)。
3.比对
Map接口
阅读全文
0 0
- 【Java学习】Java学习之HashMap分析与理解
- java学习之hashMap
- Java之HashMap学习
- Java学习之HashMap
- Java之HashMap学习
- Java学习之Map与HashMap
- Java学习笔记之HashMap
- java 集合学习之hashMap
- JAVA学习之HashMap原理
- 深入学习Java之HashMap
- java学习-[转]HashMap实现原理分析
- Java-Collections Framework学习与总结-HashMap
- Java容器 HashMap与HashSet的学习
- java学习之HashMap和Hashtable
- java学习之集合---浅析HashMap
- JDK1.8源码学习之 HashMap.java
- 【Java语言学习】之HashMap遍历方法
- java源码学习之HashMap(一)
- 浮点运算
- 浅析TCP三次握手和四次握手
- laravel Request方法(2)
- 深入浅出认识Hive
- ACM训练 算法集锦
- 【Java学习】Java学习之HashMap分析与理解
- Tomcat部署项目乱码
- Redis vs Memcached
- eclipse中,我该如何编译一个javabean文件 出现org.apache.jasper.JasperException异常
- CSDN-markdown编辑器的使用方法大全
- vs-code tips
- fast_rcnn
- freemarker 模板配制及使用
- 转C++日记(1)