队列分类

  1. 阻塞队列
    阻塞队列要实现接口:BlockingQueue
    • ArrayBlockingQueue :一个由数组支持的有界队列。
    • LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
    • PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
    • DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
    • SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
  2. 非阻塞队列
  • ArrayList
  • LinkedList

LinkedBlockingQueue常用方法

  1. LinkedBlockingQueue是是一个阻塞的线程安全的队列,底层采用链表实现。遵循FIFO(先进先出)。

  2. LinkedBlockingQueue添加元素的方法有三个:add、offer、put。且都是向队列尾部添加元素。
    add:方法在添加元素的时候,若超出了度列的长度会直接抛出异常。 java.lang.IllegalStateException: Queue full
    offer:方法添加元素,如果队列已满,直接返回false。
    put:方法添加元素,如果队列已满,会阻塞直到有空间可以放。

  3. LinkedBlockingQueue移除元素的方法有三个:remove、poll、take。且都是从队列中取出头部元素并从队列中删除。
    remove: 移除需要指定对象,循环队列进行匹配对 对象进行删除,删除成功返回true 否则返回false。
    poll: 每次返回队列的第一个,若队列为空,返回null。
    take:若队列为空,发生阻塞,等待到有元素。

  4. LinkedBlockingQueue可以在构造函数的参数中指定大小,若没有指定大小,则默认大小为Integer.MAX_VALUE。>
    LinkedBlockingQueue的大小不可为null。

扩容方式

  1. 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);
  }