一、数组的特点、好处及使用步骤
1、数组的好处
特点:相当于用于保存一组元素的容器
好处:
1、提高代码的简洁性和扩展性,且同时开辟多个空间,提高了效率
2、分类存储,且空间是连续的,容易查找
2、数组的特点
1、数组存储的是相同类型的一组元素
double[] arr = {1.6,2.3,1,2,'a'};
2、数组的定义类型可以是任意类型,包含基本类型或引用类型
String[] arr = {"john","lucy"};
Person[] arr;
int[][] arr;
Person[][] arr;
3、数组本身也属于引用类型,内存的分配和基本类型不同
基本类型:值和变量名都存储在栈中
引用类型:值存储在堆中,变量名存储在栈中
值又称为对象,值中每个元素称为成员
变量名又称为数组名或对象名或引用名
3、数组的四要素
数据类型:任意类型[]
数组名
值(对象)
★下标 :从0开始
注意:访问某个具体的成员,需要通过:数组名[下标]的方式!
4、数组的使用步骤★
(1)数组的动态初始化
(1)声明
数据类型[] 数组名;或
数据类型 数组名[];
(2)开辟空间
数组名 = new 数据类型[长度];//长度必不可少
(3)手动赋值
数组名[下标] = 值;
(4)使用(打印、运算、判断等)
System.out.println(数组名[下标]);
(2)数组的静态初始化
(1)声明并初始化
数据类型[] 数组名 = new 数据类型[]{值,值,值};
或 数据类型[] 数组名 = {值,值,值};
int[] arr = {3,4,5,6,100};
int[] arr2 = new int[] {3,4,5,6,100};
(2)使用
for(int i=0;i<数组名.length;i++){
//每一个元素表示为:数组名[i]
}
(3)注意事项
①数组的元素如果不赋值,也有默认值
int 0
double 0.0
char \u0000
boolean false
引用类型 null
②访问数组的元素时,下标必须在0—长度-1 的范围内,否则报数组下标越界的异常
③数组的长度,可以通过 数组名.length表示,提高代码的维护性
④数组的赋值和使用,往往可以通过搭配for循环一起操作
for(int i=0;i<数组名.length;i++){
//每一个元素表示为:数组名[i]
}
二、数组的基本及高级使用
功能 | 代码 | 功能 | 代码 | |
基本使用 | 正序打印 |
for(int i=0;i<arr.length;i++){ System.out.println(arr[i]); } |
倒序打印 |
for(int i=arr.length-1;i>=0;i--){ System.out.println(arr[i]); } |
求和、求平均 |
int sum = 0; for(int i=0;i<arr.length;i++){ sum+=arr[i]; } 和:sum 平均值:sum/arr.length |
查找 |
int index=-1; for(int i=0;i<arr.length;i++){ if(arr[i]==带查找的元素){ index = i; break; } } if(index==-1){//没找到}else{找到了} |
|
求最值 |
int max = arr[0]; int indexMax = 0; int min = arr[0]; int indexMin = 0; for(int i=1;i<arr.length;i++){ if(arr[i]>max){ max = arr[i]; indexMax = i; } if(arr[i]<min){ min = arr[i]; indexMin = i; } } 最大值:max 最小值:min |
排序(冒泡) |
for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ int t = arr[j]; arr[j] = arr[j+1]; arr[j+1]=t; } } |
|
复杂使用 | 赋值(传统方式=arr) |
newArr = arr; |
循环赋值 |
①创建新数组,长度=旧数组.length int[] newArr = new int[arr.length]; ②循环将旧数组的元素依次赋值给新数组的每个成员 for(int i=0;i<newArr.length;i++){ newArr[i] = arr[i]; } |
反转(方式1) |
for(int i=0;i<arr.length/2;i++){ //交换两个数 arr[i] vs arr[arr.length-1-i] } |
反转(方式2) |
①创建新数组,长度=旧数组.length int[] newArr = new int[arr.length]; ②循环赋值 for(int i=0,j=arr.length-1;i<arr.length;i++,j--){ newArr[i] = arr[j]; } ③将新数组的地址赋值给旧数组 arr = newArr; |
|
高级使用 | 追加元素 |
假如待添加的元素:add ①创建一个新数组,长度为 arr.length+1 int[] tempArr = new int[arr.length+1]; ②循环赋值(将arr的元素依次赋值给tempArr) for(int i=0;i<arr.length;i++){ tempArr[i] = arr[i]; } 补充:前两步可以使用 int[] tempArr=Arrays.copyOf(arr,arr.length+1);代替 ③将add添加到最后一个空位上 tempArr[tempArr.length-1] = add; ④将tempArr的地址赋值给arr arr = tempArr; |
插入元素 |
待添加的元素:add 待插入的位置:index ①创建一个新数组,长度为 arr.length+1 int[] tempArr = new int[arr.length+1]; ②循环赋值(将arr的元素依次赋值给tempArr) for(int i=0;i<arr.length;i++){ tempArr[i] = arr[i]; } 补充:前两步可以使用 int[] tempArr=Arrays.copyOf(arr,arr.length+1);代替 ③循环后移 for(int i=tempArr.length-1;i>index;i--){ tempArr[i] = tempArr[i-1]; } ④将add添加到index上 tempArr[index] = add; ⑤将tempArr的地址赋值给arr arr = tempArr; System.out.println("插入成功!"); |
三、二维数组
1、理解
二维数组本身也属于引用类型,保存的也是地址号
二维数组用于保存多个一维数组的容器,相当于多个一维数组的组合,即二维数组中的每个元素又是一个一维数组
2、数组的使用步骤
(1)动态初始化
(1)声明
数据类型[][] 数组名;
或
数据类型[] 数组名[];
或
数据类型 数组名[][];
(2)开辟空间
格式一:固定列数
数组名 = new 数据类型[行数][列数];//行数相当于二维数组的长度或一维数组的个数,列数相当于每个一维数组中的成员个数
格式二:不固定列数
数组名 = new 数据类型[行数][];
前两步可以合二为一
语法示例:
int[][] arr = new int[5][];
(3)赋值
格式一:固定列数
for(int i=0;i<数组名.length;i++){
for(int j=0;j<数组名[i].length;j++){
数组名[i][j] = 值;
}
}
格式二:不固定列数
for(int i=0;i<数组名.length;i++){
数组名[i]=new 数据类型[长度];//长度不能省略!
for(int j=0;j<数组名[i].length;j++){
数组名[i][j] = 值;
}
}
(4)使用
for(int i=0;i<数组名.length;i++){
for(int j=0;j<数组名[i].length;j++){
System.out.println(数组名[i][j]);
}
}
(2)静态初始化
(1)声明并初始化
数据类型[][] 数组名 ={{值,值},{值,值,值}};或
数据类型[][] 数组名 =new 数据类型[][]{{值,值},{值,值,值}};
(2)使用
for(int i=0;i<数组名.length;i++){
for(int j=0;j<数组名[i].length;j++){
System.out.println(数组名[i][j]);
}
}