public class ArrayQueue<T> extends AbstractList<T>{
//定义必要的属性,容量、数组、头指针、尾指针
private int capacity;
private int T[] queue;
private int head;
private int tail;
//进行初始化,注意容量和数组的大小都需要+1;head和tail全都初始化为零
public ArrayQueue(int capacity){
this.capacity = capacity + 1;
this.queue = newArray(capacity + 1);
this.head = 0;
this.tail = 0;
}
//用于建立数组,为泛型,通过指定的数据类型强制转变,生成需要的数组
private T[] newArray(int size){
return (T[]) new Object[size];
}
//扩容
//首先需要计算一下原有的数组大小为多少,即size的值
//判断扩容大小和原有数组大小的值,如果扩容小了即报错,不能进行扩容
//之后将扩容容量+1
//接着新建数组,进行数组值的复制,并且重新更新容量,数组,头部,尾部
public void resize(int newcapacity){
int size = size();
if(newcapacity < size)
throw new IndexOutOfBoundsException("Resizing would lose data");
newcapacity++;
if(newcapacity == this.capacity){
return;
} T[] newqueue = newArray(newcapacity);
for(int i=0;i<size;i++){
newqueue[i] = get(i);
}
this.capacity = newcapacity;
this.queue = newqueue;
this.head = 0;
this.tail = size;
}
//数组的大小,tail指针一直指向下一个地址,同理数组的大小需要加1
private int size(){
int diff = tail - head;
if(diff < 0){
diff += capacity;//相当于取模,尾指针移动到头指针了
}
return diff;
}
//用于resize中重数组中获取值
public T get(int i){
int size = size();
if(i < 0 || i >= size){
final String msg = "Index" + i + ", queue size" + size;
throw new IndexOutOfBoundsException(msg);
}
int index = (head + i) % capacity;
return queue[index];
}
//添加元素,先添加元素,再移动尾指针,需要判断是否满了
public boolean add(T o){
queue[tail] = o;
int newtail = (tail + 1) % capacity;
if(newtail == head){
throw new IndexOutOfBoundsException("Queue full");
}
tail = newTail;
return true;
}
//删除元素,相当于出队,先删除头元素,之后移动头指针
public T remove(int i){
if(i != 0){
throw new IllegalArgumentException("Can only remove head of queue");
}
if(head == tail){
throw new IndexOutOfBoundsException("Queue empty");
}
T removed = queue[head];
head = (head + 1) % capacity;
return removed;
}
}

面试常问的ArrayQueue底层实现的更多相关文章

  1. 面试常问的几个排序和查找算法,PHP实现

    冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...

  2. python基础之面试常问

    目录 python相对其他语言有什么特点? python内存管理机制,gc机制的了解,gc回收三种算法. lambda函数 高级函数 map.reduce.filter.sorted等. 简述六种基本 ...

  3. 面试常问的dubbo的spi机制到底是什么?

    前言 dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.作为spring cloud alibaba体系中重要的一部分,随着spring cloud alibaba在 ...

  4. 各大互联网公司java开发面试常问问题

    本人是做java开发的,这是我参加58,搜狐,搜狗,新浪微博,百度,腾讯文学,网易以及其他一些小的创业型公司的面试常被问的问题,当然有重复,弄清楚这些,相信面试会轻松许多. 1. junit用法,be ...

  5. Java面试必问之Hashmap底层实现原理(JDK1.7)

    1. 前言 Hashmap可以说是Java面试必问的,一般的面试题会问: Hashmap有哪些特性? Hashmap底层实现原理(get\put\resize) Hashmap怎么解决hash冲突? ...

  6. 面试常问Spring IOC,不得不会。

    广义的 IOC IoC(Inversion of Control) 控制反转,即“不用打电话过来,我们会打给你”. 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 DI .DL 的关系( ...

  7. Java面试常问的问题(转载)

    并发.JVM.分布式.TCP/IP协议 1)Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的.以下简单模拟一个数据结构的连环炮. ...

  8. 面试必问:HashMap 底层实现原理

    HashMap是在面试中经常会问的一点,很多时候我们仅仅只是知道HashMap他是允许键值对都是Null,并且是非线程安全的,如果在多线程的环境下使用,是很容易出现问题的. 这是我们通常在面试中会说的 ...

  9. 面试常问的Java虚拟机内存模型,看这篇就够了!

    一.虚拟机 同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集是不同的. 同一个java代码在windows上生成的机器码可能是0101.......,在lin ...

随机推荐

  1. Flink如何做维表关联?

    使用 RichAsyncFunction 加 CacheBuilder CacheBuilder.newBuilder() //最多存储10000条 .maximumSize(10000) //过期时 ...

  2. matplotlib的学习13-subplot分格显示

    import matplotlib.pyplot as plt plt.figure()#创建一个图像窗口 # 使用plt.subplot2grid来创建第1个小图, (3,3)表示将整个图像窗口分成 ...

  3. 302跳转导致的url劫持

    介绍一个   网站监测工具:iis7网站监测IIS7网站监控工具可以做到提前预防各类网站劫持,并且是免费在线查询,适用于各大站长,政府网站,学校,公司,医院等网站.它可以做到24小时定时监控,同时它可 ...

  4. Windows Server 2016介绍与安装

    版本介绍 Windows Server 2016 Essentials edition Windows Server 2016 Essentials版是专为小型企业而设计的.它对应于Windows S ...

  5. wildfly 21中应用程序的部署

    目录 简介 Managed Domain中的部署 管理展开的部署文件 standalone模式下的部署 standalone模式下的自动部署 Marker Files 受管理的和不受管理的部署 部署覆 ...

  6. sql 中 foreach 中传入多个不同的参数问题

    <!--查找某用户绑定的药物不良反应报告列表--> <select id="selectSurveyListByUserProId" resultType=&qu ...

  7. python-使用python获取一段录音

    需要安装pyaudio库. 直接上代码: import pyaudio import wave AUDIO_FILE = '录音文件.wav' def get_audio(filepath, audi ...

  8. .NETCore使用EntityFrameworkCore连接数据库生成实体

    EF Core 通过数据库提供程序插件模型与 SQL Server/SQL Azure.SQLite.Azure Cosmos DB.MySQL.PostgreSQL 和更多数据库配合使用. 使用EF ...

  9. 所有CSS字体属性

    font(在一个声明中设置所有的字体属性) font-family(指定文本的字体系列) font-size(指定文本的字体大小) font-style(指定文本的字体样式) font-variant ...

  10. easyui中的下拉菜单是树形结构时如何实现onchange方法

    今天碰到一个问题就是我写的代码中的一个下拉列表显示的是树型菜单,代码如下(使用的是easyui): .... <tr> <td>地区:</td> <td> ...