一、数组
数组是指有限个相同类型的变量所组成的有序集合,数组中的每个变量称之为元素,数组中的元素访问是利用下标进行访问的,数组是最简单也是最常用的数组结构。 数组中的每一个元素都是存储在内存单元中,它们紧密排列,既不能打乱它们的排列顺序,也不能跳过某一个存储单元进行存储。(1)数组的操作
1.读取元素
数组是通过下标来读取元素的,数组的下标是从0开始的,第一个元素就是array[0]; 举个例子:int[] array = new int[] {1,2,3,4,5,6,7,8};
System.out.println(array[0]); //输出数组的第一个元素
System.out.println(array[1]); //输出数组的第二个元素
2.更新元素
数组更新元素的方式很简单,知道需要更新元素的下标,赋值即可。
举个例子:
int[] array = new int[] {1,2,3,4,5,6,7,8};
array[0] = 10; //更新元素
System.out.println(array[0]);
从这里我们可以看出,数组读取元素和更新元素是非常便捷的,时间复杂度为O(1);
3.插入元素
数组插入元素,分为三种情况。
- 从数组尾部插入;
- 从数组中间插入;
- 超出数组范围插入;
1.尾部插入
尾部插入应该是数组中最简单的插入了,直接把要插入的元素直接放在数组尾部空闲的位置就可以像是上面更新数组元素的操作。
2.中间插入
中间插入要比尾部插入稍微复杂一些,从中间插入元素,要把插入的地方后的元素往后挪移。数组中间插入的代码如下:public class MyArray {
private int size;
private int[] array;
public MyArray(int capacity) {
this.array = new int[capacity];
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;
size++;
}
//输出数组
public void output() {
for (int i = 0; i < size; i++) {
System.out.println(array[i]);
}
}
public static void main(String[] args) throws Exception {
MyArray myArray = new MyArray(4);
myArray.insert(1, 0);
myArray.insert(2, 1);
myArray.insert(3, 2);
myArray.insert(4, 3);
myArray.insert(5, 1);
myArray.output();
System.out.println("-------------------------------");
}
3.超范围插入
超范围插入,指数组长度不够时还要插入元素,假设一个数组的长度为4,其中元素都满了,但是你要插入第五个元素,这时候就应该对数组进行扩容,代码如下:/*
* 数组扩容
*/
public void resize() {
int[] arrayNew = new int[array.length * 2];
System.arraycopy(array, 0, arrayNew, 0, array.length);
array = arrayNew;
}
2.删除元素
删除元素同插入元素差不多,就是将其反过来,因为不涉及数组扩容,于是简单了许多;代码如下:
/**
* 删除元素
* @param index
*/
public int delete(int index) throws Exception {
// 判断访问下标是否超出范围
// 判断访问数组是否超出范围
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("超出实际数组的范围");
}
int deletedElement = array[index];
// 从右到左循环,将元素逐个向左挪一位
for (int i = index; i < size-1; i++) {
array[i] = array[i + 1];
}
size--;
return deletedElement;
}
在这里可以看出插入和删除操作比起来读取元素和更新元素要复杂许多,其中插入操作,数组扩容的时间复杂度是O(n),插入和移动元素的时间复杂度也是O(n),所以插入操作的时间复杂度是O(n)。删除操作,只涉及元素的移动,时间复杂度也是O(n)。