队列与泛型

上节课我们学了数组,发现在数据存住方面数组还是很方便的。但是在定义数组时必须要定义数组的大小,可是在有些时候哦我们不知道用户到底要存储多少个数据,把数组定义小了就不够用,定义多了还浪费空间。那这时我们就会用到队列,队列呢,顾名思义,就是像排队一样呗,你来了就排到最后面就可以了。队列相对于数组,其特征就是我们不用规定它的长度。

实现队列的思路呢也很简单,就是先定义一个数组,然后有新数据存储时,创建一个比原数组长度多1的数组,将原数组内容复制到新数组中,然后把数据存储到新数组最后就好。

下面就是一个例子:

publicclass Queue {

   public Student[] array;//先声明一个学生类数组

   intsize = 0;//数组长度为0

 

   // 构造方法实例化数组

   public Queue() {

       array = new Student[size];

   }

 

   // 添加方法

   publicvoid add(Student o) {

//新建一个新的数组,比原数组长度大1

       Student array1[] = new Student[size + 1];

//将原数组数据对应存储到新数组里

       for (int i = 0; i < size; i++) {

           

            array1[i] = array[i];

       }

       array1[size] = o;

       size++;

       array = array1;//将新数组的地址赋给原数组

   }

}

由此可见,队列的添加数据方法其实也就是两个数组倒来倒去。

我们可以给队列写出添加方法,自然也可以写出查找方法,删除方法,等等等等。

下面是我写出的删除方法的代码

// 删除方法,根据学生姓名属性先查找到此数据的位置

   publicvoid delete(String name) {

       int a = 0;

       boolean existence= false;//定义一个布尔变量,判断此数据是否存在时使用

       // 查找此信息找到后跳出训话 a记录次信息下标

       for (int i = 0; i < size; i++) {

            a = i;

            if (array[i].name.equals(name)) {

                 size--;//要删除此数据,队列的size要减一

                 existence = true;//存在此数据为true

                 break;//跳出循环

 

            }

       }

       // 当存在此数据时,此数据删除后,其后所有数据前移一位

       if (existence) {

            for (int j = a; j < size; j++) {

                 array[j] = array[j + 1];

            }

       } else {//不存在此数据时进行提醒

            System.out.println("请确认是否输入正确,系统没有此信息!");

       }

   }

队列用起来挺方便的,但是刚刚我们写的这个队列,他只能添加student类型(当然还有他的子类)的对象;这就太麻烦了。有没有什么方法能让我们写一个队列能存储各种数据呢?答案是我们可以使用“泛型”语法。

泛型有很多种,我们常用的有EKV三种,泛型泛指java中所有的引用类型,EElement)代表它里面的元素是泛型的,KKey)代表它里面的键值是泛型的,VValue)的话表示他的值是泛型的。

所以说,要解决刚刚那个问题,只需将队列中所存放的类型定义为泛型即可。

publicclass Queue<E> {

   public Object[] array;//先声明一个Object类数组

   intsize = 0;//数组长度为0

 

   // 构造方法实例化数组

   public Queue() {

       array = new Object [size];

   }

 

   // 添加方法

//要注意加元素的时候参数类型也必须为E

publicvoid add(E element) {

//新建一个新的数组,比原数组长度大1

       Object array1[] = new Object [size + 1];

//将原数组数据对应存储到新数组里

       for (int i = 0; i < size; i++) {

           

            array1[i] = array[i];

       }

       array1[size] = element;

       size++;

       array = array1;//将新数组的地址赋给原数组

   }

}

这样的话就可以了,不过要是向此队列中添加别的带有返回值方法时,一定得记得返回值也必须是E型的。

 

用泛型还有别的一个好处就是我们也可以单一指定向队列中添加的元素类型,如:

Public static void main(String args[]){

Queue<Student> aq=new Queue<Student> ();

aq.add(new Student());

aq.add(new JFrame());//这行语句会报错因为创建队列对象时指定了队列里元素类型都为Student类,别的类型不能添加。

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值