说说对hashmap的理解
- jdk1.8之前使用数据+链表(插入头插法)
- jdk1.8之后使用数组+链表+红黑树(节点数>8)(插入尾插法)
HashMap的hash函数设计是怎样的?
hash函数是先拿到key的hashcode,是一个32位的值,然后让hashcode的高16位与低16位进行异或操作,减少hash冲突
Hashmap是线程安全的吗?
- 不安全
- Java中有HashTable、Collections.synchronizedMap、以及ConcurrentHashMap可以实现线程安全的Map。
- HashTable是直接在操作方法上加synchronized关键字,锁住整个数组,粒度比较大;
- Collections.synchronizedMap是使用Collections集合工具的内部类,通过传入Map封装出一个SynchronizedMap对象,内部定义了一个对象锁,方法内通过对象锁实现;
- ConcurrentHashMap使用分段锁(1.7)自旋锁(1.8),降低了锁粒度,让并发度大大提高。