不要小瞧数组(用静态数组实现我们自己的动态数组)

Posted zhixiangshu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不要小瞧数组(用静态数组实现我们自己的动态数组)相关的知识,希望对你有一定的参考价值。

(希望我所描述的一切,给你带来收获!)

我们将要使用的是JAVA中的静态数组——E[] data = new E[]();去实现一个属于我们自己的动态数组

 

第一步:(关于泛型不作过多解释)

1 public class Array<E> {
2     private E[] data;
3     private int size;
4 }

data是我们需要的数组,size是我们需要维护的动态数组的长度;size可以认为是数组的索引号,size总是指向数据的末端——当整个数组为空时size指向的是 data[0] 的位置,当数组只有 data[0] 一个元素时,size指向的数据末端是 data[1];也就是说,size总是指向用户数据(用户添加的数据)的后一个位置。

 

第二步:

1 /**
2      *
3      * @param capacity
4      */
5     public Array(int capacity) {
6         data = (E[]) new Object[capacity];
7     }

我们申请一个容量为capacity的数组,注意!java中不能直接对泛型进行new的操作,但Object是所有类的父类,通过new一个Object再进行类型强转是行得通的!但是,有时我们并不确定我们所需要多少大小的capacity,为了方便,我们还需要一个无参构造函数,初始化一个默认的capacity数组(默认的capacity我给的是10)

1 /**
2      * the default capacity is 10
3      */
4     public Array() {
5         this(10);
6     }

第三步:实现一些简单的操作,例如:获取当前数组的长度、判断数组是否为空......

 1 /**
 2      *@return the current data length of the array
 3      */
 4     public int getSize() {
 5         return size;
 6     }
 7 
 8     /**
 9      * Determines whether the array is empty
10      * @return  false or true
11      */
12     public boolean isEmpty() {
13         return size == 0;
14     }
15 
16     /**
17      * get the Array capacity
18      * @return  Array capacity
19      */
20     public int capacity() {
21         return data.length;
22     }

 我们一定要明确的一点是:用户只能看到size长度的data(这是外界给予可能是有价值意义的数据),而data.length则只是能承载多少用户数据的边界(限度)

 

 第四步:为我们的Array<E>实现增加元素的操作add(int index,E e)方法

 1 /**
 2      * Insert an element on an index
 3      * @param index
 4      * @param e
 5      */
 6     public void add(int index,E e) {
 7         if (index < 0 || index > size)
 8             throw new IllegalArgumentException("Add failed.Array is full");
 9         for (int i = size - 1; i >= index; i--) {
10             data[i+1] = data[i];
11         }
12         data[index] = e;
13         size++;
14     }

 需要注意的是,用户指定位置插入元素,index值一定要具有合法性——即index属于[0,size] 

 循环体中,data[i+1] = data[i]的语义是明显的——前一个元素向后一个元素移动。最初的移动在Array的尾部,即是 size - 1 的位置

 

第五步:移除Array中首个e元素(待更........)

以上是关于不要小瞧数组(用静态数组实现我们自己的动态数组)的主要内容,如果未能解决你的问题,请参考以下文章

第2章 不要小瞧数组

玩转数据结构 从入门到进阶

玩转数据结构 从入门到进阶

Java实现动态数组(数据结构与算法)

01 不可小瞧数组

java的静态数组和动态数组有啥区别?