定义
1. 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。
2. 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。
3. 知道了数组的数据其实地址BaseAddress,就可以由公式BaseAddress+ i * size 计算出索引i元素的地址。
* i 即索引,在java,C等语言都是从0开始。
* size 是每个元素占用字节,例如int 占4,double 占8.
性能
空间占用
java中数据结构为:
* 8字节markword
* 4字节class指针(压缩class指针的情况)
* 4 字节数组大小(决定了数组最大容量 2 ^ 32)
* 数组元素 + 对齐字节(java中所有对象都是8字节1的整数倍 ^12 , 不足的要用对齐字节补足)
动态数组
package com.ma.test;import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;/*** @author Mtz* @version 1.0* @2023/12/2119:51* @function* @comment*/
public class DynamicArray implements Iterable<Integer> {private int size = 0; // 逻辑大小private int capacity = 8; // 容量private int[] array = new int[capacity];public void addLast(int element) {add(size, element);}public void add(int index, int element) {checkAndGrow();if (index >= 0 && index < size) {// 向后挪动,空出待插入位置System.arraycopy(array, index, array, index + 1, size - index);}array[index] = element;size++;}private void checkAndGrow() {if (size == 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;}}public int get(int index) {return array[index];}public void foreach(Consumer<Integer> consumer) {{for (int i = 0; i < size; i++) {consumer.accept(array[i]);}}}@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {int i = 0;@Overridepublic boolean hasNext() {return i < size; // 有没有下一个元素}@Overridepublic Integer next() { // 并移动到下一个元素return array[i++];}};}public IntStream stream() {return IntStream.of(Arrays.copyOfRange(array, 0, size));}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;}
}
测试
package com.ma.test;/*** @author Mtz* @version 1.0* @2023/12/229:05* @function* @comment*/
public class Test {public static void main(String[] args) {DynamicArray dynamicArray = new DynamicArray();dynamicArray.addLast(1);dynamicArray.addLast(2);dynamicArray.addLast(3);dynamicArray.addLast(4);dynamicArray.foreach((element)->{System.out.println(element);});for (Integer element : dynamicArray){System.out.println(element);}dynamicArray.stream().forEach(element->{System.out.println(element);});}
}