Java-数组队列

1、为何要创建一个数组队列?

  数组的优点和缺点:

    优点:访问速度是所有数据结构中最快的一种。

    缺点:大小固定,如果要存储的数据个数不确定的时候?
           数组空间不够,导致越界异常发生
           如果空间太大了,数据不够,就会浪费内存空间
        插入、删除数据,的操作非常麻烦。 

  可见数组虽然有访问速度快的优点,但是数组的大小是固定了的,经常会出现空间不够或者数组越界的情况,并且删除和插入数据特别麻烦,因此就引入了数组队列的概念

2、数组队列的实现原理

   数组的大小是根据你要添加的数据来决定的。
   根据添加、删除数据的个数,来创建新的数组。
   数组名中存储的是数组对象在堆内存空间的首地址。
   新数组名中存储了新数组对象的首地址。
   把这个首地址给原来数组名。
   原来的数组对象,JVM(java虚拟机)的垃圾回收机制,会销毁对象,释放内存空间。

3、数组队列的具体实现方法

  数组队列:定义类,封装对数组的操作。
  数组队列的要求:
  在特殊情况,数组队列中只能存储某一种数据类型,如果存储其他的数据就报错。
  在特殊情况,数组中可以存储任意一种数据类型的数据
  上面两种情况的实现需要用到泛型<E>、<K、V>、<T>、...
     ①泛型不是Java中的一种数据类型。
     ②只是一个特殊的符号,可以在你不确定要存储什么类型的数据时,用这个符号代替Java中所有的数据类型。
   当你使用的时候,你可以用对应的数据类型来代替这个符号,这样
   就只能存储你指定的这一种数据类型;
   如果你不指定,则任意一种数据类型都可以存储。

4、自己定义一个数组队列的类

代码如下:

 package com.cyt.myarraylist0126;

 public class Myarraylist<e> {
// 定义一个Object类型的数组
private Object[] array = null;
// 定义这个数组中已经添加的元素个数
private int size = 0; // 通过构建函数初始化object数组
public Myarraylist() {
array = new Object[0];
} public Myarraylist(int length) {
array = new Object[length];
} // 定义了一个往队列末尾添加元素的方法
public void add(e stu) {
if (array.length == 0 || array.length == size) {
Object[] newarray = new Object[array.length + 1];
for (int i = 0; i < array.length; i++) {
newarray[i] = array[i];
}
newarray[array.length] = stu;
array = newarray;
size++;
} else {
array[size++] = stu;
}
}
//定义了一个通过下标往队列数组里面插入元素的方法
public boolean add(int index, e stu) {
if (index < 0 || index >= array.length)
return false;
else {
Object[] newarray = new Object[array.length + 1];
for (int i = 0; i < array.length; i++) {
newarray[i] = array[i];
}
array = newarray;
for (int i = array.length - 1; i > index; i--) {
array[i] = array[i - 1];
}
array[index] = stu;
size++;
return true; } } //定义了一个往队列数组通过下标添加队列数组的方法
// C++的移动(需要经常复习)
public boolean add(int index, Myarraylist<e> mal) {
if (index < 0 || index >= array.length)
return false;
else if (array.length - size >= mal.size) { for (int i = size + mal.size - 1; i >= index + mal.size; i--) {
array[i] = array[i - mal.size];
}
for (int i = index; i < index + mal.size; i++) {
array[i] = mal.get(i - index);
}
size += mal.size;
return true;
} else {
Object[] newarray = new Object[mal.size + size];
for (int i = 0; i < size; i++) {
newarray[i] = array[i];
}
array = newarray;
for (int i = size + mal.size - 1; i >= index + mal.size; i--) {
array[i] = array[i - mal.size];
}
for (int i = index; i < index + mal.size; i++) {
array[i] = mal.get(i - index);
}
size += mal.size;
return true;
} } //定义了一个通过下标移除队列数组已有元素的方法
public e remove(int index) {
if (index < 0 || index >= size)
return null;
// 获取要移除的数据
Object stu = array[index];
int i;
// 把index位置后的数据都往前移一位
for (i = index + 1; i < size; i++)
array[i - 1] = array[i];
array[i - 1] = null;
size--;
return (e) stu;
} //定义了一个移除队列元素中特定元素的方法
public boolean remove(e stu) {
int index = 0;
for (index = 0; index < array.length; index++) {
if (array[index] == stu) {
break;
}
}
if (index < 0 || index >= array.length)
return false;
else {
// 获取要移除的数据
Object stu2 = array[index];
// 把index位置后的数据都往前移一位
for (int i = index + 1; i < size; i++)
array[i - 1] = array[i];
size--;
return true;
}
}
//定义了一个移除队列中所有指定对象的方法
// 非常易错的地方
public int removeAll(e stu) {
boolean a = true;
while (a) {
a = false;
for (int i = 0; i < array.length; i++) {
if (array[i] == stu) {
a = true;
int j;
for (j = i; j < array.length - 1; j++) {
array[j] = array[j + 1];
}
// 关键点
array[j] = null;
size--;
break;
}
}
} return 0;
}
//定义了一个通过下标更新元素的方法
public boolean update(int index, e stu) {
if (index < 0 || index >= array.length)
return false;
else {
array[index] = stu;
return true;
}
}
//定义了一个更新所有指定对象的方法
public int updateAll(e stu, e newstu) {
for (int i = 0; i < array.length; i++) {
if (array[i] == stu) {
array[i] = newstu;
}
}
return 0;
}
//定义了一个获取数组中特定下标元素的方法
public e get(int index) {
if (index < 0 || index >= size)
return null;
return (e) array[index];
}
//定义了一个获取队列数组中已有元素个数的方法
public int size() {
return size;
}
//定义了一个获取队列数组的方法
public e[] getarray() {
return (e[]) array;
}
}

