概念

数组是一种线性数据结构,用于存储相同类型的元素,在内存中是连续分配

特点

  1. 固定长度:声明时需要确定大小(静态数组),或者动态数组可以扩展长度(for example:Go’s slice,Java’s ArrayList)

  2. 随机访问:通过下标在O(1)的时间内访问任意元素

  3. 连续存储:方便计算元素的地址,但插入和删除中间元素可能需要移动大量数据

数组操作

创建数组

1
2
3
4
5
6
7
//定长数组
var arr [5]int
arr[0]=1
arr[2]=2

//动态数组 slice
s:=[]int{1,2,3}
1
2
3
4
5
6
7
//定长数组
int[] arr=new int[5];
arr[0]=1;
arr[1]=2;

//初始化数组
int[] arr2={1,2,3}

访问数组

按下标访问,注意下标从0开始

1
2
fmt.Println(arr[0])
fmt.Println(s[len(s)-1])
1
2
System.out.Println(arr[0]);
System.out.Println(arr[arr.length-1]);

遍历数组

1
2
3
4
5
6
7
for i:=0;i<len(s);i++{
fmt.Println(s[i])
}

for i,v:=range s{
fmt.Println(i,v)
}
1
2
3
4
5
6
7
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}

for(int v:arr){
System.out.println(v);
}

插入和删除

数组固定长度时中间插入/删除效率低,需要移动元素

1
2
3
4
5
s:=[]int{1,2,3,4}
index:=2
val:=99
s=append(s[:index],append([]int{val},s[index:]...)...)
fmt.Println(s)// [1 2 99 3 4]
1
2
3
ArrayList<Integer> list=new ArrayList<>(Arrays.asList(1,2,3,4));
list.add(2,99);
System.out.Println(list);