zoukankan      html  css  js  c++  java
  • Java-数组队列

    Java-数组队列

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

      数组的优点和缺点:

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

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

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

     

    2、数组队列的实现原理

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

     

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

     

      数组队列:定义类,封装对数组的操作。

     

      数组队列的要求:
      在特殊情况,数组队列中只能存储某一种数据类型,如果存储其他的数据就报错。
      在特殊情况,数组中可以存储任意一种数据类型的数据
      上面两种情况的实现需要用到泛型<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         array[i - 1] = null;
     97         size--;
     98         return (e) stu;
     99     }
    100 
    101     //定义了一个移除队列元素中特定元素的方法
    102     public boolean remove(e stu) {
    103         int index = 0;
    104         for (index = 0; index < array.length; index++) {
    105             if (array[index] == stu) {
    106                 break;
    107             }
    108         }
    109         if (index < 0 || index >= array.length)
    110             return false;
    111         else {
    112             // 获取要移除的数据
    113             Object stu2 = array[index];
    114             // 把index位置后的数据都往前移一位
    115             for (int i = index + 1; i < size; i++)
    116                 array[i - 1] = array[i];
    117             size--;
    118             return true;
    119         }
    120     }
    121     //定义了一个移除队列中所有指定对象的方法
    122     // 非常易错的地方
    123     public int removeAll(e stu) {
    124         boolean a = true;
    125         while (a) {
    126             a = false;
    127             for (int i = 0; i < array.length; i++) {
    128                 if (array[i] == stu) {
    129                     a = true;
    130                     int j;
    131                     for (j = i; j < array.length - 1; j++) {
    132                         array[j] = array[j + 1];
    133                     }
    134                     // 关键点
    135                     array[j] = null;
    136                     size--;
    137                     break;
    138                 }
    139             }
    140         }
    141 
    142         return 0;
    143     }
    144     //定义了一个通过下标更新元素的方法
    145     public boolean update(int index, e stu) {
    146         if (index < 0 || index >= array.length)
    147             return false;
    148         else {
    149             array[index] = stu;
    150             return true;
    151         }
    152     }
    153     //定义了一个更新所有指定对象的方法
    154     public int updateAll(e stu, e newstu) {
    155         for (int i = 0; i < array.length; i++) {
    156             if (array[i] == stu) {
    157                 array[i] = newstu;
    158             }
    159         }
    160         return 0;
    161     }
    162     //定义了一个获取数组中特定下标元素的方法
    163     public e get(int index) {
    164         if (index < 0 || index >= size)
    165             return null;
    166         return (e) array[index];
    167     }
    168     //定义了一个获取队列数组中已有元素个数的方法
    169     public int size() {
    170         return size;
    171     }
    172     //定义了一个获取队列数组的方法
    173     public e[] getarray() {
    174         return (e[]) array;
    175     }
    176 }

     

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

    代码如下

    ①首先创立了一个学生类

     

     1 public class Students {
     2     private String name;
     3     private int credit;
     4     private int age;
     5     public Students(String name,int credit,int age){
     6         this.name = name;
     7         this.credit = credit;
     8         this.age  =age;
     9     }
    10     
    11     public void setName(String name){
    12         this.name = name;
    13     }
    14     public String getName(){
    15         return name;
    16     }
    17     public void setCredit(int credit){
    18         this.credit = credit;
    19     }
    20     public int getCredit(){
    21         return credit;
    22     }
    23     public void setaAge(int age){
    24         this.age = age;
    25     }
    26     public int getAge(){
    27         return age;
    28     }
    29     public void show(){
    30         System.out.println("Name "+ name+" Credit " + credit+ " Age "+ age+"
    ");
    31     }
    32 }

     

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

     

     1     public static void main(String[] args) {
     2         Myarraylist<Students> array = new Myarraylist();
     3         int size;
     4         String name = "";
     5         int credit;
     6         int age;
     7         Random random = new Random();
     8         // Students stu3 = new Students("CYT",5,18);
     9         // array.add(stu3);
    10         size = random.nextInt(5) + 1;
    11         for (int i = 0; i < size; i++) {
    12             credit = random.nextInt(5);
    13             age = random.nextInt(5) + 18;
    14             for (int j = 0; j < 4; j++) {
    15                 name += (char) (random.nextInt(26) + 97);
    16             }
    17             array.add(new Students(name, credit, age));
    18             name = "";
    19         }
    20         // array.add(stu3);
    21 
    22         System.out.println("人数:" + size + "
    ");
    23         System.out.println("人员信息:" + "
    ");
    24         for (int i = 0; i < array.size(); i++) {
    25             Students stu = array.get(i);
    26             stu.show();
    27         }

     

    结果显示:


      

     

  • 相关阅读:
    SpringAOP-基于@AspectJ的简单入门
    SpringAOP-切面优先级
    Commons_IO_FileUtils的使用
    java_IO_装饰器
    java_IO_3
    java_IO_2
    java_IO_1
    App Inventor
    java学习_5_24
    java学习_5_23
  • 原文地址:https://www.cnblogs.com/782687539-nanfu/p/10325975.html
Copyright © 2011-2022 走看看