学习数据结构
一直以来在学习java web开发,里面很少涉及到数据结构相关的编程,再加上大一没有怎么好好学这门课程,这段时间开始慢慢捡回来,不说如何去精通它,但希望自己从数据结构开始训练自己的基础代码能力,如今用框架用的已经连代码都不会写了。。。
Array代码
1 | /** |
总结
在Java中,数组的容量一旦声明就无法改变,这里我们通过封装实现了动态数组,并且实现了动态数组的增删改查等简单的功能。其中最为重要的是数组怎样实现增加,删除和动态扩容。
增加
当数组某个位置需要增加元素的时候,我们先要将该索引处后面的元素从最后一个元素开始把各自向后移动一个位置。

删除
当数组某个位置需要删除元素的时候,我们先要将该索引处后面的元素从索引处后面的元素开始依次将各自向前移动一个位置。即为后面元素覆盖前面元素。
动态扩容
当数组进行增加的时候,如果数组容量不够时我们需要进行扩容。当数组中进行删除的时候,如果数组使用量已经远小于数组容量的时候我们需要进行压缩,来减少无用的空间。
我们上文代码实现扩容的方式是在数组增加和删除的时候重新构建一个数组并且将原来的数组赋值到新的数组中去。为了避免一直重复的重构容量大小,我们将扩充的容量变为原来容量的两倍(如果每次容量只是加1或者很少那么每次add之后都要执行重构容量,但是重构容量需要重新遍历数组,时间复杂度为O(n),极大地浪费时间,所以我们这里通过牺牲空间来节省时间)。当每次删除元素的时候,我们将判断数组使用量是否等于容量的四分之一,当为true的时候我们我们将容量变为原来一半以节省空间(这里为什么是四分之一和一半呢?其实具体数值并不是固定的,但是我们这里实现的是懒压缩,如果这里的判断条件为一半,当使用量为容量一半的时候我们就之间将容量变为原来一半,那么之后再次进行add方法时我们又需要扩容,从而引起复杂震荡,这是得不偿失的)。
上文Array代码基本是模仿JDK的ArrayList来实现的,在ArrayList中也是通过上述方法来实现的。
如实现动态扩容:
1 | /** |