由于Java中没有像c中的链表的结构,所以当我们要动态的添加数组的元素,就有了数组队列的概念,而c中对于没有用的数组,有析构函数进行内存空间的回收,而Java则有自己的回收机制——垃圾回收机制,用于自动销毁没有使用的对象,释放内存空间。
数组队列可以实现简单的增,删,查,找功能,当然在JKD中还有一些方法,下文中我会附上我重写的源代码。
一.数组队列的实现步骤
1.定义一个接口,在接口中定义抽象方法
2.定义一个类,实现接口中的方法,并定义初始数组以及数组长度
3.添加元素
1.新建一个数组,长度为原长度+1
2.将原数组的内容循环赋值给新数组
3.将添加的元素添加到新数组的末尾
4.将新数组的地址赋值给原数组
4.删除元素
1.新建一个数组,长度为原长度-1
2.将原数组的内容循环赋值给新数组
3.将新数组的地址赋值给原数组
5.获取数组的长度
1.在添加元素时,数组长度++,
2.在删除元素时,数组长度--,
3.用一个方法返回数组的长度
6.查找数组
1.是否越界
2.用数组下表查找
由于在实际编程时,对于不同内容我们需要不同的类型参数以及变量,但如果不同变量我们又重写一个方法,可能有点过于繁琐,所以我们用泛型来解决这个问题。
二.泛型
1.泛型:符号E
2.可以是任意一种数据类型,一般我们在实例化一个对象是用
类< 实际用到的类型> 对象名 = new 类< 实际用到的类型> ();
的方法来定义一个泛型的对象。
下面是我在查找Java中的JDK里数组队列中的部分方法的实现
import java.util.Collection;
public class ArrayImp<E> implements ArrayInter<E>{
public Object []array = new Object[0];
public int size = 0;
// 将指定的元素添加到此列队的尾部
public boolean add(E e) {
// TODO Auto-generated method stub
Object []arraynew = new Object[array.length+1];
for(int i=0;i<array.length;i++){
arraynew[i] = array[i];
}
arraynew[array.length] = e;
size++;
array = arraynew;
return false;
}
//将制定的元素插入此列表中的指定位置
public void add(int index, E element) {
// TODO Auto-generated method stub
Object []arraynew = new Object[array.length+1];
for(int i=index;i<array.length+1;i++){
arraynew[i] = array[i-1];
}
for(int j=0;j<index;j++){
arraynew[j]=array[j];
}
size++;
arraynew[index-1] = element;
array = arraynew;
}
//按照指定collection中的所有元素添加到此列表的尾部
public void addAll(ArrayInter<E> c) {
int s = c.size();
size = s+size;
Object []ar = new Object[size];
for(int i=s,j=0;j<s;i++,j++){
ar[i] = c.get(j);
}
for(int j=0;j<s;j++){
ar[j]=array[j];
}
array = ar;
}
//移除此列表中的所有元素
public void clear() {
// TODO Auto-generated method stub
array = new ArrayImp[0];
size=0;
}
//返回此列表中指定位置上的元素
public E get(int index) {
// TODO Auto-generated method stub
if(index>=0&&index<size){
return (E)array[index]; //强制转换成E类型
}
return null;
}
//返回此列表中首次出现的指定元素的索引,或者如果此列表不包含元素,则返回-1
public int indexOf(Object o) {
// TODO Auto-generated method stub
for(int i=0;i<size;i++){
if(array[i]==o){
return i+1;
}
}
return -1;
}
//如果此列表中没有元素,则返回true
public boolean isEmpty() {
// TODO Auto-generated method stub
if(size==0)
return true;
return false;
}
//返回此列表中最后一次出现的指定元素的索引,或者如果此列表不包含索引,则返回-1
public int lastIndexOf(Object o) {
// TODO Auto-generated method stub
for(int i=size-1;i>=0;i--){
if(array[i]==o){
return i+1;
}
}
return -1;
}
//移除此列表中指定位置上的元素
public E remove(int index) {
// TODO Auto-generated method stub
Object []arraynew = new Object[array.length-1];
for(int j=0;j<index;j++){
arraynew[j]=array[j];
}
for(int i=index;i<size;i++){
arraynew[i-1]=array[i];
}
array=arraynew;
size--;
return null;
}
//移除此列表中首次出现的指定元素
public boolean remove(Object o) {
// TODO Auto-generated method stub
Object []arraynew = new Object[array.length-1];
for(int k=0;k<size;k++){
if(o==array[k]){
for(int j=0;j<k;j++){
arraynew[j]=array[j];
}
for(int i=k;i<size;i++){
arraynew[i]=array[i];
}
array=arraynew;
size--;
}
}
return false;
}
//有指定的元素替代此列表中指定位置上的元素
public E set(int index, E element) {
// TODO Auto-generated method stub
array[index-1]=element;
return null;
}
//返回此列表中元素的大小
public int size() {
// TODO Auto-generated method stub
return size;
}
@Override
public boolean addAll(Collection<? extends E> c) {
// TODO Auto-generated method stub
return false;
}
}