Java-数组队列
1、为何要创建一个数组队列?
数组的优点和缺点:
优点:访问速度是所有数据结构中最快的一种。
缺点:大小固定,如果要存储的数据个数不确定的时候?
数组空间不够,导致越界异常发生
如果空间太大了,数据不够,就会浪费内存空间
插入、删除数据,的操作非常麻烦。
可见数组虽然有访问速度快的优点,但是数组的大小是固定了的,经常会出现空间不够或者数组越界的情况,并且删除和插入数据特别麻烦,因此就引入了数组队列的概念
2、数组队列的实现原理
数组的大小是根据你要添加的数据来决定的。
根据添加、删除数据的个数,来创建新的数组。
数组名中存储的是数组对象在堆内存空间的首地址。
新数组名中存储了新数组对象的首地址。
把这个首地址给原来数组名。
原来的数组对象,JVM(java虚拟机)的垃圾回收机制,会销毁对象,释放内存空间。
3、数组队列的具体实现方法
数组队列:定义类,封装对数组的操作。
数组队列的要求:
在特殊情况,数组队列中只能存储某一种数据类型,如果存储其他的数据就报错。
在特殊情况,数组中可以存储任意一种数据类型的数据
上面两种情况的实现需要用到泛型<E>、<K、V>、<T>、...
①泛型不是Java中的一种数据类型。
②只是一个特殊的符号,可以在你不确定要存储什么类型的数据时,用这个符号代替Java中所有的数据类型。
当你使用的时候,你可以用对应的数据类型来代替这个符号,这样
就只能存储你指定的这一种数据类型;
如果你不指定,则任意一种数据类型都可以存储。
在特殊情况,数组队列中只能存储某一种数据类型,如果存储其他的数据就报错。
在特殊情况,数组中可以存储任意一种数据类型的数据
上面两种情况的实现需要用到泛型<E>、<K、V>、<T>、...
①泛型不是Java中的一种数据类型。
②只是一个特殊的符号,可以在你不确定要存储什么类型的数据时,用这个符号代替Java中所有的数据类型。
当你使用的时候,你可以用对应的数据类型来代替这个符号,这样
就只能存储你指定的这一种数据类型;
如果你不指定,则任意一种数据类型都可以存储。
4、自己定义一个数组队列的类
代码如下:
1 package com.cyt.myarraylist0126; 2 3 public class Myarraylist<e> { 4 // 定义一个Object类型的数组 5 private Object[] array = null; 6 // 定义这个数组中已经添加的元素个数 7 private int size = 0; 8 9 // 通过构建函数初始化object数组 10 public Myarraylist() { 11 array = new Object[0]; 12 } 13 14 public Myarraylist(int length) { 15 array = new Object[length]; 16 } 17 18 // 定义了一个往队列末尾添加元素的方法 19 public void add(e stu) { 20 if (array.length == 0 || array.length == size) { 21 Object[] newarray = new Object[array.length + 1]; 22 for (int i = 0; i < array.length; i++) { 23 newarray[i] = array[i]; 24 } 25 newarray[array.length] = stu; 26 array = newarray; 27 size++; 28 } else { 29 array[size++] = stu; 30 } 31 } 32 //定义了一个通过下标往队列数组里面插入元素的方法 33 public boolean add(int index, e stu) { 34 if (index < 0 || index >= array.length) 35 return false; 36 else { 37 Object[] newarray = new Object[array.length + 1]; 38 for (int i = 0; i < array.length; i++) { 39 newarray[i] = array[i]; 40 } 41 array = newarray; 42 for (int i = array.length - 1; i > index; i--) { 43 array[i] = array[i - 1]; 44 } 45 array[index] = stu; 46 size++; 47 return true; 48 49 } 50 51 } 52 53 //定义了一个往队列数组通过下标添加队列数组的方法 54 // C++的移动(需要经常复习) 55 public boolean add(int index, Myarraylist<e> mal) { 56 if (index < 0 || index >= array.length) 57 return false; 58 else if (array.length - size >= mal.size) { 59 60 for (int i = size + mal.size - 1; i >= index + mal.size; i--) { 61 array[i] = array[i - mal.size]; 62 } 63 for (int i = index; i < index + mal.size; i++) { 64 array[i] = mal.get(i - index); 65 } 66 size += mal.size; 67 return true; 68 } else { 69 Object[] newarray = new Object[mal.size + size]; 70 for (int i = 0; i < size; i++) { 71 newarray[i] = array[i]; 72 } 73 array = newarray; 74 for (int i = size + mal.size - 1; i >= index + mal.size; i--) { 75 array[i] = array[i - mal.size]; 76 } 77 for (int i = index; i < index + mal.size; i++) { 78 array[i] = mal.get(i - index); 79 } 80 size += mal.size; 81 return true; 82 } 83 84 } 85 86 //定义了一个通过下标移除队列数组已有元素的方法 87 public e remove(int index) { 88 if (index < 0 || index >= size) 89 return null; 90 // 获取要移除的数据 91 Object stu = array[index]; 92 int i; 93 // 把index位置后的数据都往前移一位 94 for (i = index + 1; i < size; i++) 95 array[i - 1] = array[i]; 96