队列分类
- 阻塞队列
阻塞队列要实现接口:BlockingQueue- ArrayBlockingQueue :一个由数组支持的有界队列。
- LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
- PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
- DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
- SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
- 非阻塞队列
- ArrayList
- LinkedList
LinkedBlockingQueue常用方法
-
LinkedBlockingQueue是是一个阻塞的线程安全的队列,底层采用链表实现。遵循FIFO(先进先出)。
-
LinkedBlockingQueue添加元素的方法有三个:add、offer、put。且都是向队列尾部添加元素。
add:方法在添加元素的时候,若超出了度列的长度会直接抛出异常。 java.lang.IllegalStateException: Queue full
offer:方法添加元素,如果队列已满,直接返回false。
put:方法添加元素,如果队列已满,会阻塞直到有空间可以放。 -
LinkedBlockingQueue移除元素的方法有三个:remove、poll、take。且都是从队列中取出头部元素并从队列中删除。
remove: 移除需要指定对象,循环队列进行匹配对 对象进行删除,删除成功返回true 否则返回false。
poll: 每次返回队列的第一个,若队列为空,返回null。
take:若队列为空,发生阻塞,等待到有元素。 -
LinkedBlockingQueue可以在构造函数的参数中指定大小,若没有指定大小,则默认大小为Integer.MAX_VALUE。>
LinkedBlockingQueue的大小不可为null。
扩容方式
- ArrayList
当数据元素超过 数组容量的长度 就进行扩容大部分场景都是1.5倍扩容 最大为Integer.max()
//添加方法
public boolean add(E e) {
//扩容
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
//计算容量大小 如果创建对象时没有指定容量大小则默认为10个容量大小
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
//当目前的容量不够时,进行扩容 1.5倍
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//扩容代码 将当前数组长度*1.5 向下取整 例如当前长度为3 扩容后为4 再次扩容为6
//改变长度 >>1相当于除以2
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// 相当于1.5倍扩容了
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
//为了让扩容后的数据 不要太大了
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}