数据结构之数组
数组(Array)
- 概念
同一种类型数据的集合。其实数组就是一个容器。数组的本质就是堆内存中的一块连续的存储空间。
- 定义
动态初始化命名:数据类型 [ ] 数组名 = new 数据类型 [数组的长度]
int[] array = new int[5];
静态初始化命名:数据类型 [ ] 数组名 = new 数据类型 [ ] {x,y,z,a,b,c...}(可省略写为:数据类型 [ ] 数组名 = {x,y,z,a,b,c...})
int [] array = new int[]{1,2,3,4,5};
//或
int [] array = {1,2,3,4,5};
定义了一组数组之后,系统为每个元素指定一个索引值,索引值是从0开始的。
数组名其实就是一个变量名,保存数组的引用(数组的起始地址),new 运算符会在堆内存中分配一块连续的空间,把这块连续的空间的引用保存到数组名中
- 数组的扩容
理论上来说,数组定义后就无法扩容了;但我们可以换个思路:定义一个更大的数组,把原来数组的内容复制到新的数组中,让数组名指向新的数组
使用System.arrayCopy(src,srcPos,dest,destPos,length)方法:
int [] array = new int[]{1,2,3};
int [] newArray = new int[6];
System.arraycopy(array, 0, newArray, 0, array.length);
System.out.println(Arrays.toString(newArray));
//结果:[1, 2, 3, 0, 0, 0]
解释一下各参数的含义:把src数组从srcPos开始的length个元素复制到dest数组的destPos位置
还可以使用:Arrays.copyOf(原来的数组,新数组的长度)方法,为了证实数组引用指向的地址改变了,我打印了出来:
int [] array = new int[]{1,2,3};
System.out.println("扩容前的地址:"+ array.toString());
//扩容前的地址:[I@15db9742
array = Arrays.copyOf(array, 2*array.length);
//扩容后的地址:[I@6d06d69c
System.out.println("扩容后的地址:"+ array.toString());
System.out.println(Arrays.toString(array));
//结果:[1, 2, 3, 0, 0, 0]
这也证实了,数组在定义后,是无法扩容的;想要进行扩容,就必须创建新的数组对象
- 数组的遍历
for循环遍历
int [] array = new int[]{1,2,3};
for(int i = 0;i < array.length;i++){
System.out.println(array[i]);
}
foreach循环:
int [] array = new int[]{1,2,3};
for (int i : array) {
System.out.println(i);
}
- 数组的优缺点
优点:按照索引查询元素速度快 ;按照索引遍历数组方便;数组的大小固定后便无法扩容
缺点:数组只能存储一种类型的数据 ,添加,删除的操作慢,因为要移动其他的元素。
适用场景:频繁查询,对存储空间要求不大,很少增加和删除的情况