java为数据结构中的映射提供了一个接口 java.util.Map,他有四个实现类,分别是:HashMap、HashTable、LinkedHashTable和TreeMap
Map概述
我们有必要先说上一嘴 映射 是个啥,简单的理解就是一些对应关系,比如:单词表中许多单词和翻译的对应关系、一次数学考试学生姓名和成绩的对应关系等等。而Map集合就可以用来储存他们。我们将这种两个数据的组合称为键值对,Map集合是根据键来取值的,所以不允许重复的键(重复了就会被覆盖掉),但是允许值重复。
HashMap
HashMap是最常用的Map,HashMap由数组和链表来实现对数据的存储(1.8之后还有用到红黑树)。它是根据键的HashCode值储存数据,可以根据键直接获取他所在的位置,所以具有很快的访问速度,它的平均查找速度接近于1。遍历的时候,拿到数据的顺序是完全随机的。HashMap最多只允许一条记录的键为null,不限制值为null的数量。
线程安全方面,HashMap是线程不安全的,也就是说同一时刻可能有多个线程同时写HashMap;可能会导致数据不一致。如果有特殊需求需要加锁,可以直接使用ConcurrentHashMap。
HashTable
HashTable和HashMap很类似,但是和HashMap不同的是,它继承自Dictionary类;它不支持记录的键或者值为空;它支持线程同步,是线程安全的,但是这也导致了HashTable相对速度较慢
LinkedHashMap
他是HashMap的一个子类,通过维护一个运行于所有条目的双向链表,记录元素的插入顺序,在使用 Iterator 遍历的时候,先得到的肯定是先插入的。一般来说LinkedHashMap遍历速度没有HashMap快。但是如果HashMap容量很大,但是实际储存的元素并不多的时候存在HashMap遍历速度比LinkedHashMap慢的可能。因为LinkedHashMap遍历速度只和实际数据量有关,和容量没有关系。
TreeMap
TreeMap底层是使用红黑树实现的,红黑树结构天然支持排序,默认情况下通过Key值的升序进行排序。
总结
一般情况下我们使用HashMap,在Map中插入、删除、查找元素,HashMap可以算最好的选择。如果有排序需求,使用TreeMap。如果对储入和取出顺序有要求可以使用LinkedHashMap。