接下来我们来说说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());
- }
- 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());
- }
- 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());
- }