本文最后更新于 1862 天前,其中的信息可能已经有所发展或是发生改变。
Map
- 主要用于存储健值对,根据键得到值,因此不允许键重复 (重复了就覆盖), 但允许值重复。java 为数据结构中的映射定义了一个接口 java.util.Map; 它有四个实现类,分别是 HashMap Hashtable LinkedHashMap 和 TreeMap.
- Map 可以 put 同一个 key,后者覆盖前者
Map<String,String> map=new HashMap<>(); map.put("one","s1"); map.put("one","s2");
- 遍历 Map,获取所有 key
Set<Object> keSet = myMap.keySet();
Hashmap
- HashMap 是一个最常用的 Map, 它根据键的 HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。
- HashMap 最多只允许一条记录的键为 Null; 允许多条记录的值为 Null;
- HashMap 不支持线程的同步,即任一时刻可以有多个线程同时写 HashMap; 可能会导致数据的不一致。如果需要同步,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有同步的能力,或者使用 ConcurrentHashMap。
- 哈希表的主干就是数组。
比如我们要新增或查找某个元素,我们通过把当前元素的关键字 通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作。
哈希冲突,也叫哈希碰撞,HashMap 即是采用了链地址法,也就是数组 + 链表的方式。
Hashtable
- Hashtable 与 HashMap 类似,它继承自 Dictionary 类
- 它不允许记录的键或者值为空;
- 它支持线程的同步,即任一时刻只有一个线程能写 Hashtable, 因此也导致了 Hashtable 在写入时会比较慢。
LinkedHashMap
- LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator 遍历 LinkedHashMap 时,先得到的记录肯定是先插入的。也可以在构造时用带参数,按照应用次数排序。
- 在遍历的时候会比 HashMap 慢,不过有种情况例外,当 HashMap 容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap 慢,因为 LinkedHashMap 的遍历速度只和实际数据有关,和容量无关,而 HashMap 的遍历速度和他的容量有关。
TreeMap
- TreeMap 实现 SortMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。
一般情况下,我们用的最多的是 HashMap, 在 Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么 TreeMap 会更好。如果需要输出的顺序和输入的相同,那么用 LinkedHashMap 可以实现,它还可以按读取顺序来排列。如果需要线程安全,那就要 HashTable。