数组
- 1.1 数组的定义
- 1.2 数组的创建
- 1.3 数组在内存中的情况
- 2.1 初始化数组
- 2.2 插入元素
- 2.3 删除元素
- 2.4 读取元素
- 2.5 遍历数组
1.1 数组的定义
数组中的是在内存中是连续存储的,内存是由一个个内存单元组成的,每一个内存单元都有自己的地址,数组中的每一个元素可以存储在这一个个内存单元中,使用索引来访问数组中的元素。
1.2 数组的创建
int[] arr = {1,2,3,4};
从上一个小节,不难得出,数组中访问元素时的时间复杂度为 O ( 1 ) O(1) O(1)
1.3 数组在内存中的情况
可以理解成图中所示,黄线表示空闲的存储单元,蓝线表示这个存储单元已经被其他元素所占用,1,2,3,4就是所创建的数组,可以看到是连续的。
2.1 初始化数组
// 当前数组的元素个数private int size = 0;// 容量private int capacity = 5;// 数组private int[] array = {};/*** 数组扩容与初始化数组*/private void checkAndGrow() {if (size == 0){ // 如果元素个数为0,就初始化数组array = new int[capacity];}else if (size == capacity) { // 数组已满,就扩容数组capacity += capacity >> 1;int[] newArray = new int[capacity];System.arraycopy(array, 0, newArray, 0, size);array = newArray;}}
时间复杂度为: O ( n ) O(n) O(n)
2.2 插入元素
/*** 向[0..size]位置添加元素** @param index* @param element*/public void add(int index, int element) {// 检查是否扩容checkAndGrow();if (index >= 0 && index < size) {// 当插入新元素时,其他数组中的元素往右移System.arraycopy(array, index, array, index + 1, size - index);}// 当等于size时插入尾节点array[index] = element;size++;}/*** 向最后位置[size]添加元素** @param element*/public void addLast(int element) {add(size, element);}
时间复杂度为: O ( n ) O(n) O(n)
2.3 删除元素
/*** 删除数组中的元素** @param index* @return*/public int remove(int index) {int removed = array[index];// 当为数组中的最后一个元素,就不需要移动if (index < size - 1) {System.arraycopy(array, index + 1, array, index, size - index - 1);}size--;return removed;}
时间复杂度为: O ( n ) O(n) O(n)
2.4 读取元素
/*** 根据索引返回元素*/public int get(int index) {return array[index];}
时间复杂度: O ( 1 ) O(1) O(1)
2.5 遍历数组
/*** 基于函数式接口,可以按照要求来指定所要实现的功能** @param consumer*/public void myForEach(Consumer<Integer> consumer) {for (int i = 0; i < size; i++) {consumer.accept(array[i]);}}/*** 迭代器遍历** @return*/@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {int i = 0;// 查看还是否有下个元素@Overridepublic boolean hasNext() {return i < size;}// 返回当前所指向的元素,并且指针往后移动@Overridepublic Integer next() {return array[i++];}};}
时间复杂度: O ( n ) O(n) O(n)