HashSet、TreeSet、LinkedHashSet的区别

1、HashSet

1.实现方式:基于哈希表(HashMap)实现

2.不允许重复,可以有一个null元素

3.不保证顺序恒久不变

4.添加元素时把元素作为HashMap的key存储,HashMap的value使用一个固定的Object对象

5.排除重复元素是通过equals来判断元素是否相同

6.判断两个对象是否相同,先判断两个对象的hashCode是否相同(如果两个对象的hashcode相同,不一定是同一个对象,如果不同,那一定不是同一个对象),如果不同,则两个对象不是同一个对象,如果相同还要进行equals判断,equals相同则是同一个对象,不同则不是同一个对象

7.自定义对象要重写hashcode方法和equals对象

小结:

(1)哈希表的存储结构:数组加链表,数组里的每个元素以链表的形式存储

(2)如何把对象存储到哈希表中,先计算对象的hashCode值,再对数组的长度求余数,来决定对象要存储在数组中的哪个位置

(3)解决hashSet中的重复值使用的方式是,参考第6点

基本使用:

写一个实体类(重新equals和hashcode方法)

class Cat {private String name;private int age;private int id;public Cat(String name, int age, int id) {this.name = name;this.age = age;this.id = id;}// get,set,toString()// 需要重写hashcode()和equals()方法@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}Cat cat = (Cat) o;return age == cat.age && id == cat.id && name.equals(cat.name);}@Overridepublic int hashCode() {return Objects.hash(name, age, id);}
}

