接下来我们来说说Collection的另一个子接口Set。和List一样,Set也可以用来存放多个元素。我们主要来学习Set的三个实现类。
-
HashSet
-
TreeSet
-
LinkedHashSet
同样,它们之间的相同点有:
-
都是Set的实现类
-
存入的元素不能重复
-
都是无序的(不能通过下标来查询)
他们也有不同点:
-
HashSet的底层结构是哈希表,主要用于快速查找,存入HashSet的对象必须定义HashCode。不能保证保存次序
-
TreeSet底层为树状结构,可以保证保存次序
-
LinkedHashSet具有HashSet的速度,且底层使用链表维护元素的次序。
下面我们以HashSet的方法来讲讲:
-
添加一个元素: add(元素)
-
HashSet set = new HashSet();
-
set.add("大妖怪");
-
删除一个元素:remove(元素)
-
HashSet set = new HashSet();
-
set.add("大妖怪");
-
set.remove("大妖怪");
-
清除所有元素:clear();
-
HashSet set = new HashSet();
-
set.add("大妖怪");
-
set.clear();
讲到这,你可能会疑惑以上的例子并没有像讲List那样把所有的结果都打印出来。那是因为我们接下来要重点讲一下Set的查询。 我们知道。set集合都是无序的,那么我们怎么来把它里面的元素打印出来呢?没错!无法单独取出来,只能用遍历。我们一般用for each遍历或者iterator迭代器。
-
for each
-
HashSet set = new HashSet();
-
set.add("大妖怪");
-
set.add("小妖怪");
-
for (Object object : set) {
-
System.out.println(object);
-
}
-
iterator
-
HashSet set = new HashSet();
-
set.add("大妖怪");
-
set.add("小妖怪");
-
Iterator it = set.iterator();
-
while (it.hasNext()) {
-
System.out.println(it.next());
-
}
那么我们刚刚说set无法存重复元素,那么我们来试试:
-
HashSet set = new HashSet();
-
set.add("大妖怪");
-
set.add("大妖怪");
-
set.add("大妖怪");
-
set.add("大妖怪");
-
set.add("大妖怪");
-
Iterator it = set.iterator();
-
while (it.hasNext()) {
-
System.out.println(it.next());
-
}
运行的结果你会发现不管存入多少个”大妖怪”,我们只能迭代出一个,也就是说,我们在往set里面存东西的时候,它会去已有的里面匹配,如果有,则覆盖掉原有的,因此不管存入多少都只会有一个。 还有一点就是,我们说过HashSet是不保证顺序的:
-
HashSet set = new HashSet();
-
set.add("大妖怪");
-
set.add("二妖怪");
-
set.add("三妖怪");
-
set.add("四妖怪");
-
set.add("五妖怪");
-
Iterator it = set.iterator();
-
while (it.hasNext()) {
-
System.out.println(it.next());
-
}
从这个的运行结果可以看出遍历出来的结果并没有按照我们存入的顺序来,可以课后做实验和另外两个Set做个对比。 其实Set和List的区别就在于有序和无序,其它的方法基本上和List一样使用了,而且,我们还可以把List装到Set或者Set装到List,这个我们以后会细讲。
|