一. 概念[理解]
数组:计算机内存中一块连续的存储空间,存储多个相同类型的数据
二. 数组的基本语法[应用重点]
1. 数组的定义
① 声明数组: 指定数据类型,同时给出数组名.
数据类型[] 数组名;
② 分配空间: 指定数组的长度.
数组名 = new 数据类型[长度];
③ 使用数组中数据
2. 数组中下标的 范围: 0 ~ 数组的长度-1 (size-1)
3. 数组中存储的数据称为数组元素.
4. 对数组中元素的存储或是获取称为数组的访问.
5. 对数组中元素的访问,通过数组名和下标: 数组名[下标];
6. 访问数组时,如果超出数组的下标范围,编译通过,运行报错,错误信息:
java.lang.ArrayIndexOutOfBoundsException(下标越界异常)
7. 数组的遍历:将数组中的元素一一访问的过程.
8. 获取数组的长度: 数组名.length
for(int i=0;i<数组名.length;i++){ //---->i用于控制数组的下标
//对数组的操作
System.out.println(数组名[i]);
}
9. 数组具有默认值,如下:
整数类型 0
小数类型 0.0
字符类型 空字符(\u0000)
布尔类型 false
引用类型 null
10. 其它的定义方式;
① 声明的同时并分配空间:
数据类型[] 数组名 = new 数据类型[长度];
② 声明的同时并且初始化:(显示初始化)
数据类型[] 数组名 =new 数据类型[]{值1,值2,值3};
注意:{}中数值的个数,决定当前数组的长度;
[]中不能再指定数组的长度
③ 声明的同时并且初始化:(显示初始化)
数据类型[] 数组名 ={值1,值2,值3};
注意:声明和初始化必须一起进行.
错误的写法:
int[] a;
a={1,4,6,3};//ERROR
数组的内存存储:
1. 数组在内存的空间是连续的.
2. 数组类型的变量存储的是数组的首地址.
3. 数组每一个内存空间的地址:
首地址 + 下标*数据类型的字节数
4. 数组的下标从 0 开始,目的是为了提高寻址效率.
5. 数组类型变量之间相互赋值,传递的是数组的首地址.
特点:寻址效率高,查询快
数组的扩容:
1.新建一个数组,长度大于原数组
循环将原数组中所有元素逐一赋值给新数组。
2.新建一个数组,长度大于新数组
System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度);
3.java.util.Arrays.copyOf(原数组, 新长度);//返回带有原值的新数组。
数组的排序:
1.冒泡排序:相邻的两个元素进行比较,将值小的数放在前面(小--->大);
2.选择排序:固定一个下标(比如0,1)对应的元素跟后面的元素一一比较;
3.快速排序:java.util.Arrays.sort(数组名);
二维数组[了解]:
1. 定义语法:
① 声明:数据类型[][] 数组名;
② 分配空间: 数组名=new 数据类型[行数/高维][列数/低维];
2. 访问二维数组中元素: 数组名[行下标|高维下标][列下标|低维下标]
a[2][1]: 第2行第1列
3. 二维数组同一维数组一样,都具有默认值.
4. 二维数组的遍历:
//外层循环:控制行下标
for(int i=0;i<行数;i++){
//内层循环:控制列下标
for(int j=0;j<列数;j++){
System.out.print(a[i][j]);
}
System.out.println();//换行...
}
5. 二维数组的行数|高维数组的长度:数组名.length
二维数组的列数|低维数组的长度:数组名[i].length
6. 二维数组:以数组作为数组元素的数组,又称为矩阵
7. 其它定义方式:
① 数据类型[][] 数组名= new 数据类型[行数][列数];
② 显示初始化:
数据类型[][] 数组名 =new 数据类型[][]{{值1,值2},{值3,值4},{值5,值6}};
注意:[][]中不能指定行数和列数.
③ 显示初始化:
数据类型[][] 数组名 ={{值1,值2},{值3,值4},{值5,值6}};
注意:声明和初始化需要一起进行.
8. 定义二维数组时,可以只指定行数,但是不能只指定列数.
int[][] a=new int[3][];//正确
int[][] b=new int[][5];//错误
9. 不规则的二维数组:每一行的 列数不相同.
int[][] a=new int[3][];
a[0] =new int[2];
a[1] =new int[3];
a[2] =new int[1];
其它获取方式: int[][] a={{1,2},{6,8,4,3},{9,3,1}};