java集合框架(二)

121 阅读2分钟
Collecttion的子接口Set

Set概述:

set接口的实现类有HashSet【主要实现类】,LinkedHashSet,TreeSet。

Set集合中存储的元素都是无序的,不可重复的。Hash

Set接口的主要实现类---HashSet实现类对象的创建:
public class Main {
    public static void main(String[] args) {
        HashSet set = new HashSet();

        set.add("aa");
        set.add("bb");

    }
}
HashSet的常用方法:

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

public class Main {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        HashSet set1 = new HashSet();
        HashSet set2 = new HashSet();

        set.add("aa");//add()添加元素
        set.add("bb");
        set1.add("aa");
        set1.add("bb");
        set2.add("aa");
        set2.add("cc");
        int size = set.size();//获取set集合中的元素个数

        //set.clear();//清空set集合中的全部元素

        //equals()方法比较两个集合是否相等,相等则返回true,不相等则返回false
        System.out.println(set.equals(set1));//true
        System.out.println(set.equals(set2));//false
        System.out.println(set);//[aa, bb]

        set.remove("aa");//remove()移除set集合中的元素;

        System.out.println(set);//[bb]

        set.add("bb");

        System.out.println(set.contains("bb"));//true;
        //contains()判断set集合中是否包含XX元素,包含返回true,不包含则返回false

        System.out.println(set.isEmpty());//false
        //isEmpty()判断set集合是否为空,为空则返回true,反之则返回false

        Object[] objects = set.toArray();//toArray()将set集合转变为数组
        System.out.println(set);
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i]);
        }

        Iterator iterator = set.iterator();//iterator()获取set集合的迭代器,用于遍历set数组
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        


    }
}
说明:

HashSet底层是HashMap,使用的是数组+单向链表+红黑树的结构进行存储。数据元素在被加入到set集合的过程中,会调用其hashCode方法计算其哈希值,再通过哈希值来计算该元素在集合中的位置,故set集合中的元素并不是按添加顺序进行排列的,是无序的。

public class test01 {
    public static void main(String[] args) {
        TreeSet Set = new TreeSet();
        Set.add("aa");
        Set.add("123");
        Set.add("cc");
        Set.add("34343");
        Set.add("ee");
        System.out.println(Set);//最后输出[123, 34343, aa, cc, ee]
    }
}

在向set集合中添加元素时,如果添加的元素计算出来的位置已经有元素了,那么就会比较这两个元素的哈希值,如果相同则新添加的元素无法加入该集合,如果不同则会继续调用equals方法进一步判断二者是否相同,如果相同则新添加的元素依然无法加入set集合,如果不同则将元素添加进入set集合。这种特点就需要我们去重写equals()和hashCode(),同时要求equals()和hashCode()具有一致性。

HashSet类的子类LinkedHashSet,TreeSet,HashSet的比较

LinkedHashSet是HashSet的子类,二者的不同在于LinkedHashSet的底层在HashSet的基础上添加了一组 双向链表,使得LinkedHashSet比HashSet在进行遍历操作时具有更好的性能,并且可以按添加顺序进行遍历。

TreeSet的底层使用红黑树进行存储,这就使得Treeset中的元素可以按照添加元素的属性进行排序。

public class test01 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add("aa");
        treeSet.add("bb");
        treeSet.add("cc");
        treeSet.add("dd");
        treeSet.add("ee");
        treeSet.add("yy");
        treeSet.add("ff");
        System.out.println(treeSet);//最后输出[aa, bb, cc, dd, ee, ff, yy]
    }
}