java语言:集合Set

一:Set集合的概述。
Set集合不允许存储相同的元素,而且存取顺序不一致,属于集合的一种。Set集合主要有以下几种HashSet,LinkedHashSet,和TreeSet三种;下面来介绍一下几种集合。
二HashSet

   (1)Hash集合的特点:底层由哈希表组成,元素无序且唯一,元素的唯一靠元素重写hashCode()和equals()方法来实现,线程不安全,效率高,Integer和String类型对hashCode()方法和equals()方法实现了重写。
   (2)对HashSet集合存储字符并进行遍历

举例:

public class Demo {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("hello");
        set.add("java");
        set.add("hello");
        for(String str:set){
            System.out.println(str);
        }
    }
}

结果:这里写图片描述
体现了元素的唯一性和无序。

   (3)Hashset集合对对象元素的遍历

举例:

public class Demo1 {
    public static void main(String[] args) {
        HashSet<Student> hashSet = new HashSet<>();
        hashSet.add(new Student("张三",10));
        hashSet.add(new Student("李四",19));
        hashSet.add(new Student("李三",10));
        hashSet.add(new Student("赵四",20));
        hashSet.add(new Student("张三",10));
        for(Student stu :hashSet){
            System.out.println(stu.getName()+"=="+stu.getAge());
        }
    }
}

学生类:

public class Student {
    private  String name;
    private  int     age;

    public Student() {
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", 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);
    }

    public Student(String name, int age) {

        this.name = name;
        this.age = age;
    }
}

结果:这里写图片描述 注意:Student需要重写hashCode()equals()方法
三:LinkedHashSet类

  (1)概述:LinkedHashSet底层是由链表和哈希表组成,所以既能保证元素有序还能保证元素唯一。线程不安全,效率高。
  (2)举例:LinkedHashSet集合的遍历.

举例:

public class Demo2 {
    public static void main(String[] args) {
        LinkedHashSet<Integer> integers = new LinkedHashSet<>();
        integers.add(11);
        integers.add(22);
        integers.add(33);
        integers.add(44);
        integers.add(55);
        integers.add(11);
        integers.add(66);//遍历
        for(Integer integer:integers){
            System.out.println(integer);
        }

    }
}

这里写图片描述元素唯一且有序。
四:TreeSet集合

 (1)TreeSet的概述:TreeSet中的元素是唯一的,但是TreeSet集合对元素进行了排序,如果对TreeSet的构造为无参构造的话,那么排序方式为自然排序,要求元素必须实现Copareble 接口,重写此接口中的copareTo方法 若为有参构造的话,排序方式为比较器排序,参数要一个Comparetor比较器(接口)重写比较器中的compare()方法根据此方法的返回值的正负0来决定元素的排列顺序。它的底层为二叉树结构
 (2)二叉树结构:二叉树的数据结构 先存入一个树根 分两个叉
              存储元素时 跟树根比较 小的放在左边 大的放在右边
              如果相等就不存储
              取的时候按照 左中右的顺序来取
 (3)自然遍历练习:(注意)自然排序 此对象 必须实现Comparable接口 否则报错

举例:

 public static void main(String[] args) {
        TreeSet<Student> treeSet = new TreeSet<>();
        treeSet.add(new Student("张三",18));
        treeSet.add(new Student("赵四",15));
        treeSet.add(new Student("张三",18));
        treeSet.add(new Student("王五",14));
        treeSet.add(new Student("张四",13));
        for(Student set:treeSet){
            System.out.println(set.getName()+"=="+set.getAge());
        }
    }
}

学生对象:

public class Student implements Comparable<Student>{
    private  String name;
    private  int     age;

    public Student() {
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", 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);
    }

    public Student(String name, int age) {

        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Student o) {
        int r=this.getName().length()-o.getName().length();
        int r1=r==0?this.getAge()-o.getAge():r;
        int r2=r1==0?this.getName().compareTo(o.getName()):r1;
        return r2;
    }
}

结果:这里写图片描述

 (3)比较器遍历的举例:

举例:

public class Demo1 {
    public static void main(String[] args) {
        Mycompare mycompare = new Mycompare();
        TreeSet<Student> set = new TreeSet<Student>(mycompare);
        set.add(new Student("张三",20));
        set.add(new Student("李四",22));
        set.add(new Student("赵四",40));
        set.add(new Student("张四",33));
        set.add(new Student("张三",20));
        for(Student stu:set){
            System.out.println(stu.getName()+"=="+stu.getAge());
        }
    }
}

学生类:

public class Student {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

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

    public Student(String name, int age) {

        this.name = name;
        this.age = age;
    }

    public Student() {

    }
}

结果:这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40843624/article/details/81395546