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 + "]\n"; } @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)