Set、HashSet、TreeSet

Set是Collection的子接口,HashSet是Set的实现类,SortedSet是Set的子接口,TreeSet是SortedSet的实现类。

这些集合共同的特点都是:无序、不可重复。

方法也与Collection相差无几。

1.Set

Set是一个接口,不能直接实例化对象,要借助其实现子类。

package com.dh.set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Set01 {
    public static void main(String[] args) {
        //Set是接口,借助HashSet实现类
        Set<String> set = new HashSet<>();

        set.add("a");
        set.add("a");//可以添加重复元素,但是只会存储一个

        //遍历元素也只有两种方法
        //1.for增强
        System.out.println("for增强遍历:");
        for (String s : set) {
            System.out.println(s);
        }
        //2.迭代器
        System.out.println("迭代器遍历:");
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

结果:只输出了一个a

for增强遍历:
a
迭代器遍历:
a

2.HashSet

HashSet底层为哈希表。存储在HashSet中的元素实际存放到了HashMap集合的key上。

源码:

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

所以将重点放在HashMap集合上,只要搞懂了HashMap,HashSet也就理解了。

下一篇文章将会介绍。

3.TreeSet

TreeSet的底层为二叉树。存储在TreeSet上的元素实际存储在HashMap的key上。

添加到TreeSet中的元素会自动按照从小到大的顺序排序。

这里要注意排序和元素有序的区别:排序是按照一定的排序规则组织元素的顺序,而有序的意思是元素可以通过下标来操作,以及输出元素顺序与添加元素顺序一致。

例:

package com.dh.set;

import java.util.Iterator;
import java.util.TreeSet;

public class TreeSet01 {

    public static void main(String[] args) {

        TreeSet<Integer> treeSet = new TreeSet<>();
        treeSet.add(1);
        treeSet.add(3);
        treeSet.add(2);
        for (Integer integer : treeSet) {
            System.out.println(integer);
        }

        //字符串会按照字典顺序逐个字母进行比较
        TreeSet<String> treeSet1 = new TreeSet<>();
        treeSet1.add("world");
        treeSet1.add("hello");
        Iterator<String> iterator = treeSet1.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

结果:

1
2
3
hello
world

以上内容还涉及到:

  • 哈希表和二叉树的结构;

  • 这些集合如何判断新添加的元素是否是已经存在的元素;

  • 如何自定义比较规则。

这些问题都会在相关的Map集合中详细的介绍。即下一篇文章~

上一篇:TreeSet Map 泛型


下一篇:java 集合中Set接口、数据结构