这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战
数组(Array)
线性表
数组的特点
- 数组是一种顺序存储的线性表,数组内所有元素的内存地址都是连续的,
- 数组的长度一旦确定则不可更改
- 数组只能存储同一类型的数据
- 数组提供角标的方式访问元素
1 | java复制代码int[] array=new int[]{11,22,33,44,55} |
1 | c复制代码- array存放在栈空间中 |
- 数组的缺点
+ 数组一般都是都无法动态修改容量,只有在初始化数组的时候固定好数组长度。
+ 实际应用中,数据的容量都是动态改变的。
动态数组(Dynamic Array)
概念
动态数组是指在声明时没有确定数组大小的数组,可以根据用户需求可以自动增加或者减少数组空间,有效的利用空间。
接口设计
- 创建
ArrayList
类,创建size
属性来管理数组中元素的个数, 创建elements
属性来管理存取的数据。 - 可以对动态数组进行
增删改查
操作。
1 | java复制代码package array; |
动态数组实现
构造方法
- 如果构造的数组长度小于默认长度,则会以默认长度构建数组。
1 | java复制代码public class ArrayList<E> { |
查看数组元素数量
- size的值,即为元素的数量。
1 | java复制代码public int size() { |
数组是否为空
- size为空,则表示数组为空
1 | java复制代码public boolean isEmpty() { |
数组是否包含某个元素
- 通过判断索引(indexOf)是否等于
ELEMENT_ON_FOUND
即可。
1 | java复制代码public boolean contains(E element) { |
根据索引获取对应位置的元素
- 通过数组下标进行查询
1 | java复制代码public E get(int index) { |
根据索引和元素替换对应的老元素
- 先获取原来的元素,然后把新增的元素替换到原来的元素位置,并且返回原来index位置的元素
1 | Java复制代码public E set(int index, E element) { |
添加元素
- 添加元素就是将指定位置之后的元素统一后移一位,并将指定元素插入到指定位置
数组越界
- 添加元素的时候索引的大小有限制,不能小于0, 也不能大于size。
1 | java复制代码private void rangeCheckForAdd(int index) { |
数组动态扩容(核心所在)
- 由于数组长度是默认长度为10,那么当数组存满元素,就需要对该数组进行扩容操作。
- 因为数组是无法动态增加的,就需要创建一个新的数组,并且数组容量一般都是原数组容量的1.5呗,然后将原数组的元素循环放入新数组中,这就是动态扩容。
1 | java复制代码private void ensureCapacity(int capacity) { |
数组添加实现
- 数组添加之前需要先验证索引是否越界
- 然后判断当前数组是否需要扩容操作
1 | java复制代码public void add(int index, E element) { |
删除元素
- 删除数组元素就是删除指定位置的元素,并将指定位置之后的元素统一前移一位
数组越界
- 移除元素的时候索引的大小有限制,不能小于0, 也不能大于等于size。
1 | java复制代码private void outOfBounds(int index) { |
动态缩容
- 当数组中的元素删除后,可能会导致数组的剩余空间很大,会造成
内存的浪费
- 当删除数组中的元素,需要先判断是否打到缩容的条件,如果达不到,就不进行缩容处理
- 动态缩容实现方法类似于扩容,当数组中容量小于某个值时,创建新的数组,然后将原有数组中的元素
存入新数组
即可。
1 | java复制代码private void trimToSize() { |
数组的删除实现
- 数组删除之前需要先验证索引是否越界
- 然后判断当前数组是否需要缩容操作
1 | java复制代码public E remove(int index) { |
查询元素的对应位置
- 通过循环查找元素的对应位置
- 注意:假如数组中可以存储
null
,而null
是不能调用equals
方法的,所以需要对传入的元素进行判断,如果查找的元素是null
,需要单独处理。 - 当元素存在时返回索引,否则返回变量
ELEMENT_ON_FOUND
的值。
1 | java复制代码public int indexOf(E element) { |
本文转载自: 掘金