Java中的自定义数组队列

在Java中,作为所有数据结构中存储和获取速度最快的一种,数组凭借其这种简单易用的优势在各个方面都能大显神威。但是数组也有自身的局限性。数组的长度必须是固定的一旦定义之后就无法动态的更改,这就会造成这样的问题,如果数组已满,就无法继续添加数据(当然你可以定义一个“足够大的数组”,但问题是多大才是足够大呢?太小不够,太大浪费内存空间)。如果删除一个数据,它的内存空间空着没有被使用。另外数组只能存储同一类型的数据,如果把它设置成Object类型的话,是可以存不同类型的数据了,但是设想这样一种情况:现在项目中有定义了一个Object类型的数组。项目中拥有很多的图形类,确实这个数组都能保存,但问题是这时用户保存了一个其他类型的东西,程序是不会报错的,因为类型是Object。这样肯定是不行的。另外在Java中向上转型是安全的,Object类型可以适应一切类型,但是向下转型确是不安全的。比如下面的代码:

 1 package Cbs;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6         //定义Object类型的数组
 7         Object[] array=new Object[10];
 8         //使用基本数据类型的包装类
 9         Integer i=10;
10         Float f=12.0f;
11         //向上转型,没有问题
12         array[0]=i;
13         array[1]=f;
14         //向下转型
15         int i1=(int)array[0];
16         //注意array[1]中存储的是12.0,但是这样子语法没有问题,编译不会出错
17         int i2=(int)array[1];
18         System.out.println(i1);
19         System.out.println(i2);//抛出ClassCastException异常
20     }
21
22 }

也就是说,如果使用这样的数组,在转型是发生问题是很难发现的。这也是数组的一个局限性。

那么既然数组存在这样的缺陷,我们就要想办法解决这个问题。该如何解决呢?数组长度当然是无法发生变化的,但是数组名里面存储的是数组在内存中的首地址这个确是可以改变的。那么是否可以通过地址的改变来动态改变数组的大小呢?答案是肯定的。我们可以声明一个新的数组,把它的大小增加到我们想要的程度,然后把原数组的值copy到新数组中,再把新数组赋值给原数组,这样操作就可以使得数组的大小发生动态改变了。这时增加一个数据就让新数组长度加一,减少一个数据,就让新数组长度减一就可以了。数组长度的问题就解决了。那么数据类型应该如何解决呢?这就要使用Java的泛型搞定了。泛型Java中并不是一种数据类型,而是一个用于表示类型的符号,常用的泛型表示符号有E、K、Y等。这样我们在定义类的时候就可以指定泛型,然后在类中使用指定的类型返回和输入,这样就不会产生类型的问题了。下面要做的就是定义一个类,用于操作数组,也就是我们要讲的数组队列。

 1 package com.cbs;
 2
 3 /**
 4  * 自定义数组队列
 5  * @author CBS
 6  */
 7
 8 public class MyList<E> {//使用泛型E
 9     //声明一个Object数组
10     private Object[] array;
11     private int size=0;//记录队列中数据类型的长度
12     private int initCount=0;//初始化时数组的大小,默认为0
13     private int incresCount=1;//数组已满时,每次数组的增长长度
14     /**
15      * 构造方法
16      * @param initCount 为数组的初始长度
17      */
18     public MyList(int initCount){
19         this.initCount=initCount;
20         array=new Object[initCount];
21     }
22     /**
23      * 构造方法
24      * @param initCount 为数组的初始长度
25      * @param incresCount 为数组满是每次的增长长度
26      */
27     public MyList(int initCount, int incresCount) {
28         this.initCount = initCount;
29         this.incresCount = incresCount;
30         array=new Object[initCount];
31     }
32
33     //实现数据的添加
34     public void add(E e){
35         if(size<initCount){
36             array[size]=e;
37         }
38         else{
39             Object[] newArray=new Object[array.length+incresCount];
40             newArray[size]=e;
41             for(int i=0;i<array.length;i++){
42                 newArray[i]=array[i];
43             }
44             initCount+=incresCount;
45             array=newArray;
46         }
47         size++;
48     }
49     //实现删除指定下标位置的数据
50     public void delete(int i){
51         size--;
52         initCount--;
53         Object[] newArray=new Object[array.length-1];
54         for(int j=0;j<i;j++)
55             newArray[j]=array[j];
56         for(int j=i+1;j<array.length;j++)
57             newArray[j-1]=array[j];
58         array=newArray;
59     }
60     //实现插入指定下标位置的数据
61     public void insert(E e,int i){
62         if(size<initCount && i>=0 && i<size-1){
63             for(int j=size;j>i;j--)
64                 array[j]=array[j-1];
65             array[i]=e;
66         }
67         else{
68             Object[] newArray=new Object[array.length+incresCount];
69             for(int j=0;j<array.length;j++){
70                 newArray[j]=array[j];
71             }
72             initCount+=incresCount;
73             array=newArray;
74             for(int j=size;j>i;j--)
75                 array[j]=array[j-1];
76             array[i]=e;
77         }
78         size++;
79     }
80     //实现获取指定下标位置的数据
81     public E get(int i){
82         if(i<0 || i>=size)
83             return null;
84         else
85             return (E) array[i];
86     }
87     //实现更新指定下标位置的数据
88     public void upDate(E e,int i){
89         if(i>=0 && i<size)
90             array[i]=e;
91     }
92     //获取数组队列中存储的元素个数
93     public int legnth(){
94         return size;
95     }
96
97 }

