java集合框架最初是源自于数组,所以我们在学习java集合框架的时候一定不要脱离了数组的思想。数组的出现给了人们另一种新的对数据处理的认识观。
我们知道,数组定义时必须指定长度,这就在一定程度上限制了数组的功能。于是集合框架就应运而生了,简单地说,现在我们要讲的自定义队列就是会变长的的数组。可以想象,实现这一功能是非常简单的,只要我们得到当前数组长度,然后根据这个数值新创建一个具有新的长度的数组,就可以了。
自定义队列的主要思想就是上述所讲了,根据这个思想,现在我们就又可以多实现一些功能,比如:把一个数据插入到对列(数组)的第六号位置、删除第六号位置上的数据,,,
如下代码:
package hhf.自定义队列1020;
public class queue {
//创建一个最大众化的对象
int [] list = new int[0];
//添加函数
public void add(int i2){
//创建一个比原来数组大一号的新数组
int [] listnew = new int[list.length + 1];
//添加数据到最后一位
listnew[list.length] = i2;
//前面的空位全用list中原来的数据补充
for(int i = 0; i< list.length; i++)
listnew[i] = list[i];
//还给list指针
list = listnew;
}
//删除一个元素
public void delete(int index){
//如果不在数组里 就不要删除了
if(index < 0 || index >= list.length)
return;
//创建一个比原来数组短一号的数组
int [] listnew = new int[list.length - 1];
//删除的那个号前的元素全部复制到新的数组
for(int i = 0; i< index; i++)
listnew[i] = list[i];
//跳过那个元素,继续复制
for(int i = index+1; i< list.length; i++)
listnew[i-1] = list[i ];
//还给list
list = listnew;
}
//查找函数
public int find(int index){
return list[index];
}
//返回大小
public int size(){
return list.length;
}
}
我们现在相当于把数组封装起来了,创建了一个queue类,在类中提供了add,delete,find,size函数,使用的时候我们就创建一个queue类的对象,调用对象的方法,隐形的使用了数组。
如下面就是一种使用的方法
package hhf.自定义队列1020;
import java.util.Random;
public class test {
public static void main(String[] args) {
//定义一个队列对象
queue q_list = new queue();
//用随机数的方法来选择队列中元素的个数
Random ran = new Random();
int size = ran.nextInt(20);
//用以个for循环添加队列元素
System.out.println("一共有队列元素 "+size+" 个");
//添加元素
for(int i = 0;i < size ; i++)
q_list.add(i);
//打印队列元素
for(int i = 0; i < q_list.size(); i++)
System.out.println(q_list.find(i));
System.out.println("============================");
//删除六号元素
q_list.delete(6);
System.out.println("删除第六号元素后一共有队列元素 "+q_list.size()+" 个");
//打印队列元素
for(int i = 0; i < q_list.size(); i++)
System.out.println(q_list.find(i));
}
}
有了这样的队列类使用起来就比较简单而且容易理解。
当我们肯定了以上的思维后,我们再稍微做一点点拓展——可以改变数组里保存的数据类型。要实现这个功能也只需要稍微改变代码就可。
package hhf.自定义泛型1021;
public class Generics<E> {
//创建一个最大众化的对象
Object [] list = new Object[0];
//添加函数
public void add(E i2){
//创建一个比原来数组大一号的新数组
Object [] listnew = new Object[list.length + 1];
//添加数据到最后一位
listnew[list.length] = i2;
//前面的空位全用list中原来的数据补充
for(int i = 0; i< list.length; i++)
listnew[i] = list[i];
//还给list指针
list = listnew;
}
//删除一个元素
public void delete(int index){
//如果不在数组里 就不要删除了
if(index < 0 || index > list.length)
return;
//创建一个比原来数组短一号的数组
Object [] listnew = new Object[list.length - 1];
//删除的那个号前的元素全部复制到新的数组
for(int i = 0; i< index; i++)
listnew[i] = list[i];
//跳过那个元素,继续复制
for(int i = index+1; i< list.length; i++)
listnew[i-1] = list[i ];
//还给list
list = listnew;
}
//查找函数
public Object find(int index){
return list[index];
}
//返回大小
public int size(){
return list.length;
}
}
我们发现只要将
int [] list = new int[0];改为Object [] list = new Object[0];
即,将数据类型改为Object,
只要将public void add(int i2)改为public void add(E i2)
即,将行参类型改为E ,就可以了。
那么在使用的时候也就相应发生了细微变化
改queue q_list = new queue();为
Generics<String> generics_list = new Generics<String>();在创建对象的时候给它指定类型就可以了。
以上就是我给大家介绍的自定义队列,说白了,上面所述的队列也就是另一种升级版的数组了。