一文带你了解动态数组方法实现
数组(Array)
线性表

数组的特点
数组是一种顺序存储的线性表,数组内所有元素的内存地址都是连续的,
数组的长度一旦确定则不可更改
数组只能存储同一类型的数据
数组提供角标的方式访问元素

数组的缺点
数组一般都是都无法动态修改容量,只有在初始化数组的时候固定好数组长度。
实际应用中,数据的容量都是动态改变的。
动态数组(Dynamic Array)
概念
动态数组是指在声明时没有确定数组大小的数组,可以根据用户需求可以自动增加或者减少数组空间,有效的利用空间。
接口设计
创建
ArrayList
类,创建size
属性来管理数组中元素的个数, 创建elements
属性来管理存取的数据。可以对动态数组进行
增删改查
操作。

动态数组实现
构造方法
如果构造的数组长度小于默认长度,则会以默认长度构建数组。
查看数组元素数量
size 的值,即为元素的数量。
数组是否为空
size 为空,则表示数组为空
数组是否包含某个元素
通过判断索引(indexOf)是否等于
ELEMENT_ON_FOUND
即可。
根据索引获取对应位置的元素
通过数组下标进行查询
根据索引和元素替换对应的老元素
先获取原来的元素,然后把新增的元素替换到原来的元素位置,并且返回原来 index 位置的元素
添加元素
添加元素就是将指定位置之后的元素统一后移一位,并将指定元素插入到指定位置
数组越界
添加元素的时候索引的大小有限制,不能小于 0, 也不能大于 size。
数组动态扩容(核心所在)
由于数组长度是默认长度为 10,那么当数组存满元素,就需要对该数组进行扩容操作。
因为数组是无法动态增加的,就需要创建一个新的数组,并且数组容量一般都是原数组容量的 1.5 呗,然后将原数组的元素循环放入新数组中,这就是动态扩容。

数组添加实现
数组添加之前需要先验证索引是否越界
然后判断当前数组是否需要扩容操作
删除元素
删除数组元素就是删除指定位置的元素,并将指定位置之后的元素统一前移一位
数组越界
移除元素的时候索引的大小有限制,不能小于 0, 也不能大于等于 size。
动态缩容
当数组中的元素删除后,可能会导致数组的剩余空间很大,会造成
内存的浪费
当删除数组中的元素,需要先判断是否打到缩容的条件,如果达不到,就不进行缩容处理
动态缩容实现方法类似于扩容,当数组中容量小于某个值时,创建新的数组,然后将原有数组中的元素
存入新数组
即可。

数组的删除实现
数组删除之前需要先验证索引是否越界
然后判断当前数组是否需要缩容操作
查询元素的对应位置
通过循环查找元素的对应位置
注意:假如数组中可以存储
null
,而null
是不能调用equals
方法的,所以需要对传入的元素进行判断,如果查找的元素是null
,需要单独处理。当元素存在时返回索引,否则返回变量
ELEMENT_ON_FOUND
的值。
版权声明: 本文为 InfoQ 作者【xiaoyu】的原创文章。
原文链接:【http://xie.infoq.cn/article/744705d5a1c21bba045009528】。文章转载请联系作者。
评论