数据结构的底层实现小结

无界队列是基于链表实现的,叫做链式队列,一开始不需要指定内存大小

有界队列是基于数组实现的,叫做顺序队列,定义数组时需要指定大小,需要操作系统分配一块独立的且连续的内存空间!

 

队列最大的特点就是先进先出,主要的两个操作是入队和出队。跟栈一样,它既可以用数组来实现,也可以用链表来实现。用数组实现的叫顺序队列,用链表实现的叫链式队列。特别是长得像一个环的循环队列。在数组实现队列的时候,会有数据搬移操作,要想解决数据搬移的问题,我们就需要像环一样的循环队列。

参考代码:

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)【原理:链表的增加和删除只是移动特定元素的指向指针,非常简单。但如果想查找元素,就会比较慢,因为要循环整个链表】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值