面试常问的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 ...
随机推荐
- C# 学习第七天
P96 面向对象的概念 ①先有的 面向过程 --------> 然后才衍生出面向对象的思想 ②面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作 比如说 把大象塞进冰箱去 ③面向过 ...
- Java基础进阶:学生管理系统数组方式分包源码实现,教师管理系统集合和数组两种方式源码实现,图书馆管理系统源码实现,现附重难点,代码实现源码,课堂笔记,课后扩展及答案
1.案例驱动模式 1.1案例驱动模式概述 (理解) 通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题 1.2案例驱动模式的好处 (理解) 解决重复代码 ...
- 常用Appium API
以最右App为例 .apk文件网盘地址: 链接:https://pan.baidu.com/s/1L4MYkhpb5ECe8XeaneTx_Q 提取码:0jqm 操作类API # -*- coding ...
- SQLServer之 Stuff和For xml path
示例 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行,比如表中有两列数据 : 类别 名称 AAA 企业1 AAA ...
- H3C路由器配置——动态路由RIP协议
一.静态路由的不足 静态路由适用于:小规模的网络.架构不怎么调整的网络.没有环路的网络 二.RIP协议工作过程 2.1.工作特点 n路由信息协议RIP(Routing Information Prot ...
- 超级电容(Supercapacitor) 和电池的比较
之前看到同事在电路设计里使用了超级电容来进行供电,好奇为什么没有用到普通的电池,于是就是找了找两个的区别.有篇文章讲得挺好,所以就直接翻译一下. 超级电容有点像普通电池和一般电容的结合体,能比一般的电 ...
- 云计算之3---OpenStack
KVM管理平台 KVM实现了虚拟化核心的监视工具,其在UI方便的管理工具多种多样.比较典型的管理工具有virsh,virt-manager,ovirt等. virsh为命令行管理工具,功能强大 ...
- 大话MySQL锁
一.锁介绍 不同存储引擎支持的锁是不同的,比如MyISAM只有表锁,而InnoDB既支持表锁又支持行锁. 下图展示了InnoDB不同锁类型之间的关系: 图中的概念比较多不好理解,下面依次进行说明. 1 ...
- 数据库1 --- > 数据库概念、安装、卸载
数据库概念 为什么学习数据库?1.web中的数据量非常大:2. 数据不方便存储和管理 什么是数据库: 用于存储和管理数据的仓库 数据库的特点: 数据可以实现持久化存储,其实数据库就是一个文件系统. ...
- 对象存储 COS 全新集成媒体处理功能
根据<2020年中国网络视听发展研究报告>,截至2020年6月,我国网络视听用户规模达9.01亿,网民使用率95.8%.这表明视频行业已经成为新的流量洼地,而抖音.快手等视频平台的崛起也让 ...