Skip to content

Latest commit

 

History

History
120 lines (93 loc) · 3.51 KB

十七、Java集合类-Set.md

File metadata and controls

120 lines (93 loc) · 3.51 KB

📖 青空的霞光的B站课程

📅 2024年4月17日

ps:后面Map会更加详细

Set集合

Set集合接口也是继承自Collection,实现的方法也是大差不差,但是Set不允许出现重复的元素、不允许随机访问、不允许通过下标访问

public interface Set<E> extends Collection<E> {
    // Set集合中基本都是从Collection直接继承过来的方法,只不过对这些方法有更加特殊的定义
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    <T> T[] toArray(T[] a);

    //添加元素只有在当前Set集合中不存在此元素时才会成功,如果插入重复元素,那么会失败
    boolean add(E e);

    //这个同样是删除指定元素
    boolean remove(Object o);

    boolean containsAll(Collection<?> c);

    //同样是只能插入那些不重复的元素
    boolean addAll(Collection<? extends E> c);
  
    boolean retainAll(Collection<?> c);
    boolean removeAll(Collection<?> c);
    void clear();
    boolean equals(Object o);
    int hashCode();

    //这个方法我们同样会放到多线程中进行介绍
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, Spliterator.DISTINCT);
    }
}

⭐ 它的实现之一的HashSet,它的底层就是采用了哈希表来实现,底层是HashMap(后面会了解)

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    ....
    private transient HashMap<E,Object> map; //哈希漫步
}

1️⃣ 在Set接口中并没有定义指定下标来删除和获取对象,只能通过输入对象来删除对象

public static void main(String[] args) {
    Set<String> set = new HashSet<>();
    System.out.println(set.add("AAA"));   //这里我们连续插入两个同样的字符串
    System.out.println(set.add("AAA"));
    System.out.println(set);   //可以看到,最后实际上只有一个成功插入了
}

//输出:
true
false
[AAA]

2️⃣ 底层是哈希表来实现的,之前我们说过哈希表会计算哈希值,然后用哈希值来计算存放在哈希表的哪个位置,所以说它是无法确定存放顺序的,当然如果你输入A B C D,那么肯定存放位置会是A B C D

    public static void main(String[] args) {
        Set<String> set = new HashSet<>(Arrays.asList("A","2","6","D"));
        System.out.println(set);
    }

//输出
[A, 2, D, 6]

⭐ 如果想让维持顺序的Set集合可以使用LinkedHashSet,它的底层不在是HashMap,而是LinkedHashMap,它能够在插入数据时利用链表自动维护顺序,因此这样就能够保证我们插入顺序和最后的迭代顺序一致了

    public static void main(String[] args) {
        Set<String> set = new LinkedHashSet<>(Arrays.asList("A","2","6","D"));
        System.out.println(set);
    }
//输出
[A, 2, 6, D]

⭐ 还有一种Set叫做TreeSet,它会在插入时就进行排序

    public static void main(String[] args) {
        Set<String> set = new TreeSet<>(Arrays.asList("A","2","6","D"));
        System.out.println(set);
    }
//输出
[2, 6, A, D]

1️⃣ 当然他也是使用的比较器

public static void main(String[] args) {
    TreeSet<Integer> set = new TreeSet<>((a, b) -> b - a);  //同样是一个Comparator,反过来排序
    set.add(1);
    set.add(3);
    set.add(2);
    System.out.println(set);
}