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. 属于同一网段的ip是不是就在同一个局域网?

    参考文章链接: https://zhidao.baidu.com/question/350887200.html?qbl=relate_question_0&word=%D4%DA%D2%BB ...

  2. 图解JanusGraph系列 - 关于JanusGraph图数据批量快速导入的方案和想法(bulk load data)

    大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 整理所有图相关文章,请移步(超链):图数据库系列-文章总目录 源码分析相关可查看github(码文不易,求个sta ...

  3. Github标星26k+!一个神奇的软件!1分钟即可打造了一个科幻风格的终端

    Github掘金计划项目分类汇总(原创不易,若有帮助,欢迎分享/点赞): 编程基础 :精选编程基础如学习路线.编程语言相关的开源项目. 计算机基础:精选计算机基础(操作系统.计算机网络.算法.数据结构 ...

  4. Python处理邮件内容和提取邮件里的url地址

    最近在搞一个邮箱验证账号注册和登录的模块.总结一下.就当记载.文章中涉及到域名和邮箱等都经过处理. 需求是这样子的,注册某个网站的账号,然后注册需要邮件内容激活,登录的时候如果不是常用设备的话也需要认 ...

  5. webform中jQuery获取checkboxlist的value值

    后台绑定 /首先,在绑定checkboxlist时,为ListItem每个对象添加一个alt属性,值保存对应的value值,代码如下 if(dt != null && dt.Rows. ...

  6. 简单测试linq to sql性能

         前些日子,做了一个物业收费系统,cs模式,用到了linq to sql 技术,这是我第一次使用这个东东写程序存取数据库,迷迷糊糊搞得一塌糊涂,当时有个同学他们找好的分页组件,然后写好了调用方 ...

  7. python序列(三)列表元素访问与计数

    1.使用下标直接访问列表元素,如果指定下标不存在,则抛出异常. >>> alist[3] 1 >>> alist[3]=5.5 >>> alist ...

  8. Abp(net core)+easyui+efcore实现仓储管理系统——出库管理之八(五十七)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  9. 拥抱 C/C++ : Android JNI 的使用

    编译工具 CMake 以及 Android 上 JNI 的使用介绍. 编译工具 CMake 在Android Studio 2.2 之后,工具中增加了 CMake 的支持,于是我们有两种选择来编译 c ...

  10. 发送微信通知 java

    //实现类@Service public class WeChatServiceImpl implements IWeChatService { @Override public WeChatSend ...