数组的所有接口这里我们就全部实现了,都是些基本的,常用到的接口,像新增、删除、修改。但是我们的数组还是静态的,数组的大小不可以跟着数组的元素进行变化,在平常的开发中我们也不知道数组的元素到底有多少个,容量开的太大会浪费空间,开的太小空间不够用,让数组容量可以伸缩就可以解决这样办法了。让数组动起来,可以跟着元素变化,我们称这样的数组叫动态数组。
怎样让数组变成动态的呢,如果可以的话,应该怎么做呢?以生活举例,现在有一个水杯,已经装满了水,现在还要继续装水,还可以装吗? 不可以了,只能换一个大点的杯子来盛放。那么原来的数组就不可以用了,只能新建一个大点数组,以满足新的存储要求。
图一这里我们创建一个新的数组,新的数组存储大小是原0来的两倍,为什么是两倍而不是3倍10倍呢,其实也是可以的,只不过这里我们举例是2倍,3倍10倍或许太大了。
图二然后循环data数组,把原来数组中的每个元素赋值给新的数组newData,这里有一个循环时间开销的问题,后面说这里的性能优化
图三移动之后,size和 capacity就不是指向data,而是指向新的数组,成员变量data也指向newData。那这里的size和capacity需要我们维护嘛,不需要,capacity是通过data.length动态获取的,size有add和remove两个方法共同维护,这里我们可以不用管size和capacity
图四成员变量data也指向新的数组newData,而原来的数组会被java垃圾回收器回收,而这个新数组的生命周期和Array对象是一样的。
下面我们将重构add()、remove()两个方法,新建一个resize方法
add方法 remove方法 resize方法构建动态数据就全部完成了,减少数组的容量这没有细致的分析,但是和扩大数组的容量是一样的原理,这里就不在一一说明了。
其实每次写相当的代码或者说实现相同的功能,当下的心境是完全不一样的,一开始我写的时候回参照老师的来写,写的很对,但是总不是自己的,自己事后再写一遍,发现根本不会。根本没有弄明白老师为什么会这么写,感觉很简单的,其实真的不是这样,以为自己理解了,其实还早的很。
这也是我为什么一定要写成文章,这样我才觉得我用了心,是属于自己的作品,有了不一样的感受,还可以回过头来看当时发生的事情,想想就挺美妙的
下一个章节会了解时间复杂度,讨论一下数组的各个操作各自的时间复杂度是怎样的,还可不可以继续优化,下个小节再见..............
网友评论