有关hash的几个问题

tim-qtp...大约 2 分钟Java基础集合

1、什么是hash算法:

就是把任意长度的输入通过散列算法变成固定长度的输出,这个输出结果就是一个散列值;

2、hash表是什么:

就是散列表,可以直接通过key访问到内存存储位置的数据结构。

3、hashmap和HashTable的区别:

都是基于hash表实现的k-v结构的集合;

前者不安全,后者安全。

HashTable是jdk1.0引入的一个线程安全的集合类,因为所有数据访问的方法都加入了一个Synchronized同步锁,内部采用数组+链表结构,链表是为了解决hash冲突。

hashmap可以使用null作为key,而hashtable不允许;

所以:

  • ConcurrentHashMapHashtable 的替代方案。它在实现线程安全的同时,通过分段锁机制提高了并发性能,避免了全局锁导致的性能瓶颈。适用于高并发环境。
  • ConcurrentHashMap 的读操作无锁化,写操作则使用了局部锁分段,使得在高并发下性能大大优于 Hashtable

4、ConcurrentHashMap 和 Hashtable 的区别是什么?

因为在线程安全性上的实现方式不同,导致了它们性能上的差别

  • HashtableHashtable 使用的是单一的锁机制(全表锁),即对整个哈希表进行同步,所有的操作(如插入、删除、查找等)都必须通过一个锁(synchronized)来保证线程安全。这种方式使得 Hashtable 在多线程环境下效率较低,因为无论是读取还是写入操作都需要获得锁,无法做到并发访问。
  • ConcurrentHashMap:在 Java 8 中,ConcurrentHashMap 采用了 CAS + synchronized 的方式进行线程安全控制。CAS 用于无锁的写入操作。如果某个 Node 节点为空,则通过 CAS 将数据插入节点。如果不为空,则会退化到 synchronized。使用 synchronized 锁定冲突节点的头结点。这种锁的粒度更细,仅锁住特定的冲突节点,而非整个表,因此在并发访问时性能较好。高的并发性能。