Java_Set接口

Set也是Collection的子接口,特点是里面保存的数据不允许重复。但Set子接口没有像List接口那样针对Collection接口进行了扩充,而是完整的按照Collection接口的标准实现了继承,所有没有get()方法.

Set子接口中有两个常用的类:HashSet(无序列)、TreeSet(有序)。

HashSet最大特点是不允许重复元素,并且无序排列

import java.util.HashSet;
import java.util.Set;

public class CopyDemo {
    public static void main(String[] args) throws Exception {
        Set<String> all = new HashSet<String>();
        all.add("wang");
        all.add("li");
        all.add("zhou");
        all.add("wang");
        System.out.println(all);
    }
}

TreeSet已经排序了,按字母升序

import java.util.Set;
import java.util.TreeSet;

public class CopyDemo {
    public static void main(String[] args) throws Exception {
        Set<String> all = new TreeSet<String>();
        all.add("wang");
        all.add("li");
        all.add("zhou");
        all.add("wang");
        System.out.println(all);
    }
}

想用TreeSet实现排序,一定要实现java.lang.Comparable接口(为了有排序依据)

TreeSet靠compareTo()相等区分重复.而在实现Comparable接口的时候必须将所有的原属性都参与到比较过程中。

import java.util.Set;
import java.util.TreeSet;

class Person implements Comparable<Person>{
    private int age;
    private String name;
    public Person( String name, int age) {
        this.age = age;
        this.name = name;
    }
    public String toString() {
        return "Person [age=" + age + ", name=" + name + "]
";
    }
    @Override
    public int compareTo(Person o) {
        if(this.age > o.age) {
            return 1;
        }else if (this.age <o.age) {
            return -1;
        }else {
            return this.name.compareTo(o.name);
        }
        
    }
}

public class CopyDemo {
    public static void main(String[] args) throws Exception {
        Set<Person> all = new TreeSet<Person>();
        all.add(new Person("wang",123));
        all.add(new Person("li",123));//年龄相同
        all.add(new Person("zhou",66)); 
        all.add(new Person("zhou",66)); //完全相同
        System.out.println(all);
    }
}

只要牵涉到一组对象的排序操作,永远都使用Comparable接口完成。

关于重复元素的说明

Comparable只适合TreeXxx类型的集合消除重复元素,而真正意义上的重复的判断并不是利用Comparable接口完成的,而是利用Object类中两个方法完成的。

  取得对象的Hash码:public int hashCode();

  对象比较:public boolean equals(Object obj)

  

原文地址:https://www.cnblogs.com/lonske/p/8883765.html