1、什么是数据
数组对应的英文是array,是有限个相同类型的变量所组成的有序集合, 数组中的每一个变量被称为元素。
数组是最为简单、最为常用的数据结构。
数组中的每一个元素都有着自己的下标,下标从0开始,到数组长度-1结束。
数组的另一个特点,是在内存中顺序存储 。
2、数组的基本操作
2.1、读取元素
对于数组来说,读取元素是最简单的操作。由于数组在内存中顺序存储,所以只要给出一个数组下标,就可以读取到对应的数组元素。
如下代码所示: (像这种根据下标读取元素的方式叫作 “随机读取” )
int[] array = new int[]{5,4,9,7,2};
// 输出数组中下标为2的元素
System.out.println(array[2]);
2.2、更新元素
要把数组中某一个元素的值替换为一个新值,也是非常简单的操作。直接利用数组下标,就可以把新值赋给该元素。如下代码所示:
int[] array = new int[]{5,4,9,7,2};
// 更新下标为3的元素
array[3] = 1;
// 输出数组中下标为3的元素
System.out.println(array[3]);
2.3、插入、删除元素
由于数组的每一个元素都有其固定下标,所以不得不首先把插入位置及后面的元素向后移动,腾出地方,再把要插 入的元素放到对应的数组位置上。
删除操作和插入操作的过程相反,删除位置之后的元素都需要向前挪动1位。
如下代码所示:
public class MyArray {
private int[] array;
private int size;
public MyArray(int length) {
array = new int[length];
size = 0;
}
/**
* 插入元素
*
* @param element 要插入的元素
* @param index 要插入的位置下标
*/
public void insert(int element, int index) throws Exception {
// 判断插入的下标是否超出实际元素的范围大小
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("超出数组实际元素范围");
}
// 当数组容量达到上限,需要对数组进行扩容
if (size >= array.length) {
reSize();
}
// 循环将插入位置及之后的元素后移一位
for (int i = size - 1; i >= index; i--) {
array[i + 1] = array[i];
}
// 新元素赋值给空出的插入位置
array[index] = element;
// 数组实际元素大小 +1
size++;
}
/**
* 删除元素
*
* @param index 下标
*/
public void delete(int index) {
// 判断插入的下标是否超出实际元素的范围大小
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("超出数组实际元素范围");
}
// 循环将删除位置的元素向前移一位
for (int i = index; i < size - 1; i++) {
array[i] = array[i + 1];
}
// 数组实际元素大小 -1
size--;
}
/**
* 数组扩容
*/
private void reSize() {
// 扩大一倍的容量
int[] newArray = new int[array.length * 2];
//从旧数组复制到新数组
System.arraycopy(array, 0, newArray, 0, array.length);
array = newArray;
}
}
3、数组的优势和劣势
数组拥有非常高效的随机访问能力,只要给出下标,就可以用常量时间找到对应元素。
至于数组的劣势,体现在插入和删除元素方面。由于数组元素连续紧密地存储在内存中,插入、删除元 素都会导致大量元素被迫移动,影响效率。
所以数组所适合的是读操作 多、写操作少的场景。