set接口、Hsahset、LinkedHashSet、TreeSet接口

一、set接口

1、概述

一个不包含重复元素的collection。

Set集合:元素是唯一的,并且元素的顺序是无序的集合

利用子类Hashset去实现set接口

Set<String> set1 = new HashSet<>();
        //向集合中添加元素
        set1.add("hello");
        set1.add("world");
        set1.add("java");
        set1.add("bigdata");
        set1.add("hello");
        //遍历,结果是无序的去重的。
        for(String s : set1){
            System.out.println(s);
        }

2、Hsahset

1、概述:底层数据结构式哈希表(元素是链表的数组),

2、集合中会不会去重取决于元素类有没有重写hashCode()方法和equals()方法

3、LinkedHashSet

1、概述:继承HashSet,实现了Set接口

    (1)底层数据结构是哈希表和链表

    (2)哈希表保证元素的唯一

    (3)链表保证了元素的有序(存储和取出的顺序一致)

    (4)线程不安全,效率高

LinkedHashSet<String> set1 = new LinkedHashSet<>();

        //添加元素到集合
        set1.add("hello");
        set1.add("world");
        set1.add("java");
        set1.add("bigdata");
        set1.add("hello");

        //遍历
        for(String s : set1){
            System.out.println(s);
        }
结果
hello
world
java
bigdata

4、TreeSet接口

1、特点:元素唯一,元素可以按照某种规则进行排序

                自然排序:无参构造,自定义类实在Comparable接口,重写Comparato方法,在Comparato方法中自定义规则。

                比较器排序:有参构造,可以使用匿名内部类实现Comparator接口,里面重写Compare方法自定义规则。

2、使用元素的自然顺序对元素进行排序 或者(比较器排序)根据创建 set 时提供的 Comparator 进行排序 具体取决于使用的构造方法,定义的TreeSet是无参构造则是自然排序,若定义的是有参构造则是比较器排序。

3、自然排序:用其他类定义集合元素,在定义类中要实现Comparable接口,重写Comparato方法,不然会进行自然排序,报错,重写Comparato方法可以自定义规则实现去重和排序。

public class Student4 implements Comparable<Student4> {//实现Comparable接口。
    private String name;
    private int age;

    public Student4() {
    }

    public Student4(String name, int age) {
        this.name = name;
        this.age = age;
    }
   @Override
    public String toString() {
        return "Student4{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    
    @Override
    public int compareTo(Student4 o) {//自定义规则

        //主要条件:姓名的长度排序
        int i = this.name.length() - o.name.length();
        //长度一样,姓名内容不一定一样
        int i2 = i == 0 ? this.name.compareTo(o.name) : i;
        //姓名内容一样,年龄的大小不一定一样
        int i3 = i2 == 0 ? this.age - o.age : i2;

        return i3;

    }
}
public class TreeSetDemo3 {
    public static void main(String[] args) {
        //创建TreeSet集合对象
        TreeSet<Student4> set = new TreeSet<>();

        //创建学生对象
        Student4 s1 = new Student4("mingwang", 18);
        Student4 s2 = new Student4("wangyu", 19);
        Student4 s3 = new Student4("zhoujiaxiang", 17);
        Student4 s4 = new Student4("zhangbaogui", 18);
        Student4 s5 = new Student4("liuzhicheng", 18);
        Student4 s6 = new Student4("wangyu", 20);

        //将学生对象添加到集合中
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s5);
        set.add(s6);

        for(Student4 student4 : set){
            System.out.println(student4);
        }
    }
}
Student4{name='wangyu', age=19}
Student4{name='wangyu', age=20}
Student4{name='mingwang', age=18}
Student4{name='liuzhicheng', age=18}
Student4{name='zhangbaogui', age=18}
Student4{name='zhoujiaxiang', age=17}

4、比较器排序:利用TreeSet创建对象时的带参数的构造方法来进行比较器排序 TreeSet(Comparator<? super E> comparator)

public class TreeSetDemo4 {
    public static void main(String[] args) {
        //匿名内部类实现Comparator接口
        TreeSet<Student5> set = new TreeSet<>(new Comparator<Student5>() {
            @Override
            public int compare(Student5 o1, Student5 o2) {
                //        return 0;
                //主要条件:姓名的长度排序
                int i = o1.getName().length() - o2.getName().length();
//        return i;
                //长度一样,姓名内容不一定一样
                int i2 = i == 0 ? o1.getName().compareTo(o2.getName()) : i;
                //姓名内容一样,年龄的大小不一定一样
                int i3 = i2 == 0 ? o1.getAge() - o2.getAge() : i2;

                return i3;
            }
        });
        
        //创建学生对象
        Student5 s1 = new Student5("mingwang", 18);
        Student5 s2 = new Student5("wangyu", 19);
        Student5 s3 = new Student5("zhoujiaxiang", 17);

        //将学生对象添加到集合中
        set.add(s1);
        set.add(s2);
        set.add(s3);
        
        for(Student5 Student5 : set){
            System.out.println(Student5);
        }



    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值