一、数组基础
1.1 定义
- 数组(Array)是一种线性表数据结构,它用一组连续的内存空间来存储一组具有相同类型的数据。
1.2 创建流程
- 当我们在 java 中当创建一个数组时,会在内存中划分出一块 连续的内存 ,当有数据进入的时候会将数据 按顺序 的存储在这块连续的内存中。当需要读取数组中的数据时,需要提供数组中的 索引 ,然后数组根据索引将内存中的数据取出来,返回给读取程序。
把数据码成一排进行存放:所有的数据结构都支持几个基本操作:读取、插入、删除
数组索引可以有语意,也可以没有语意,比如说 student[2],就代表是这个数组中的第三个学生。
因为数组在存储数据时是按顺序存储的,存储数据的内存也是连续的,所以数组最大的优点就是能够 快速查询 ,寻址读取数据比较容易,但是插入和删除就比较困难。
为什么数组最大的优点就是能够 快速查询 。因为当我们在读取数据时,只需要告诉数组获取数据的索引位置就可以了,数组就会把对应位置的数据,读取出来
插入 和 删除 比较困难是因为这些存储数据的内存是连续的,数组大小固定,插入和删除都需要移动元素
例如:一个数组中编号 0 > 1 > 2 > 3 > 4这五个内存地址中都存了数组的数据,但现在你需要往4中插入一个数据,那就代表着从4开始,后面的所有内存中的数据都要往后移一个位置。
二、编写我们自己的数组类
我们知道想要维护某一个数据,我们需要对这个数据有这最基本的增、删、改、查,这几个基本功能,所以我们自己手动编写的数组类,也是需要有用这几个最基本的功能,虽然不会像List、Map这些类,那么强大,但是对于我们普通的开发来说,基本是可以满足,下图所示就是我们一个基本的数组类,那么我们是如何对数组进行改造,来编写一个属于我们自己的数组类的呢,这里我们以 增加和删除做重点讲解 ,本文中的所有源码会在最后贴出来,请往下看。
从上图中我们可以得知,我们创建数组类的时候,需要三个元素 data、size、capacity,而我们所需要使用的数组,肯定是要能够支持 多种数据类型 ,而不是单一的数据结构,因此,我们可以在设计类的时候,是需要加上泛型支持,让我们的数据结构可以支持放置 “任何” 数据类型。
data:需要传递的数据
size:元素中的个数
capacity:数组的初始容量
注意:我们上面所说的放置 “任何” 数据类型,只能是类对象,不可以是基本数据类型,但是我们每个基本数据类型都有对应的包装类,所以我们的基本类型也是可以使用的,不过只是使用的是它的包装类
/** * @program: * @ClassName ArrayPlus * @description: * @author: lyy * @create: 2019-11-18 22:27 * @Version 1.0 **/ public class ArrayPlus<E> { private E[] data; private int size; //构造函数,传入数组的容量capacity 构造array public ArrayPlus(int capacity){ data = (E[])new Object[capacity]; size = 0; } //无参数的构造函数,传入数组的容量capacity=10 public ArrayPlus(){ this(10); } //获取元素中的个数 public int getSize(){ return size; } //获取数组的容量 public int getCapacity(){ return data.length; } //返回数组是否为空 public boolean isEmpty(){ return size == 0; } @Override public String toString(){ StringBuffer res = new StringBuffer(); res.append(String.format("Array:Size = %d,capacity = %d\n",size,data.length)); res.append("["); for (int i = 0; i < size; i++) { res.append(data[i]); if(i != size - 1) res.append(","); } res.append("]"); return res.toString(); } }
2.1 数组添加元素
在数组中是如何添加数据的呢,首先我们需要创建一个 拥有初始容量 的数组,当我们创建完成之后,size 是指向第一个元素的,也就是 index = 0的地方,当我们添加第一个数据后 也就是 data[0] = 12后,我们的元素中的个数 size,需要往后挪一位的,也就是 size++ 的操作,每当我们操作一位,就需要将上面的操作重复执行,直到最后一个元素添加到我们的数组中。
知道了怎么操作,但是我们要如果通过代码来完成呢?
首先我们要清楚在添加的时候, 在哪里?添加什么数据?,在哪里:我们要在数据的什么地方进行添加,也就是要添加到数组中的哪个下标—— index 的地方,知道了在下标,我们只需要将添加的数据,添加到数组中为 index 的地方即可,除此之外,我们只需要对添加时,做一些基本的判断就可以了,代码如下:
//在所有元素后添加一个新元素 public void addLast(E e){ add(size,e); } //想所有元素前添加一个新元素 public void addFirst(E e){ add(0,e); } //在第Index个位置插入一个新元素e public void add(int index,E e){ if(size == data.length) throw new IllegalArgumentException("Add failed . Array is full."); if(index < 0 || index > size) throw new IllegalArgumentException("Add failed . Require index < 0 || index > size."); for (int i = size - 1; i >= index ; i--) data[i+1] = data[i]; data[index] = e; size++; }
测试代码:
public class Main2 { public static void main(String[] args) { ArrayPlus<Integer> arr = new ArrayPlus<>(); for (int i = 12; i < 16; i++) arr.addLast(i); System.out.println(arr); } }
返回结果:
Array:Size = 4,capacity = 10 [12,13,14,15]