HashSet/HashMap、TreeSet/TreeMap、LinkedHashSet/LinkedHashMap 区别

Map 集合中保存 Key-value 对形式的元素,访问时只能根据每项元素的 key 来访问其 value

Set 集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)


一、Map接口

Map 是一个映射接口,即 key-value 键值对。Map 中的每一个元素包含 “一个 key” 和 “key 对应的 value”。AbstractMap 是个抽象类,它实现了 Map 接口中的大部分 API。而 HashMap,TreeMap,都是继承于 AbstractMap。


二、Map实现类

HashMap 可实现快速存储和检索,但其缺点是其包含的元素是无序的,这导致它在存在大量迭代的情况下表现不佳。

LinkedHashMap 保留了 HashMap 的优势,且其包含的元素是有序的。它在有大量迭代的情况下表现更好。

TreeMap 能便捷的实现对其内部元素的各种排序,但其一般性能比前两种 map 差。

LinkedHashMap 映射减少了 HashMap 排序中的混乱,且不会导致 TreeMap 的性能损失。

HashMap、LinkedHashMap、TreeMap三者均线程不安全


三、Set 接口

1.Set 不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add 方法返回 false(注意,是add的返回值为false,并未报错,只是该重复的元素并未加入其中)。

2.Set 判断两个对象相同不是使用 == 运算符,而是根据 equals 方法。也就是说,只要两个对象用 equals 方法比较返回 true,Set 就不会接受这两个对象。


四、Set的实现类

Set 的实现类有 HastSet 和 TreeSet。 HashSet 依赖于 HashMap,它实际上是通过 HashMap 实现的;TreeSet 依赖于 TreeMap,它实际上是通过 TreeMap 实现的。LinkedHashSet是HashSet的实现类。

在这里插入图片描述

1.HashSet:元素无序。
比如存入 a、e、c、d、b,输出 d、e、b、c、a。

2.LinkedHashSet:怎么存进去,怎么出来。
比如存入 a、e、c、d、b,输出 a、e、c、d、b。

3.TreeSet:排好序的输出。
比如存入 a、e、c、d、b,输出 a、b、c、d、e。

总体而言,如果你需要一个访问快速的 Set,你应该使用 HashSet;当你需要一个排序的 Set,你应该使用 TreeSet;当你需要记录下插入时的顺序时,你应该使用 LinedHashSet。同时,比起map所有的set都是带有去重功能的,同时三者均是非线程安全


综合考虑

去重需求的考虑set实现类,在根据具体情况(排序——TreeSet、按存入顺序——LinkedHashSet,性能——HashSet)考虑具体实现类,如果没有去重需求,则考虑map,map的性能整体比set要好,因为set的底层实现是map。


补充:

Set<Integer> set = new TreeSet<>(Comparator.reverseOrder());
Map<String,Integer> map = new TreeMap<>(Comparator.reverseOrder());

在Tree对象声明的时候,可以调用comparator类的reverseOrder方法实现倒序存储

发布了147 篇原创文章 · 获赞 835 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/qq_33945246/article/details/103865257