8、java集合 set

特点:无序,无下标、元素不可重复

全部继承collection方法。

1、HashSet

存储结构:数组+链表+红黑树

存储过程:1、根据hashCode计算存储位置,如果位置为空,择直接保存,如果不为空执行第二步

                  2、再执行equals方法,如果equals为true则认为重复,否则形成链表。

                        在对象中可以重写equals和hashCode方法,达到更多的防止重复的效果。

Set<String> set = new HashSet<String>();

@Override   //重新equals方法
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Student)) return false;
    Student student = (Student) o;
    return getAge() == student.getAge() && Objects.equals(getName(), student.getName()) && Objects.equals(getSex(), student.getSex());
}

@Override  //重新hashCode方法
public int hashCode() {
    return Objects.hash(getName(), getSex(), getAge());
}

2、TreeSet    红黑树

基于排列顺序实现元素不重复

实现了SortedSet接口对集合元素自动排序。

元素对象的类型必须实现Comparable接口,指定排列顺序,compareTo() 返回0,认为重复。

通过CompareTo方法确定是否为重复元素。

(1)使用Comparable接口实现比较

implements Comparable<Student> //实现接口

@Override //重写方法,添加判断条件
public int compareTo(Student o) {
    int n1=this.getName().compareTo(o.getName());
    int n2=this.getSex().compareTo(o.getSex());
    int n3=this.getAge()-o.getAge();
    return n1==0?(n2==0?n3:n2):n1;
}

(2)使用Comparator 实现定制比较(比较器)

1、创建集合并指定比较规则,优先级高于Comparable接口,可以定制化比较规则,自己定义。

Set<Student> set = new TreeSet<>(new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        int n1=o1.getName().compareTo(o2.getName());
        int n2=o1.getSex().compareTo(o2.getSex());
        int n3=o1.getAge()-o2.getAge();
        return n1==0?(n2==0?n3:n2):n1;
    }
});

自定义比较规则,按照字符串长度排序。

Set<String> set = new TreeSet<String>(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        int n1 = o1.length()-o2.length();
        int n2 = o1.compareTo(o2);
        return n1==0?n2:n1;
    }
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值