常见的BlockingQueue有哪些

常见的BlockingQueue有哪些?

ArrayBlockingQueue

基于数组结构,构造函数时需要指定最大容量,当队列里的元素超过最大容量时,要么阻塞,要么直接返回结果,写入数据时不能写入null

阻塞式写入

向队尾写入数据,队列满后一直阻塞,除非有消费了,或者线程中断

put(E e)

向队尾写入数据,队列满后开始阻塞,阻塞指定时间后,结束阻塞,不会写入成功,返回结果false

offer(E e, long timeout, TimeUnit unit)

非阻塞式写入

当队列满了后,直接抛出异常

add(E e)

当队列满了后,直接返回false,不抛出异常

offer(E e)

阻塞式读取

从队列头部获取数据,并且该数据会从队列头部移除,当队列为空时执行take方法的线程将进入阻塞,直到有其他线程写入新的数据,或者当前线程被执行了中断操作

E take()

从队列头部获取数据,并且该数据会从队列头部移除,如果队列中没有任何元素时则执行该方法,当前线程会阻塞指定的时间,直到在此期间有新的数据写入,或者阻塞的当前线程被其他线程中断,当线程由于超时退出阻塞时,返回值为null

E poll(long timeout, TimeUnit unit)

非阻塞式读取

从队列头部获取数据并且该数据会从队列头部移除,当队列为空时,该方法不会使得当前线程进入阻塞,而是返回null值。

E poll()

直接从队列头部获取一个数据,但是并不能从队列头部移除数据,当队列为空时,该方法不会使得当前线程进入阻塞,而是返回null值。

E peek():

PriorityBlockingQueue

PriorityBlockingQueue优先级阻塞队列是一个“无边界”阻塞队列,用法与ArrayBlockingQueue类似,该队列会根据某种规则(Comparator)对插入队列尾部的元素进行排序,因此该队列将不会遵循FIFO约束。

  • 排序且无边界的队列只要应用程序的内存足够使用,理论上,PriorityBlockingQueue存放数据的数量是“无边界”的,在PriorityBlockingQueue内部维护了一个Object的数组,随着数据量的不断增多,该数组也会进行动态地扩容。在构造PriorityBlockingQueue时虽然提供了一个整数类型的参数,但是该参数所代表的含义与ArrayBlockingQueue完全不同,前者是构造PriorityBlockingQueue的初始容量,后者指定的整数类型参数则是ArrayBlockingQueue的最大容量

  • 元素必须实现了Comparator接口的,默认情况下,优先级最小的数据元素将被放在队列头部,优先级最大的数据元素将被放在队列尾部。

  • 不存在阻塞写方法由于PriorityBlockingQueue是“无边界”的队列,因此将不存在对队列上限临界值的控制,在PriorityBlockingQueue中,添加数据元素的所有方法都等价于offer方法,从队列的尾部添加数据,但是该数据会根据排序规则对数据进行排序。

LinkedBlockingQueue

LinkedBlockingQueue队列的边界可选性是通过构造函数来决定的,当我们在创建LinkedBlockingQueue对象时,使用的是默认的构造函数,那么该队列的最大容量将为Integer的最大值(所谓的“无边界”),当然开发者可以通过指定队列最大容量(有边界)的方式创建队列。 其用法与ArrayBlockingQueue一样。

SynchronousQueue

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

阻塞队列的常用方法汇总
在这里插入图片描述

