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. mini-web框架-元类-总结(5.4.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 python中万物都是对象 使用python中自带的globals函数返回一个字典 通过这个可以调取当前py文件中的所有东西 当定义一个函数,类,全局 ...

  2. tomcat8默认umask已改为027

    1. umask的简单介绍 不过我们通常只用后三位,同样对应属主属组以及其他用户的权限,例如你的账号umask值为0022(可直接通过umask命令查看), 此时你创建的文件权限默认为644(文件初始 ...

  3. Python(循环语句与数据类型)

    循环语句 对于python来说 基本上循环用的两个 wile 跟静态语言相似 下来是for循环 这个就跟静态语言大大不同了 wile 条件:–>while 循环也就是 当条件为真的时候会一直循环 ...

  4. matlab双坐标轴设定

    clc; clear all; close all; x1 = 0:.1:40; y1 = 4 * cos(x1)./(x1 + 2); x2 = 1:.2:20; y2 = x2.^2 ./ x2. ...

  5. 安装篇七:配置 Nginx 使其支持 PHP 应用

    配置说明(NGINX-PHP) (让nginx  php(中间件)之间建立关系):nginx--php建立关系---fastcgi---cgi 第一个里程: 编写nginx虚拟主机配置文件 第二个里程 ...

  6. navicat12.0.26如何激活

    首先准备好所需工具链接:https://pan.baidu.com/s/1EHATRC0M34n-aNteIyBXbw 密码:r7tf 下载后如图分别为64位和32位. 操作时需要断掉网络   Nav ...

  7. maven打包,跳过生成javadoc

    有时候由于代码中注释错误(比如方法参数)或者maven javadoc插件版本有问题,导致打包报错,而我们着急打包验证问题,没有时间一一修改错误,这时候可以先跳过生成javadoc,继续下一步工作. ...

  8. java连接mongodb数据库

    最近毕设需要用到这个数据库.然而又不会,没办法,只能上网学习学习. 记录一下java连接mongodb数据库的简单方法.这里只是记录一下学习.熟悉一下CURD方法. 但是毕业用到的是SpringBoo ...

  9. 5.从零开始创建一个QT窗口按钮

    如何创建一个QT项目 如何创建一个QT项目 1.创建新项目 2.配置选择 3.增加按钮 4.按钮和窗体的大小标签图标设置 5.信号与槽 6.自定义信号与槽 代码 1.创建新项目 点击文件->新建 ...

  10. OpenGL投影矩阵(Projection Matrix)构造方法

    (翻译,图片也来自原文) 一.概述 绝大部分计算机的显示器是二维的(a 2D surface).在OpenGL中一个3D场景需要被投影到屏幕上成为一个2D图像(image).这称为投影变换(参见这或这 ...