面试常问的ArrayQueue底层实现
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底层实现的更多相关文章
- 面试常问的几个排序和查找算法,PHP实现
冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...
- python基础之面试常问
目录 python相对其他语言有什么特点? python内存管理机制,gc机制的了解,gc回收三种算法. lambda函数 高级函数 map.reduce.filter.sorted等. 简述六种基本 ...
- 面试常问的dubbo的spi机制到底是什么?
前言 dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.作为spring cloud alibaba体系中重要的一部分,随着spring cloud alibaba在 ...
- 各大互联网公司java开发面试常问问题
本人是做java开发的,这是我参加58,搜狐,搜狗,新浪微博,百度,腾讯文学,网易以及其他一些小的创业型公司的面试常被问的问题,当然有重复,弄清楚这些,相信面试会轻松许多. 1. junit用法,be ...
- Java面试必问之Hashmap底层实现原理(JDK1.7)
1. 前言 Hashmap可以说是Java面试必问的,一般的面试题会问: Hashmap有哪些特性? Hashmap底层实现原理(get\put\resize) Hashmap怎么解决hash冲突? ...
- 面试常问Spring IOC,不得不会。
广义的 IOC IoC(Inversion of Control) 控制反转,即“不用打电话过来,我们会打给你”. 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 DI .DL 的关系( ...
- Java面试常问的问题(转载)
并发.JVM.分布式.TCP/IP协议 1)Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的.以下简单模拟一个数据结构的连环炮. ...
- 面试必问:HashMap 底层实现原理
HashMap是在面试中经常会问的一点,很多时候我们仅仅只是知道HashMap他是允许键值对都是Null,并且是非线程安全的,如果在多线程的环境下使用,是很容易出现问题的. 这是我们通常在面试中会说的 ...
- 面试常问的Java虚拟机内存模型,看这篇就够了!
一.虚拟机 同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集是不同的. 同一个java代码在windows上生成的机器码可能是0101.......,在lin ...
随机推荐
- kali2020.01修改root终端颜色
kali2020.01非root用户的终端和root用户终端颜色存在较大差异: 修改配置,将非root用户的配置替换root用户,输入以下命令即可: cd /home/lijingrong //切换到 ...
- openstack高可用集群20-openstack计算节点宕机迁移方案
openstack计算节点宕机迁移方案 情景一:/var/lib/nova/instances/ 目录不共享的处理方法(类似手动迁移云主机到其他节点)
- 如何修改openstack虚拟机密码
1.虚拟机创建时设置密码 计算节点安装以下软件包 yum install libguestfs python-libguestfs libguestfs-tools-c 配置计算节点nova配置文件/ ...
- PHP函数number_format()
PHP的number_format() 函数通过千位分组来格式化数字. 语法: number_format(number,decimals,decimalpoint,separator) 注释:该函数 ...
- 深入理解MySQL系列之索引
索引 查找一条数据的过程 先看下InnoDB的逻辑存储结构: 表空间:可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中.默认有个共享表空间ibdata1.如果启用innodb ...
- [Python] iupdatable包:Status 模块使用介绍
常用状态做的一个集合,方便用在函数返回值中区分不同状态结果. 简单举例: from iupdatable import Status def fun(): print("do somethi ...
- BPF的可移植性和CO-RE (Compile Once – Run Everywhere)
BPF的可移植性和CO-RE (Compile Once – Run Everywhere) 在上一篇文章中介绍了提高socket性能的几个socket选项,其中给出了几个源于内核源码树中的例子,如果 ...
- win shift s截图不能用(已解决)
win10上面 win shift s不能的原因是快捷键冲突导致的: 比如说你的电脑上安装了OneNode2016(讽刺的是这是微软自家的软件),或者其他截图软件都有可能导致快捷键冲突,从而不能使用. ...
- C语言I博客作业1
1 .班级链接: https://edu.cnblogs.com/campus/zswxy/SE2020-3 2 .作业要求链接: https://edu.cnblogs.com/campus/zsw ...
- 01 . Go之从零实现Web框架(框架雏形, 上下文Context,路由)
设计一个框架 大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架.不同的框架设计理念和提供的功能有很大的差别.比如 Python 语言的 django和flask,前者大而全,后者 ...