← 返回首页
JavaSE系列教程(四十)
发表时间:2020-01-19 18:49:25
讲解java集合框架之Set

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遍历时是有序的。