Java中常用的Map类有HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap等。
- HashMap
HashMap是基于哈希表实现的Map,它采用了数组+链表(或红黑树)的数据结构。HashMap中的键值对没有固定的顺序,允许存在一个null键和多个null值。HashMap的性能较好,在大多数场景下都能满足需求。HashMap是非线程安全的,因此在并发场景下需要进行同步处理。
- TreeMap
TreeMap是基于红黑树实现的Map,它对键进行排序,因此在遍历时会按照键的自然顺序或者自定义的顺序进行遍历。TreeMap的性能相对较低,适合在键需要排序的场景下使用。
- LinkedHashMap
LinkedHashMap是基于哈希表和链表实现的Map,它可以维护键值对的插入顺序,或者按照最近访问的顺序进行遍历。LinkedHashMap是非线程安全的。
- ConcurrentHashMap
ConcurrentHashMap是Java并发包中提供的线程安全的Map,它采用了锁分段技术,将整个Map分成若干个段,每个段都可以被一个线程独立访问,从而实现了高并发下的安全性和效率。ConcurrentHashMap在并发场景下的性能远优于HashMap和Hashtable,但在单线程场景下会略逊于HashMap。
在并发场景下,除了ConcurrentHashMap之外,还可以使用Java8中新增的ConcurrentHashMap的替代品ConcurrentHashMapV8、Google Guava中的ConcurrentHashMultimap等并发Map类。
这些Map的内部原理大多基于哈希表实现,其中HashMap是最常用的一种,其底层数据结构是一个数组加上链表(或红黑树),通过计算键的hashCode来确定其在数组中的位置,并通过链表或红黑树解决哈希冲突。HashMap的默认容量为16,加载因子为0.75,当Map的大小超过容量*加载因子时,会进行扩容。HashMap在多线程并发访问时不是线程安全的,因此需要进行同步操作,或者使用线程安全的ConcurrentHashMap。同时,HashMap和其他哈希表实现的Map,在键的hashCode相等时,还需要通过equals方法来比较键的值是否相等。