Set 接口
特点: 最大的特点 就是集合中的元素 不可重复 其也是Collection接口的子接口 , Set本身也是一个接口,同样不能直接使用,需要实例化该接口的实现类 Set接口下面的实现类:
常用
1 TreeSet 有序 ,不可重复
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable
|
常用方法 来自Collection
范例: 观察TreeSet子类的使用
public static void main(String[] args) { Set<String> all=new TreeSet<>();
all.add("B");
all.add("C");
all.add("A");
all.add("C"); //重复元素
for(String str:all) {
System.out.println(str); } } |
通过观察以上代码发现,TreeSet 存放的数据有以下两个特点:
1 有序 为什么有序?
TreeSet的排序是通过compreable 接口中的compareTo方法完成的 该方法返回 3个取值
分别为: 1 升序 - 1 降序 0 重复元素的判断
范例: 使用自定义类完成TreeSet
public static void main(String[] args) {
Set<Person> all=new TreeSet<>();
all.add(new Person("张三",32));
all.add(new Person("李四",20));
all.add(new Person("张三",32));
all.add(new Person("隔壁老王",89)); //重复元素
for(Person per:all) {
System.out.println(per); } } |
出错了以下的错误:
Exception in thread "main" java.lang.ClassCastException: org.list.Person cannot be cast to java.lang.Comparable at java.util.TreeMap.compare(Unknown Source) at java.util.TreeMap.put(Unknown Source) at java.util.TreeSet.add(Unknown Source) at org.set.TreeSetDemo.main(TreeSetDemo.java:15) |
说明在TreeSet中进行保存的时候,约定存储的类型必须实现一个接口,而这个接口就是comparable接口,如果没有这个接口则不能实现排序功能
范例:实现compareTo方法
@Override public int compareTo(Person o) { // TODO Auto-generated method stub if(this.age>o.age) { return 1; }else if(this.age<o.age) { return -1; } return 0; } |
2 不可重复
重复元素的区分 在TreeSet中是依靠compareTo方法是否返回0来判断的