集合总结及部分集合概述

集合三巨头——HashMap、ConcurrentHashMap及ArrayList深入学习完毕(这三种最常用),剩下的相对不常用的比如Map系列的treeMap、HashTable,Set系列的HashSet、TreeSet,List系列的Vector、LinkedList,Queue系列的Blocking、Deque、PriorityQueue等,其中可能有些在之前的介绍中稍微提了一下,不过太过零散,本篇就统一总结概述下。

一、Java集合分类

在Java集合框架中,主要分为Map、List、Set、Queue、Stack等五种数据结构,其中Map是以K-V对的形式,后四种都是单一元素集合,如下图:

可以看到Map和Collection接口是所有集合框架的父接口,Collection接口又继承了Iterable接口,这个接口我们并不陌生,我们看下它的三个方法:

public interface Iterable<T> {
    //获取迭代器
    Iterator<T> iterator();
    //for-each循环(1.8)
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
    //并行迭代器循环
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

Iterator是迭代器接口:

public interface Iterator<E> {
    //是否下一个元素,true-有,false-没有
    boolean hasNext();
    //获取下一个元素
    E next();
    //删除上次调用next()方法时返回的元素
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    //遍历所有元素
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

这说明List、Set、Queue系列的集合都是可以遍历的,但Iterator遍历都是单向的,还有一个它的扩展ListIterator,可以实现向前和向后遍历元素,并且可以添加、删除或修改集合中的任何元素,感兴趣的可以去了解一下。

Map就不多说了,它本身不支持遍历,不过它的k-v键值对可以转为Collection或Set集合,这样也就可以遍历了。

二、Map体系

特点:K-V键值对形式存储,key唯一、value可重复。

它的实现类主要有HashMap、ConcurrentHashMap、HashTable、TreeMap:

  • HashMap:基于哈希表实现,元素存取无序,线程不安全。

  • ConcurrentHashMap:线程安全,效率较高。

  • HashTable:底层数组+链表,线程安全,不允许有null值,效率低,每次扩容为原来的2n+1。

  • TreeMap:基于红黑树实现,key不能为null(因为要根据key排序),元素存取有序,线程不安全。

三、List体系

特点:元素存取有序,可重复,可以有多个null值。

它的实现类主要有:ArrayList、LinkedList、Vetor、CopyOnWriteArrayList:

  • ArrayList:基于数组实现,查询快、增删慢,线程不安全,扩容为原来的1.5倍。

  • LinkedList:基于链表实现,查询慢,增删快,线程不安全。

  • Vetor:基于数组实现,查询快、增删慢,线程安全(效率较低),扩容为原来的2倍。

  • CopyOnWriteArrayList:基于数组实现,读写分离,线程安全(效率较高,能保证最终一致性),内存消耗较大。

四、Stack

Stack继承自Vector,是Vector的“窄化”实现,可以操作元素的一段叫栈顶(数组尾部),数组的另一端则被称为栈底,先进后出,因为继承自Vector,所以也是线程安全的。

五、Set体系

特点:元素存取无序,不可重复,只允许存一个null值。

它的实现主要有HashSet、TreeSet:

  • HashSet:底层实现HashMap,值存在HashMap的Key上,value是固定的object,所以元素可以有null值(只能一个),存取无序且不能重复,线程不安全。

  • TreeSet:底层实现是TreeMap,支持元素自然排序,如果TreeSet要存储自定义对象时,该对象必须实现Comparable接口,并重写其compareTo方法。

六、Queue体系

特点:FIFO(先进先出),通常不允许插入null元素,一般用作高并发集合的容器。

它的实现主要有BlockingQueue、Deque、PriorityQueue:

  • BlockingQueue:阻塞队列,它的阻塞主要表现在两个方面,一个是入队,若此时队列已满则阻塞,另一个是出队,若此时队列为空则阻塞,位于JUC包下,所以线程安全。

  • Deque:双端队列,是一种双开口的“连续”空间的数据结构,也就是可以在头尾两端进行插入和删除操作。

  • PriorityQueue:优先级队列,这里的优先级指的不是按照加入队列的顺序,而是按照元素大小进行排序,出队的元素是对列里最小的元素,反队列的先进先出原则。

 End:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。 

  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橡 皮 人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值