使用HashSet:

    private static void hashSet() {Set<String> set = new HashSet<>();set.add("飞飞");set.add("亮亮");// 不可重复set.add("亮亮");set.add("关关");set.add("曹操");set.add("备备");set.add(null);set.add(null);String[] strings = set.toArray(new String[]{});for (String s : strings) {System.out.println(s);}Cat c1 = new Cat("miaomiao", 4, 1);Cat c2 = new Cat("huahua", 3, 2);Cat c3 = new Cat("tom", 5, 3);// 需要重写hashcode()方法和equals方法Cat c4 = new Cat("tom", 5, 3);Set<Cat> cats = new HashSet<>();cats.add(c1);cats.add(c2);cats.add(c3);cats.add(c4);//cats.add(c4);System.out.println(cats.size());}

2、TreeSet

1、有序的,基于TreeMap(二叉树数据结构),对象需要比较大小,通过对象比较器来实现

2、对象比较器还可以用来去除重复元素,如果自定义的类,没有实现比较器接口,将无法添加到TreeSet集合中

基本使用:

 */private static void treeSet() {Cat c1 = new Cat("miaomiao", 4, 1);Cat c2 = new Cat("huahua", 3, 2);Cat c3 = new Cat("tom", 5, 3);Cat c4 = new Cat("Tom", 4, 1);//指定排序规则,先按照id,再年龄,再姓名Set<Cat> cats = new TreeSet<>((o1, o2) -> {if (o1.getId() != o2.getId()) {return o1.getId() - o2.getId();}if (o1.getAge() != o2.getAge()) {return o1.getAge() - o2.getAge();}return o1.getName().compareTo(o2.getName());});cats.add(c1);cats.add(c2);cats.add(c3);cats.add(c4);System.out.println(cats);}

3、LinkedHashSet

1、哈希表和链表列表来实现

2、维护着一个运行与所有条目的双重链表列表,此链表定义了迭代顺序,即按照将元素插入到set中的顺序(插入顺序)进行迭代

简单使用:

   private static void linkedHashSet(){Cat c1 = new Cat("miaomiao", 4, 1);Cat c2 = new Cat("huahua", 3, 2);Cat c3 = new Cat("tom", 5, 3);Cat c4 = new Cat("Tom", 4, 1);Set<Cat> cats = new LinkedHashSet<>();cats.add(c1);cats.add(c2);cats.add(c3);cats.add(c4);System.out.println(cats);}

4、如何选择?

如果要排序,选择TreeSet

如果不要排序,也不要保证顺序,选择HashSet

如果不要排序,要保证顺序,选择LinkedHashSet

HashSet、TreeSet、LinkedHashSet的区别相关推荐

  1. Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]

    ------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...

  2. Java容器---Set: HashSet TreeSet LinkedHashSet

    1.Set接口概述        Set 不保存重复的元素(如何判断元素相同呢?).如果你试图将相同对象的多个实例添加到Set中,那么它就会阻止这种重复现象. Set中最常被使用的是测试归属性,你可以 ...

  3. 【JAVA基础】HashSet、LinkedHashSet、TreeSet使用区别

    [JAVA基础]HashSet.LinkedHashSet.TreeSet使用区别 HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHash ...

  4. Day48(List接口,ArrayList,LinkedList,Vector,Set接口,HashSet,LinkedHashSet,TreeSet,自然排序,定制排序)

    Collection子接口之一:List接口 List接口概述 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组 List集合类中元素有序.且可重复,集合中的每个元素都有其对应的顺 ...

  5. Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet

    Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合与Collection基本上完全一样,它没有提供任何额外的方法. Se ...

  6. Java 之HashSet、LinkedHashSet、TreeSet比较

    4.HashSet.LinkedHashSet.TreeSet比较 Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不 ...

  7. HashSet、LinkedHashSet、TreeSet

    以下内容基于jdk1.7.0_79源码: 关于HashSet.LinkedHashSet.TreeSet Set接口的实现类,最大特点是不允许出现重复元素: HashSet:基于HashMap实现,一 ...

  8. 源码分析-HashSet、LinkedHashSet

    基本特性 HashSet的是依靠组合一个HashMap实现的.然后讲大部分任务都委托给HashMap完成.  当然,HashSet不保证迭代顺序与添加顺序相同,而且也不保证其顺序不变.允许空元素.  ...

  9. HashMap,HashTable,TreeMap,HashSet,TreeSet

    注意:最好先看一下(三)中 树红黑树的数据结构分析,可以的话数组,链表的数据结构也先复习一下,这里默认你懂数组,链表 2.2 map Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对 ...

  10. HashSet及LinkedHashSet源码分析(基于JDK1.6)

    Java容器类的用途是"保存对象",分为两类:Map--存储"键值对"组成的对象:Collection--存储独立元素.Collection又可以分为List和 ...

最新文章

  1. pyglet and opengl -- 纹理映射以及动画
  2. .NET Core 3.0中的数据库驱动框架System.Data
  3. NetBeans 7.1:创建自定义提示
  4. Python-关于正则表达式的总结
  5. xul中的快捷键及命令响应
  6. java8 optional使用_[Java8]如何正确使用Optional
  7. 杂谈异常处理try-catch-finally
  8. 小甲鱼python课后题答案_小甲鱼python课后题
  9. cad如何打开stp文件_stp是什么文件?怎么打开stp文件?
  10. 采样准则(时间采样与采样频率)的选取
  11. Progress进度条
  12. android 自定义吐司,[Android开发]Android 自定义Toast
  13. sql server触发器写法
  14. node.js 基础
  15. 申宝理财-指数全天探底回升
  16. LG OnScreen Control 软件提示‘镜像显示器‘ BUG
  17. Viewpager+Fragment+webview中的输入框不弹出软键盘的坑
  18. 卸载 金山毒霸 的方法
  19. RocketMQ消息刷盘
  20. 支持向量机之线性可分问题

热门文章

  1. [算法]在数组中找到一个局部最小的位置
  2. 如何使用Python3连接MySQL
  3. List、Set和Map的简单理解
  4. Java中的DES加密与解密工具类
  5. mysql中in和exists区别
  6. Spring依赖注入@Autowired原理解析(一)之寻找需要注入的属性
  7. Autoware docker 环境安装
  8. html5 Ajax 访问.net WebApi获取视频流
  9. 采用C#泛型实现数据库之间的切换
  10. 基于IdentityServer4的单点登录——IdentityServer