Java-Set集合(1)

HashSet

  • HashSet方法可以保证元素的唯一性,但是前提是需要重写equals和hashcode方法。由于HashSet底层是数据结构是哈希表,而哈希表可以保证元素的唯一。
  HashSet stu = new HashSet<>();

        stu.add(new Student("熊大",18));
        stu.add(new Student("熊二",19));
        stu.add(new Student("光头强",19));
        stu.add(new Student("熊大",18));

        for(Student s:stu){
            System.out.println(s);
        }
    }
//会发现的是,这样输出是会报错的,这是因为HashSet方法必须要重写equals和hashcode方法,如果Student类没有重写这两个方法,会报错。

//Student类

public class Student {

    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=" + name +
                ", age=" + age +
                '}';
    }
}

LinkedHashSet

  • LinkedHashSet :元素有序(元素存取顺序)且唯一 ,底层数据结构是链表和哈希表。链表保证元素有序,哈希表保证元素唯一。
public class MyTest {
    public static void main(String[] args) {

        LinkedHashSet list = new LinkedHashSet<>();
        list.add(Integer.valueOf(1));
        list.add(4);
        list.add(2);
        list.add(5);
        list.add(3);
        list.add(5);
        list.add(1);
        list.add(2);
        System.out.println(list);
        // [1, 4, 2, 5, 3]
    }
}

TreeSet

  • TreeSet:元素唯一 且能对元素进行排序
public class MyTest {
    public static void main(String[] args) {

        //TreeSet 元素唯一的 且还能排序
        TreeSet treeSet = new TreeSet<>();
        treeSet.add(6);
        treeSet.add(6);
        treeSet.add(2);
        treeSet.add(1);
        treeSet.add(7);
        treeSet.add(9);
        treeSet.add(10);
        treeSet.add(8);
        treeSet.add(5);
        treeSet.add(4);
        treeSet.add(3);

        for(Integer num:treeSet){
            System.out.print(num+" ");
        }
        // 1 2 3 4 5 6 7 8 9 10 
    }
}
  • TreeSet排序的方式有两种
    (1)自然排序 TreeSet 空参构造采用的就是自然排序
    (2)比较器排序 TreeSet 有参构造采用的是 比较器排序
  • 自然排序:
    之所以TreeSet 采用自然排序,能够对元素进行排序是因为元素实现了Compareble接口,并且重写了compareTo(T o) 这个方法实现的排序。如果元素不重写此接口中的方法,那么在存元素的时候,就会报错,而我们的String 和 Integer 都默认实现了Compareble接口并重写了compareTo(T o) 这个方法。
Student类
public class Student implements Comparable{
    private String name;
    private int age;


    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    //比较的方法
    @Override
    public int compareTo(Student o) {
        //只关心返回值的 正 负 和 0
       //如果说年龄相同时,并不能说明你是同一个对象,还得比较姓名


        return -(this.age==o.age?this.name.compareTo(o.name):this.age-o.age);

    }
}

Test类
public class MyTest2 {
    public static void main(String[] args) {
        //元素该往树的跟节点的左边放还是右边放,还有不往里面放是根据compareTo(T o)方法的返回值来决定的,如果compareTo(T o)返回0 就不往里面存
        TreeSet t = new TreeSet<>();
        t.add(new Student("张三",23));
        t.add(new Student("李四",24));
        t.add(new Student("小明",24));
        t.add(new Student("张三",23));
        t.add(new Student("王武",25));
        t.add(new Student("田七",27));
        t.add(new Student("赵六",26));

        for(Student stu:t){
            System.out.println(stu);

        }

你可能感兴趣的:(java基础知识)