Set接口:Set集合继承自Collection集合
Set:底层数据结构是一个哈希表,能保证元素是唯一的,元素不重复!它通过它的子实现了HashSet集合去实例化,HashSet集合底层是HashMap集合的实例!

特点: 1.它不允许出现重复元素;
2.不保证集合中元素的顺序

//创建Set集合对象
        Set<String> set = new HashSet<String>() ;

        //添加元素
        set.add("hello");
        set.add("java") ;
        set.add("java") ;
        set.add("world") ;
        set.add("world") ;
        set.add("world") ;

        //增强for遍历
        for(String s :set){
            System.out.println(s);
        }

输入常量,相同常量的hashcode值相同


HashSet集合

HashSet
哈希表边存放的是哈希值。HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的所以取数据也是按照哈希值取得。
HashSet不存入重复元素的规则.使用hashcode和equals
由于Set集合是不能存入重复元素的集合。那么HashSet也是具备这一特性的。HashSet如何检查重复?HashSet会通过元素的hashcode()和equals方法进行判断元素师否重复。
当你试图把对象加入HashSet时,HashSet会使用对象的hashCode来判断对象加入的位置。同时也会与其他已经加入的对象的hashCode进行比较,如果没有相等的hashCode,HashSet就会假设对象没有重复出现。
元素的哈希值是通过元素的hashcode方法 来获取的, HashSet首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法 如果 equls结果为true ,HashSet就视为同一个元素。如果equals 为false就不是同一个元素。HashSet

List集合和Set集合的区别?
* Set:元素是唯一的,无序性(存储和取出不一致)
* List:元素可以重复,有序性(存储和取出一致)
hashCode和equals()方法;HashSet底层是依赖于这两个实现来保证元素的唯一性!

//创建LinkedHashSet集合对象
        LinkedHashSet<String> link = new LinkedHashSet<String>();

        //给集合中添加元素
        link.add("hello") ;
        link.add("world") ;
        link.add("world") ;
        link.add("Java") ;
        link.add("Java") ;
        link.add("JavaWeb") ;
        link.add("JavaWeb") ;

        //遍历集合
        for(String s: link){
            System.out.println(s);
        }

  • TreeSet集合底层是依赖于TreeMap的实例,而TreeMap是依赖于红黑树结构实现的
  • 分两种:
  • 自然排序:(Comparable接口有一个compareTo(Object o)方法,它返回整数类型,对于表达式x.compareTo(y),如果返回值为0,表示x和y相等,如果返回值大于0,表示x大于y,如果小于0,表示x小于y。TreeSet调用对象的compareTo()方法比较集合中对象的大小,然后进行升序排序,这种方式称为自然排序.)
  • 比较器排序
  • 这种排序的使用取决于开发者是用什么样的构造方法
自然排序:
    public static void main(String[] args) {
        TreeSet<Integer> Tr = new TreeSet<>();

        Integer n1= 10;
        Integer n2= 20;
        Integer n3= 12;
        Integer n4= 10;

        Tr.add(n1);
        Tr.add(n2);
        Tr.add(n3);
        Tr.add(n4);

        for(Integer i : Tr){
            System.out.println(i);
        }
    }

红黑树算法的规则: 左小右大。
既然TreeSet可以自然排序,那么TreeSet必定是有排序规则的。
1:让存入的元素自定义比较规则。
2:给TreeSet指定排序规则。
方式一:元素自身具备比较性
元素自身具备比较性,需要元素实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做元素的自然排序也叫做默认排序。
方式二:容器具备比较性
当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重写compare方法,并将该接口的子类实例对象作为参数传递给TreeMap集合的构造方法。
注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;
注意:在重写compareTo或者compare方法时,必须要明确比较的主要条件相等时要比较次要条件。(假设姓名和年龄一直的人为相同的人,如果想要对人按照年龄的大小来排序,如果年龄相同的人,需要如何处理?不能直接return 0,因为可能姓名不同(年龄相同姓名不同的人是不同的人)。此时就需要进行次要条件判断(需要判断姓名),只有姓名和年龄同时相等的才可以返回0.)
通过return 0来判断唯一性。

问题:为什么使用TreeSet存入字符串,字符串默认输出是按升序排列的?因为字符串实现了一个接口,叫做Comparable
接口.字符串重写了该接口的compareTo
方法,所以String对象具备了比较性.那么同样道理,我的自定义元素(例如Person类,Book类)想要存入TreeSet集合,就需要实现该接口,也就是要让自定义对象具备比较性.
存入TreeSet集合中的元素要具备比较性. 比较性要实现Comparable接口,重写该接口的compareTo方法
TreeSet属于Set集合,该集合的元素是不能重复的,TreeSet如何保证元素的唯一性
通过compareTo或者compare方法中的来保证元素的唯一性。
添加的元素必须要实现Comparable接口。当compareTo()函数返回值为0时,说明两个对象相等,此时该对象不会添加进来。

测试类:
package Day15_TreeSet;

import java.util.TreeSet;

/**
 * 重写comparable,对重复数据进行清理
 * @author Aoman_Hao
 */
public class DemoTest {

    public static void main(String[] args) {
        TreeSet<Star> Tr = new TreeSet<Star>();

        Star s1 = new Star("AAW", 22, "女");
        Star s2 = new Star("小直", 24, "男");
        Star s3 = new Star("小直", 24, "女");
        Star s4 = new Star("AAW", 43, "女");
        Star s5 = new Star("AAW", 22, "女");

        Tr.add(s1);
        Tr.add(s2);
        Tr.add(s3);
        Tr.add(s4);
        Tr.add(s5);

        for(Star i: Tr){
            System.out.println(i.getName()+"\t"+i.getAge()+"\t"+i.getGender());
        }
    }

}
对象类:
package Day15_TreeSet;

import java.util.Comparator;

/**
 * @author Aoman_Hao
 */
public class Star implements Comparable<Star> {
    private String name;
    private int age;
    private String gender;
    public Star() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Star(String name, int age, String gender) {
        super();
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
    }

    @Override
    public int compareTo(Star o) {
        int num = this.name.length() - o.name.length();
        int num2 = num ==0? this.name.compareTo(o.name):num;
        int num3 = num2 == 0 ?this.age - o.age:num2;
        int num4 = num3 ==0? this.gender.compareTo(o.gender):num3;
        return num4;
    }
    }