Java中的自定义数组队列
Posted 迷失的小菜包
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
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的对象就可以很方便的操作数组队列啦。
以上是关于Java中的自定义数组队列的主要内容,如果未能解决你的问题,请参考以下文章
ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项