这样一个自定义的数组对列就完成了。当然这里对自定义的数组对列做了一定的优化,可以由用户指定初始的队列长度和每次队满时增长的长度。相比于上面所说的每次长度加一,这样做就不用每次都新建一个新的数组了。这样以后只要在类中实例化MyList的对象就可以很方便的操作数组队列啦。

时间: 2024-10-11 05:32:08

Java中的自定义数组队列的相关文章

Java中集合与数组的切换

在Java开发中常常遇见集合与数组的互相切换,如何实现呢,呵呵呵,很简单: import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class Test { /** * 将Set集合转换为数组 * * @author GaoHuanjie */ private static void setT

java中的函数,数组

函数 程序中独立的过程 函数的语法: 函数的定义 声明 static 返回值类型 函数名 (参数表) 形式参数:形参 在函数内部有效的局部变量 实现 { 语句 } 函数的调用 函数名(参数); 实际参数:实参 为形参赋值 接收返回值 函数的作用: 1. 减少冗余代码,提高程序的可维护性 2. 可重用性 函数库 3. 加强代码的结构化 提高可读性 利于分工 非结构化编程(语句) ---> 结构化编程(函数) ---> 面向对象(类) 数组 一次性定义多个同类型的变量 数组空间在内存是连续的 定义

在Java中怎样把数组转换为ArrayList?

翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在Stack Overflow上做很多事情的权限.这跟我没什么关系,我们还是先看看这个问题吧. 这个问题是"在Java中怎样把数组转换为ArrayList?" Element[] array = {new Element(1),new Element(2),new Element(3)}; 1

java中的对象数组

对象数组,很容易顾名思义理解为:数组中的元素都是一个个的对象.但这种理解是错误的,数组中存放的并不是对象本身,而是对象的引用,即指向对象的那个指针,而这个指针是存放在虚拟机内存的栈中. 对象数组的创建需要两个步骤:1)创建一个数组,存放对象的引用.2)具体指出每个引用指向哪个对象(用new实现).下面举例说明. 假设有一个类,类名为Test.1)Test[] array = new Test[2]; 创建一个数组取名为array,里面共有2个元素,每个元素的类型是Test对象的引用.此时arra

JAVA中list,set,数组之间的转换详解

JAVA的list,set,数组之间的转换,主要是使用Apache Jakarta Commons Collections,具体的方法如下:import org.apache.commons.collections.CollectionUtils; String[] strArray = {"aaa", "bbb", "ccc"};    List strList = new ArrayList();    Set strSet = new Ha

Java中List转换为数组,数组转List

今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本.如下:ArrayList<String> list=new ArrayList<String>();String strings[]=(String [])list.toArray(); 这样写代码个人觉得应该没什么问题,编译也没有问题.可是具体运行的时候报异常,如下:Exception in thread "main" java.lang.ClassCastException: [Ljava.l

JAVA中集合转数组遍历

JAVA中集合的遍历的一种方法时集合转数组遍历,也是就调用Collection中的toArray(). 代码: public static void main(String[] args) {        // TODO Auto-generated method stub        Collection c=new ArrayList();        c.add(new Student("kj",12));        c.add(new Student("uj

关于Java中多维数组的内存结构分析

基本概念 本文主要针对JVM中关于一维数组和二维数组的内存模型分析.验证.讨论![仅供参考]. 1.概念模型 1)一维数组 int arr[] = new int[3]; 2)二维数组 int[ ][ ] arr = new int[3][ ]; arr[0] = new int[3]; arr[1] = new int[5]; arr[2] = new int[4]; 3)Java中的对象(本章节主要分析和数组相关的内容,关于Java对象的Memory结构会在以后说明!) class A {

Java中方法与数组

1:方法(掌握) (1)方法:就是完成特定功能的代码块. 注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法. (2)格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) { 方法体语句; return 返回值; } 修饰符:目前就用 public static.后面再详细讲解其他修饰符 返回值类型:就是功能结果的数据类型 方法名:就是起了一个名字,方便我们调用该方法. 参数类型:就是参数的数据类型 参数名:就是变量 参数分类: 实参:实际参与运算的数