Collection 之Set接口概述及常用方法

一.Set接口的概述

  • Set接口是Collection的子接口,未额外提供自己的方法,即使用的方法为Collection中的方法

  • Set不允许包含相同的元素,即不可重复性

        如果试加入两个相同元素,则加入失败

  • Set判断是否相等

      不适用 == ,而是使用equals()方法

二.Set接口的实现类

  • HashSet 无序

  • LinkedHashSet

       LinkedHashSet作为HashSet的子类,在添加数据时,每个数据还维护了两个引用,记录此数据的前一个数据和后一个数据 

优点:

     对于频繁的遍历操作,LinkedHashSet效率高于HashSet

  • TreeSet 有序

三.HashSet

  • 作为Set接口的主要实现类

  • 底层为数组和链表,也作为HashMap的单列

  • 按照Hash算法存储集合中的元素,因此具有很好的存取,查找,删除性能

①特点:

  • 不保证元素排列顺序

  • 不是线程安全的

  • 集合元素可为null

②HashSet集合判断元素是否相等,要求既快又安全

  •     当我们使用equals()方法时是线程安全的,但当数据非常多时,需要一个一个进行比较,执行效率非常低;当我们使用hashCode()方法时,执行效率很高,但是线程不安全;所以需要结合equals()和hashCode()方法进行判断元素是否相等
  •     通过hashCode()方法首先进行判断,之后使用equals()方法判断两元素内容是否相等
  •     对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现对象相等规则,即"相等对象必有相等散列码"

四.TreeSet

  • 可以按照对象的指定属性进行排序

  • 必须实现Comparable或Comparator接口

  • 底层结构为二叉树(红黑树),可实现自行旋转

1.向TreeSet中添加的数据,要求是相同类的对象,否则报错(ClassCastException)

      Integer默认按照数字大小排序

      String 默认按照字母顺序排序

2.两种排序方式:

    自然排序和选择排序,即java比较器

①自然排序 : 实现Comparable接口

  • 自然排序中,比较两个对象是否相同的标准为:

      comparTo()返回0,不再是equals()

public int compareTo(Object o){
        if (o instanceof User){
            User user = (User)o;
            return this.name.compareTo(user.name);
        } else {
            throw new RuntimeException("输入类型不匹配!");
        }
    }

②定制排序

  • 使用comparator排序,比较两个对象是否相等的标准为:

        compare()返回0,不再是equals()

Comparator com = new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            if (o1 instanceof User && o2 instanceof User){
                User u1 = (User)o1;
                User u2 = (User)o2;
                return Integer.compare(u1.getAge(),u2.getAge());
            }else {
                throw new RuntimeException("输入类型不匹配");
            }
        }
    }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写代码的菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值