数组的特效
- 数组是数据结构中最常见的一种线性表。线性表结构还包含:链表、队列、栈等。
- 数组的存储需要一块连续的内存空间。根据第一个数组元素的位置、已知的每个数据占内存大小(偏移量),可以
计算出任意元素所在内存地址。
arr[i]_addr = arr[0]_addr + i * per_size
- 数组查找元素的时间复杂度为O(n),而根据下标访问元素的时间复杂度为O(1)。
- 因为需要一块连续的地址存储数组,所以在数组的插入和删除最坏情况情况,需要移动整个数组的内存地址。所以数组不适于频繁删除和插入的场景中。
ArrayList
Java提供了一个很常用的数组容器:ArrayList。
- ArrayList 无法存储基本数据类型,在存储时会进行装箱(Autoboxing)、读取时进行拆箱(Unboxing)。考虑性能最好使用数组:
int arr[] = new int[]{1, 2}; int[] arr1 = new int[10]; int arr2[] = {1, 2};
代码
public class Array {
private int data[];
private int capacity;
private int count;
public Array(int capacity) {
data = new int[capacity];
this.capacity = capacity;
count = 0;
}
public int find(int index) {
if (index < 0 || index >= count) {
return -1;
}
return data[index];
}
public boolean add(int index, int value) {
if (index < 0 || index >= count ) {
return false;
}
// 不支持动态扩容
if (count == capacity) {
return false;
}
// 将数组往后移动
for (int i = count; i > index; i--) {
data[i+1] = data[i];
}
data[index] = value;
++count;
return true;
}
public boolean delete(int index) {
if (index < 0 || index >= count) {
return false;
}
for (int i = index + 1; i >= count ; i++) {
data[i-1] = data[i];
}
--count;
return true;
}
}