在List 集合允许元素的重复,而在List 集合中去重复,是一个比较复杂的操作。因此,如果要求集合中的元素唯一,可以直接考虑 Set 接口
Set
一个无序的不包含重复元素的集合,更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。继承了Collection 的所有方法,同时没有定义自己的特殊方法。则取出元素的方法只有一种,使用迭代器。
Set srt = new HashSet();//Set 也是接口,通过实现类创建集合实例
创建和获取:
package Collection;
import java.util.*;
/*
接口Set 也是Collection 的一个子接口
是一个无序,不包含重复元素的集合
*/
public class SetDemo {
public static void main(String[] args){
//1.创建集合——通过实现类
Set set = new HashSet();
//2.添加元素
set.add("itcast1");
set.add("xixi");
set.add("haha");
set.add("wowo");
//Set 只能通过迭代器获取元素
for(Iterator it= set.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
运行结果:
haha
itcast1
wowo
xixi
结果不保证有序性(可能有序也可能无序),和List 不一样,List 的迭代器获取输出是有序的(输出和输入一致)
体现Set 的惟一性:添加重复的元素:
set.add("itcast1");
set.add("xixi");
set.add("xixi");
set.add("wowo");
运行结果:
itcast1
wowo
xixi
会自动删除重复性,保证集合中的元素唯一
但是如果是自定义的对象,例如 存储了自定义的学生对象(equals 已经被覆盖)
代码:
set.add(new Student("Lisi",20));
set.add(new Student("Zhangshan",25));
set.add(new Student("Lisi",20));
set.add(new Student("Wangwu",18));
运行结果:
Lisi 20
Wangwu 18
Zhangshan 25
Lisi 20
保证唯一性失败,为什么呢?这个就要探讨Set 实现类的数据结构。
Set 的常用实现类 :hashSet TreeSet
此类实现Set接口,由哈希表(实际为HashMap实例)支持,不保证迭代的顺序性。