Java集合List,Set,Map,Queue,Deque

集合是Java基础中非常重要的一部分,Java提供了非常丰富的集合API,了解各个集合的特点,怎么样在各种各样的场景中使用正确的集合,非常重要,也是一个Java程序员最基本的素养。

整体了解

  • Java最基本,最常用的的集合主要有,Set,List,Map,Queue,Deque。
  • Collection是集合List,Set,Queue的最顶层接口。Collection继承自Iterable接口,以实现对元素的遍历。

各个类或接口之间的关系,如下类图:

 

List

List是有序的集合接口,继承自Collection,有三个实现类,ArrayList,LinkedList,Vector,分别有各自的特点。

ArrayList,底层通过数组实现,元素有下标,通过下标随机读取元素效率高,查询时间复杂度为O(1)。缺点是,插入或者删除元素时,需要移动元素,或者数组存储空间不够时,数组扩容,代价都比较高。综上ArrayList适合查找和遍历元素,不适合插入和删除元素。并且ArrayList是线程不安全的。

LinkedList,底层通过链表实现,元素没有下标,适合元素的动态插入和删除,只需要移动指针即可。但是查询元素和遍历元素比较慢。并且LinkedList是线程不安全的。

Vector,底层通过数组实现,线程安全,但是实现线程安全后,必然影响元素操作的性能。效率比ArrayList低。

Set

Set集合接口,无序,不重复;继承自Collection,有三个实现类,HashSet,LinkedHashSet,TreeSet,分别有各自的特点和适用的场景。

HashSet,集合元素无序,且不重复。通过HashMap实现,底层是一个数组,允许使用null,线程不安全。

LinkedHashSet,集合元素唯一且有序。继承自HashSet,通过Hash和链表实现。

TreeSet,集合元素唯一,不保证元素的添加顺序,但是可以根据规则排序,使用红黑树算法。排序时需要指定排序的规则。

Map

Map集合存储键值对。确切的说,Map不是集合,是两个集合的关系。Map相关的集合有HashMap,TreeMap,LinkedHashMap,HashTable,ConcurrentMap,ConcurrentHashMap。也分别有各自的特点和适用的场景。

HashMap,底层是一个数组,数组中是一个链表。通过hash保证key的唯一性。允许key为null,线程不安全。

LinkedHashMap,保存了键值对的插入顺序,遍历时比HashMap慢,key和value都可以为null,线程不安全。

TreeMap,底层通过红黑树实现,可以指定规则,对Map的key进行排序。

ConcurrentMap,并发访问map集合的接口。在Map的基础上,进行一定的扩展。

ConcurrentHashMap,线程安全,并且高效的HashMap。实现类似于分块,在HashMap的数组+链表数据结构的基础上,增加了一层数组数据结构,变成数组+数组+链表的数据结构。每次只对第一层的数组加锁,第一层的其他数组就不会被锁,这样来实现同步,并且提高效率。

HashTable,线程安全,继承自Dictionary,使用Hash实现。为了保证线程安全,所有的方法上增加了synchronized锁,所有的方法上加synchronized锁,那么导致锁HashTable本身的对象this,无论执行哪个方法,线程之间都要同步执行,效率不高。

Queue

类似于队列的数据结构,即元素先进先出的原则,实现有PriorityQueue。

PriorityQueue,有顺序的队列,可以通过指定排序规则,使队列中的元素按照顺序排序。排序在前的先出,排序在后的后出。

BlockingQueue,阻塞队列接口,线程安全,多用于生产者消费者、多线程的中间队列使用。使用ReentrantLock实现,

ArrayBlockingQueue,BlockingQueue的实现,基于数组的阻塞队列,有界队列,初始化时需要指定队列长度,不支持null元素,不能扩容。

LinkedBlockingQueue,BlockingQueue的链表实现。无界队列,如果不指定队列长度,队列长度默认是Integer.MAX_VALUE,视线中使用了两个锁,出队列和入队列互不影响,吞吐量高。

DelayQueue,是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。不支持null元素。

PriorityBlockingQueue,无界有序的阻塞队列,排序规则和之前介绍的PriorityQueue一致,只是增加了阻塞操作。同样的该队列不支持插入null元素,同时不支持插入非comparable的对象。

SynchronousQueue,阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。 不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在; 除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头是尝试添加到队列中的首个已排队线程元素; 如果没有已排队线程,则不添加元素并且头为 null。 

Deque

Deque是Queue的子接口,Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者。实现有ArrayDeque和LinkedList。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值