集合三巨头——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:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。