hashmap

67 阅读1分钟

说说对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),降低了锁粒度,让并发度大大提高。