无界队列是基于链表实现的,叫做链式队列,一开始不需要指定内存大小
有界队列是基于数组实现的,叫做顺序队列,定义数组时需要指定大小,需要操作系统分配一块独立的且连续的内存空间!
《
队列最大的特点就是先进先出,主要的两个操作是入队和出队。跟栈一样,它既可以用数组来实现,也可以用链表来实现。用数组实现的叫顺序队列,用链表实现的叫链式队列。特别是长得像一个环的循环队列。在数组实现队列的时候,会有数据搬移操作,要想解决数据搬移的问题,我们就需要像环一样的循环队列。
》
参考代码:
public class CircularQueue {
// 数组:items,数组大小:n
private String[] items;
private int n = 0;
// head 表示队头下标,tail 表示队尾下标
private int head = 0;
private int tail = 0;
// 申请一个大小为 capacity 的数组
public CircularQueue(int capacity) {
items = new String[capacity];
n = capacity;
}
// 入队
public boolean enqueue(String item) {
// 队列满了
if ((tail + 1) % n == head) return false;
items[tail] = item;
tail = (tail + 1) % n;
return true;
}
// 出队
public String dequeue() {
// 如果 head == tail 表示队列为空
if (head == tail) return null;
String ret = items[head];
head = (head + 1) % n;
return ret;
}
}
----------------------------------------------------------------------------
HashMap底层是数组加链表实现的(数组存储的是Map.entry,链表用于防止hash地址冲突时,存储相同hash值的key)
ArrayList底层是支持扩容的数组实现,比较适合根据某指定下标取得某个元素,时间复杂度O(1)【原理:数组在内存里是连续空间存储的,会记录数组的起始地址,所以取得某个下标的元素时,实际上根据起始地址+offset偏移量*每个元素的大小,就可以计算出该元素所在的内存地址,便可以直接访问到!非常快捷!】
LinkedArrayList底层是双向链表,比较适合增加及删除元素,时间复杂度O(1)【原理:链表的增加和删除只是移动特定元素的指向指针,非常简单。但如果想查找元素,就会比较慢,因为要循环整个链表】