Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。
1.HashSet
Set set = new HashSet();
set.add("grape");
set.add("banana");
set.add("apple");
set.add("orange");
set.add(null);
set.add("watermelon");
set.add("apple");
//因为Set是无顺序的,所有不能使用for循环通过索引遍历。
for(Object obj: set){
System.out.println(obj);
}
System.out.println("----------使用迭代器遍历-----------");
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
运行结果:
banana
orange
null
apple
grape
watermelon
----------使用迭代器遍历-----------
banana
orange
null
apple
grape
watermelon
HashSet具有以下特征:
1)不允许出现重复因素; 2)允许插入Null值; 3)元素无序(添加顺序和遍历顺序不一致); 4)线程不安全,若2个线程同时操作HashSet,必须通过代码实现同步;
2.TreeSet
Set set = new TreeSet();
set.add("grape");
set.add("banana");
set.add("apple");
set.add("orange");
//set.add(null); //错误不允许插入Null元素。
set.add("watermelon");
set.add("apple");
for(Object obj: set){
System.out.println(obj);
}
System.out.println("----------使用迭代器遍历-----------");
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
运行结果:
apple
banana
grape
orange
watermelon
----------使用迭代器遍历-----------
apple
banana
grape
orange
watermelon
TreeSet具有以下特征:
1)对插入的元素进行排序,是一个有序的集合(主要与HashSet的区别);
2)底层使用红黑树结构,而不是哈希表结构;
3)不允许插入Null值;
4)不允许插入重复元素;
5)线程不安全;
3.LinkedHashSet
LinkedHashSet继承自HashSet,它与HashSet区别是LinkedHashSet内部使用的是LinkHashMap。这样做的意义或者好处就是LinkedHashSet中的元素顺序是可以保证的,也就是说遍历序和插入序是一致的。
实例:
Set set = new LinkedHashSet();
set.add("grape");
set.add("banana");
set.add("apple");
set.add("orange");
set.add(null);
set.add("watermelon");
set.add("apple");
//因为Set是无顺序的,所有不能使用for循环通过索引遍历。
for(Object obj: set){
System.out.println(obj);
}
System.out.println("----------使用迭代器遍历-----------");
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
运行结果: grape banana apple orange null watermelon ----------使用迭代器遍历----------- grape banana apple orange null watermelon
小结:
1)Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类.
2)HashSet特征是无序、元素不重复,可以添加Null元素,线程不安全。
3)TreeSet特征是可排序、元素不重复,不可以添加Null元素,线程不安全。
4)LinkedHashSet遍历时是有序的。