5、测试自己创立的队列数组

代码如下

①首先创立了一个学生类

 public class Students {
private String name;
private int credit;
private int age;
public Students(String name,int credit,int age){
this.name = name;
this.credit = credit;
this.age =age;
} public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setCredit(int credit){
this.credit = credit;
}
public int getCredit(){
return credit;
}
public void setaAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public void show(){
System.out.println("Name "+ name+" Credit " + credit+ " Age "+ age+"\n");
}
}

②在主方法里面随机建立学生对象添加到队列数组里面

     public static void main(String[] args) {
Myarraylist<Students> array = new Myarraylist();
int size;
String name = "";
int credit;
int age;
Random random = new Random();
// Students stu3 = new Students("CYT",5,18);
// array.add(stu3);
size = random.nextInt(5) + 1;
for (int i = 0; i < size; i++) {
credit = random.nextInt(5);
age = random.nextInt(5) + 18;
for (int j = 0; j < 4; j++) {
name += (char) (random.nextInt(26) + 97);
}
array.add(new Students(name, credit, age));
name = "";
}
// array.add(stu3); System.out.println("人数:" + size + "\n");
System.out.println("人员信息:" + "\n");
for (int i = 0; i < array.size(); i++) {
Students stu = array.get(i);
stu.show();
}

结果显示:

Java-数组队列的更多相关文章

  1. java——数组队列 ArrayQueue

    队列: Array: package Date_pacage; public class Array<E> { //叫它静态数组 //private int[] data; private ...

  2. JAVA该队列中的数组,圆阵队列,链队列

    /** * 文件名:QueueText.java * 时间:2014年10月22下午9:05:13 * 笔者:维亚康姆维修 */ package chapter3; /** * 类名:ArrayQue ...

  3. Java中的自定义数组队列

    在Java中,作为所有数据结构中存储和获取速度最快的一种,数组凭借其这种简单易用的优势在各个方面都能大显神威.但是数组也有自身的局限性.数组的长度必须是固定的一旦定义之后就无法动态的更改,这就会造成这 ...

  4. JAVA之数组队列

    package xxj.datastructure0810; import java.util.Random; public class DataStructure { /** * @param ar ...

  5. 【栈和队列】5、队列概述与数组队列的基本实现 - Java

    3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...

  6. java数组实现队列

    数组队列 用数组实现的队列,也叫循环队列.就是定义一个数组,用两个下标head,tail表示队头和队尾.当队头和队尾相等时,队列为空.当队尾+1等于队头时,队列为满. 注意tail的值,当插入一个元素 ...

  7. 并发编程(八)—— Java 并发队列 BlockingQueue 实现之 ArrayBlockingQueue 源码分析

    开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现. 阻塞队列概要 阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列的阻塞 ...

  8. java常用队列分析

    一.ArrayBlockingQueue 首先看一段源码: public class ArrayBlockingQueue<E> extends AbstractQueue<E> ...

  9. 细说并发5:Java 阻塞队列源码分析(下)

    上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  10. 细说并发4:Java 阻塞队列源码分析(上)

    上篇文章 趣谈并发3:线程池的使用与执行流程 中我们了解到,线程池中需要使用阻塞队列来保存待执行的任务.这篇文章我们来详细了解下 Java 中的阻塞队列究竟是什么. 读完你将了解: 什么是阻塞队列 七 ...

随机推荐

  1. 大数据平台的技术演化之路 诸葛io平台设计实例

    如今,数据分析能力正逐渐成为企业发展的标配,企业通过数据分析的过程将数据中的信息提取出来,进行处理.识别.加工.呈现,最后成为指导企业业务发展的知识和智慧.而处理.识别.加工.呈现的过程从本质上来讲, ...

  2. HiveSql调优经验

    背景 在刚使用hive的过程中,碰到过很多问题,任务经常需要运行7,8个小时甚至更久,在此记录一下这个过程中,我的一些收获 join长尾 背景 SQL在Join执行阶段会将Join Key相同的数据分 ...

  3. 调用Android中的软键盘

    我们在Android提供的EditText中单击的时候,会自动的弹 出软键盘,其实对于软键盘的控制我们可以通过InputMethodManager这个类来实现.我们需要控制软键盘的方式就是两种一个是像 ...

  4. Flare-On4 解题复现

    01 是一个 html 页面, 用开发者工具看看,发现是简单的 js 加密. 猜测加密算法可逆,试着用 PyvragFvqrYbtvafNerRnfl@syner-ba.pbz 作为输入,然后调试 , ...

  5. Android:Building " " Gradle project info 问题

    Android Studio新建或者打开项目的时候,一直卡在Building "" Gradle project info 进度上不动,猜测是网络原因下载gradle不成功. 两种 ...

  6. java基础——队列

    目录 前言 基础 实现: 两个队列模拟一个堆栈 前言 java已经提供了堆和栈的相对应的类,这里只是模拟一下队列. 队列是一种先进先出的线性表. 基础 java5中新增加了java.util.Queu ...

  7. Apache服务器如何通过.htaccess文件设置防盗链?

    Apache服务器通过.htaccess文件设置防盗链 用户经常面对的一个问题就是服务器的流量问题,而站点文件被盗链是其中最为主要的部分.所谓盗链,是指其他网站直接链接我们网站上的文件,一般来说,盗链 ...

  8. [翻译] DDExpandableButton

    DDExpandableButton https://github.com/ddebin/DDExpandableButton Purpose - 目的 DDExpandableButton is a ...

  9. Linxu系统修改文件描述符

    修改系统文件描述符 文件描述符:无符号整数(0-65535),进程使用它来标示打开的文件    /etc/security/limits.conf:可以修改CPU,堆栈,   1.查看最大的标示符 u ...

  10. 【笔记】python的sqlalchemy数据库连接池原理的说明

    sqlalchemy数据库连接池的使用方式是延迟初始化,就是说一开始你调用create_engine(...)后创建的那个数据库池是空的,你后面通过session.connection()或者engi ...