<think>嗯,用户问的是Java常见的集合类型有哪些。首先,我需要回忆一下Java集合框架的主要结构和接口。Java的集合框架主要分为两个根接口:Collection和Map。然后,Collection下面又有List、Set、Queue这些子接口,每个子接口有不同的实现类。Map接口则有HashMap、TreeMap等实现。 首先,我应该先列举出主要的接口和它们的实现类。比如List接口下有ArrayList、LinkedList和Vector。Set接口下有HashSet、LinkedHashSet和TreeSet。Queue的话,有PriorityQueue和LinkedList,还有Deque。Map的话,常见的实现类包括HashMap、LinkedHashMap、TreeMap和Hashtable。 接下来需要详细说明每个集合类型的特点和适用场景。比如ArrayList基于动态数组,查询快,增删慢;LinkedList基于链表,增删快,查询慢。Vector是线程安全的,但性能较差,现在可能被Collections.synchronizedList替代或者使用CopyOnWriteArrayList。 Set方面,HashSet无序,使用哈希表;LinkedHashSet保持插入顺序;TreeSet有序,基于红黑树。Queue的话,PriorityQueue是优先级队列,而Deque是双端队列。 Map部分,HashMap是最常用的,允许null键值,非同步;LinkedHashMap保持插入顺序或访问顺序;TreeMap有序;Hashtable是线程安全的,但已过时,推荐用ConcurrentHashMap。 另外,可能需要提到线程安全的集合类,比如ConcurrentHashMap、CopyOnWriteArrayList等,属于java.util.concurrent包下的内容。不过用户的问题可能主要集中在常见的集合类型,是否需要展开这部分呢?可能简要提及即可。 然后,针对每个集合类型,给出示例代码。比如创建ArrayList、LinkedList、HashSet、HashMap等的实例代码。 在解释的时候,需要强调各个集合的区别和使用场景,比如需要快速访问用ArrayList,需要频繁插入删除用LinkedList,需要唯一元素用Set,需要键值对用Map等。 还要注意线程安全的问题,比如Vector和Hashtable是同步的,但通常推荐使用并发包中的类来处理多线程环境下的集合操作。 最后,用户要求相关问题,需要围绕集合框架提出四个问题。可能的问题包括各个集合的区别、如何选择、线程安全版本、fail-fast机制等。 现在组织一下回答的结构,先分List、Set、Queue、Map,每个部分下给出实现类和特点,再给出示例代码,然后相关问题。</think><< Java常见的集合类型主要分为两大类:Collection和Map,以下是具体分类及特点: 一、Collection接口(单列集合) 1. List(有序可重复) - ArrayList:基于动态数组,查询效率高(O(1)),增删效率低 - LinkedList:基于双向链表,增删效率高(O(1)),查询效率低(O(n)) - Vector:线程安全的动态数组(已过时) 2. Set(无序唯一) - HashSet:基于哈希表,无序存储 - LinkedHashSet:保持插入顺序的哈希集合 - TreeSet:基于红黑树,自然排序或自定义排序 3. Queue(队列) - PriorityQueue:优先级队列(堆实现) - LinkedList:同时实现Deque双端队列接口 - ArrayDeque:数组实现的双端队列 二、Map接口(键值对集合) 1. HashMap:基于哈希表,允许null键值 2. LinkedHashMap:保持插入顺序的哈希映射 3. TreeMap:基于红黑树的有序映射 4. Hashtable:线程安全的哈希表(已过时) 示例代码: ```java // ArrayList示例 List<String> arrayList = new ArrayList<>(); arrayList.add("Java"); arrayList.get(0); // LinkedList示例 List<Integer> linkedList = new LinkedList<>(); linkedList.add(1); linkedList.remove(0); // HashSet示例 Set<String> hashSet = new HashSet<>(); hashSet.add("Apple"); hashSet.contains("Apple"); // HashMap示例 Map<String, Integer> hashMap = new HashMap<>(); hashMap.put("age", 25); int age = hashMap.get("age"); ``` 三、并发集合(java.util.concurrent包) 1. CopyOnWriteArrayList:线程安全的List 2. ConcurrentHashMap:高并发优化的Map 3. BlockingQueue:阻塞队列接口 选择原则: - 需要排序:TreeSet/TreeMap - 需要保证唯一性:Set体系 - 高频查询:ArrayList - 高频增删:LinkedList - 需要线程安全:并发集合类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值