Set , HashSet , LinkedHashSet , TreeSet集合的概述和特点

一:Set

         Set集合概述及特点: 无序(存储和取出的顺序)和唯一.

package org.westos.demo;

import java.util.HashSet;

public class SetDemo2 {
    public static void main(String[] args) {

        //Set集合的特点:元素无序,且唯一
        HashSet<Integer> hashSet = new HashSet<>();
        hashSet.add(100);
        hashSet.add(20);
        hashSet.add(30);
        hashSet.add(5);
        hashSet.add(60);
        hashSet.add(20);
        hashSet.add(30);
        hashSet.add(20);
        hashSet.add(30);
        //遍历
        for(Integer num:hashSet){

            System.out.println(num);
        }
    }
}

二:HashSet

         HashSet概述和特点:
                           此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。线程不安全,效率高,允许存储null元                                 素,元素无序(元素的存取顺序不一致)且唯一

         HashSet保证元素唯一性:

                           HashSet 保证元素唯一性是靠元素重写hashCode()和equals()方法来保证的,如果不重写则无法保证。

                            set集合中存储元素的时候,他默认比较的时地址值,如果地址值不一样,就会存到集合当种,往往我们认为两个                             对象只要成员变量的值一模一样就认为两个对象一样,那我们就需要重写hahsCode()方法和equals()方法

HashSet的举例:

package org.westos.Demo;
//HashSet 集合种元素无序,唯一

import java.util.HashSet;

//测试类
public class HashSetDemo {
    //主方法
    public static void main(String[] args) {
        HashSet<Student> hs = new HashSet();//创建一个HashSet集合

        Student s1 = new Student("张三", 29);//创建六个学生对象
        Student s2 = new Student("李四", 22);
        Student s3 = new Student("王五", 21);
        Student s4 = new Student("赵六", 24);
        Student s5 = new Student("张三", 29);//s5与s1的中内容相同.因为HashSet的唯一性
        //s5不能存入集合当中.这只是我们自己的想法
        //而实际情况是,没有重写equals()方法和hashCode()方法
        //所以当地址值不同时就可以存入集合,要是想要根据对象内容来
        //确定唯一性那么就要重写equals()方法和hashCode()
        Student s6 = new Student("李四", 27);

        hs.add(s1);//将对象存入集合当中
        hs.add(s2);
        hs.add(s3);
        hs.add(s4);
        hs.add(s5);
        hs.add(s6);

        for (Student stu : hs) {//遍历
            System.out.println(stu.getName() + "---" + stu.getAge());
        }
    }

}


package org.westos.Demo;

import java.util.Objects;
//定义一个学生类
public class Student {
    private String name;
    private int age;
    //无参构造
    public Student() {
    }
    //有参构造
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //getXXX和setXXX
    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;
    }
    //重写toString()方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //重写equals()方法
    @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);
    }
    //重写hashCode()方法
    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }
}

三:LinkedHashSet

           LinkedHashSet的概述:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。线程不安全,效率高.

           链表保证了元素有序,哈希表保证了元素唯一.

LinkedHashSet的举例:

package org.westos.Demo;

import java.util.LinkedHashSet;

//测试类
public class LinkedHashDemo {
    public static void main(String[] args) {//主方法
        LinkedHashSet<Teacher> LHS = new LinkedHashSet<>();//创建一个LinkedHashSet集合

        Teacher t1 = new Teacher("张三", 29);//创建五个Teacher对象
        Teacher t2 = new Teacher("李四", 29);
        Teacher t3 = new Teacher("王五", 28);
        Teacher t4 = new Teacher("赵六", 23);
        Teacher t5 = new Teacher("张三", 29);//和HashSet一样,不重写equals()和hasCode()方法的话,根据地址可以存入集合当中
        //如果重写,元素内容相同,LinkedHashSet的唯一性该元素不能存入集合当中

        LHS.add(t1);//将元素放入集合当中
        LHS.add(t2);
        LHS.add(t3);
        LHS.add(t4);
        LHS.add(t5);

        for (Teacher th : LHS) {//遍历集合
            System.out.println(th.getName() + "---" + th.getAge());

        }
    }
}

package org.westos.Demo;

import java.util.Objects;
//创建一个Teacher集合
public class Teacher {
    private String name;
    private  int age;
    //无参构造方法
    public Teacher() {
    }
    //有参构造方法
    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //setXXX()和getXXX()方法
    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;
    }
    //重写toString()方法
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //重写equals()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return age == teacher.age &&
                Objects.equals(name, teacher.name);
    }
    //重写hashCode()方法
    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }
}

四:TreeSet
               TreeSet :  TreeSet 底层数据结构是二叉树(红黑树)
               TreeSet集合的特点,元素唯一,且能对元素进行排序 线程不安全,效率高
               
                TreeSet对元素进行排序,有两种方式,具体使用哪种排序方式,根据构造方法来决定
                                     如果使用的是空参构造,那么采用的是自然排序
                                                 元素必须实现Compareble接口并且重写compareTO()方法 ,元素排序就是根据compareTO()方法
                                                  的返回值的正负来决定排列顺序,返回0 元素不往里面存
                                     如果使用的是有参构造,那么采用的是比较器排序

                                                   通过匿名内部类来传Comparator 比较器 是一个接口 接口中有一个比较的方法 compare()根据此                                                    方法的返回值的正负以及0 来决定元素的排列顺序

TreeSet的举例:

     

package org.westos.Demo;

import java.util.TreeSet;

//测试类
public class TreeSetDemo {
    //主方法
    public static void main(String[] args) {
        TreeSet<Teacher> TS = new TreeSet<>();//创建一个TreeSet集合

        Teacher t1 = new Teacher("张龙", 20);//创建五个Teacher对象
        Teacher t2 = new Teacher("赵虎", 22);
        Teacher t3 = new Teacher("王朝", 23);
        Teacher t4 = new Teacher("马汉", 25);
        Teacher t5 = new Teacher("刘能", 21);

        TS.add(t1);//将五个元素存入集合中
        TS.add(t2);
        TS.add(t3);
        TS.add(t4);
        TS.add(t5);

        for (Teacher tea : TS) {//遍历
            System.out.println(tea.getName() + "---" + tea.getAge());
        }


    }
}


package org.westos.Demo;

import java.util.Objects;
//创建一个Teacher集合,并且实现Comparable接口,重写compareTo()方法
public class Teacher implements Comparable<Teacher> {
    private String name;
    private  int age;
    //无参构造方法
    public Teacher() {
    }
    //有参构造方法
    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //setXXX()和getXXX()方法
    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;
    }
    //重写toString()方法
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //重写equals()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return age == teacher.age &&
                Objects.equals(name, teacher.name);
    }
    //重写hashCode()方法
    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }
    //重写compareTo方法
    @Override
    public int compareTo(Teacher o) {
        int r = this.getAge()-this.getAge();//通过元素中年龄大小来排序
        int r1 = r==0?this.getName().compareTo(o.getName()):r;//如果年龄相同,在根据名字的字典顺序来比较

        return r1;//返回值
                  //根据返回值的正负 ,0 来存放元素
    }
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值