java集合—Set
一.概述
Set表示无序的对象集合,且不允许元素重复,非线程安全。与List不同,Set不允许以任何顺序的方式访问Set的元素。有些Set基于它们的自然顺序对元素进行排序,但是Set接口本身没有提供这样的功能。实现Set的类有:ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet,LinkedHashSet和TreeSet
一.HashSet
HashSet由HashMap支持。它不能保证集合的迭代顺序。该类允许null元素。非线程安全,但可以像这样明确地同步:Set s = Collections.synchronizedSet(new HashSet(…))。
public static void main(String[] args) {
HashSet<String> hset = new HashSet<>();
hset.add("str1");
hset.add("str2");
hset.add("str3");
hset.add("str4");
hset.add(null);
System.out.println(hset);
Iterator<String> it = hset.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
输出结果:
[null, str3, str4, str1, str2]
null
str3
str4
str1
str2
二.TreeSet
TreeSet与HashSet类似,但TreeSet可以按升序对元素进行排序,且不允许null,而HashSet不维护任何顺序。像大多数其他集合类一样,TreeSet也没有线程同步,但也可以像这样明确地同步: SortedSet s = Collections.synchronizedSortedSet(new TreeSet(…));
public static void main(String[] args) {
TreeSet<String> tset = new TreeSet<String>();
tset.add("aaa");
tset.add("bbb");
tset.add("ddd");
tset.add("ccc");
System.out.println(tset);
TreeSet<Integer> tset2 = new TreeSet<Integer>();
tset2.add(1);
tset2.add(2);
tset2.add(4);
tset2.add(3);
System.out.println(tset2);
}
输出结果如下,已经排好序
[aaa, bbb, ccc, ddd]
[1, 2, 3, 4]
三.EnumSet
EnumSet类是与枚举类型一起使用的专用Set实现。
public class SetDemo {
public static void main(String[] args) {
Set<days> set = EnumSet.of(days.TUESDAY, days.WEDNESDAY);
Iterator<days> iter = set.iterator();
while (iter.hasNext())
System.out.println(iter.next());
}
}
enum days {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
四.LinkedHashSet
LinkedHashSet类是set接口的Hashtable和Linked列表实现。它继承了HashSet类并实现了Set接口。LinkedHashSet也不允许重复元素,但允许null,可排序,非线程同步。
public static void main(String[] args) {
LinkedHashSet<String> set = new LinkedHashSet();
set.add("1");
set.add("2");
set.add("4");
set.add("3");
set.add(null);
Iterator<String> i = set.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
}