数组
数组就是用于存储相同数据类型数据的一个容器。可以通过有规律的索引来访问没有规律的元素。
一维数组
定义格式:元素的数据类型[ ] 数组名称 = new 元素的数据类型 [ 数组容器大小 ];
数组定义格式解释:
元素:数组中的数据,数组中的变量。
数据类型:数组中的数据的数据类型,用来声明当前数组中,可以存放什么类型的数据。
[ ]:表示是一个一维数组
数组名称:数组本身也是一个变量,用于存储数组的地址的变量。所以,数组名称要符合标识符规范。
=:赋值符号,将数组的地址,赋值给数组的名称
new:新建,用于在堆内存中开辟一块空间,用来存储数据
元素的数据类型:和前面的元素的数据类型保持一致
数组容器的大小:可以存储数据的个数,数组长度必须给出,用于确定在内存中开辟多大的一块空间。
数组初始化的格式:
1.元素的数据类型[] 数组名称 = new 元素的数据类型[数组元素的个数];
2.在程序书写的时候,就知道了数组中的元素是什么值,可以使用这一种
元素的数据类型[] 数组名称 = new 元素的数据类型[] {元素值的罗列};
可以简写为:元素的数据类型[] 数组名称 = {元素值的罗列};
数组的遍历
遍历:把所有元素都访问一遍。
方式:通过循环,访问到数组中所有元素的索引。通过索引,访问到对应元素。
索引:角标、下标、脚标,表示某个元素在数组中的位置。范围:0 ~ 数组长度-1。数组长度:数组元素的个数,可以通过 数组名称.length 获取。
代码:
public static void main(String[] args) {
//定义一个数组
int[] arr = {12, 23, 34, 45, 56};
//定义循环,获取到数组所有的索引,此时i不仅表示循环的控制,还表示数组的索引
for (int i = 0; i < arr.length; i++) {
//定义一个变量接收根据索引获得到的数组中的值,并打印出来
int x = arr[i];
System.out.println(x);
}
}
练习:
1、定义一个方法,遍历一个一维数组。
思路:通过循环,访问到数组中所有元素的索引。通过索引,访问到对应元素。
2、定义一个方法,求一个一维数组中的最大值。
思路:设置一个变量 max,作用是先代表数组中的最大值,遍历数组,让每个元素都和该变量比较,如果比最大值变量还要大,那么就让当前元素替换掉最大值变量中的数据。
3、定义一个方法,将一个数组中的数据进行反转。
思路:第一个变成最后一个,第二个变为倒数第二个。(0索引和arr.length-1索引位置对调,1索引和arr.length-2索引位置对调....,直到数组的最中间的元素,停止对调。)
代码:
public static void main(String[] args) {
//定义一个数组
int[] arr = {16,80,33,43,42,57,29};
//调用数组遍历方法,将数组作为一个实参传递
method01(arr);
//调用数组数组获取最大值的方法,将数组作为一个实参传递
method02(arr);
//调用数组数组反转的方法,将数组作为一个实参传递
method03(arr);
}
//定义一个有参数的数组遍历方法
public static void method01(int[] arr) {
//循环遍历,获取所有的元素
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
//定义一个有参数的数组获取最大值的方法
public static void method02(int[] arr) {
//先假设数组的0号索引对应的值是最大值,将它复制给一个变量
int max = arr[0];
//循环遍历进行比较
for (int i = 1; i < arr.length; i++) {
//如果当前元素大于假设的最大值
if (arr[i] > max) {
max = arr[i];//就让当前元素将假设的最大值替换掉
}
}
//循环结束之后,此时max就是数组中的最大值
System.out.println("数组最大值为:"+max);
}
//定义一个有参数的数组反转的方法
public static void method03(int[] arr) {
//循环遍历比较,可以在for循环定义两个变量,一个索引从前向后,一个索引从后向前,
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
//i和j位置的元素,进行交换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
二维数组
二维数组:数组的每个元素,恰好又是一个数组。
定义方式:
int[][] arr = new int[3][];
解释:定义一个二维数组,名字arr,数组中每个元素还是一个数组,但是元素对应的数组,没有被创建的,arr[0] = null。
注意:二维数组的长度,一定要给出的,[3]代表二维数组长度
int[][] arr2 = {{},{4},{5,6,7}};
解释:arr2是一个二维数组,里面有3个元素,对应三个数组,分别是{},{4},{5,6,7}
注意:int [ ] [ ] arr = new int [0] [0];
这样定义回抛出异常,因为arr[0]索引上的元素为{},是一个没有任何元素的数组,获取没有元素的数组的指定索引,会抛出数组索引越界异常 ArrayIndexOutOfBoundsException。
数组的注意事项
1.在对数组进行操作时,先控制其值不为null,然后再判断数组的长度,以免发生空指针异常。如果 int [ ] a = null,那么针对于数组的所有操作,都将抛出空指针异常。
2.其实,如果不判断数组的长度不为0,就进行数组的循环遍历,for循环是可以控制住不报错的,但是最好将判断数组长度不为0写上,这样比较严谨。
3.int [ ] a = null;在内存中不开辟空间。int [ ] a = { };在内存中开辟空间,只不过数组中没有元素。
二维数组遍历代码:
public static void main(String[] args) {
//定义一个二维数组
int[][] arr2 = { {}, { 4 }, { 5, 6, 7 } };
// 首先,先判断二维数组不能为null并且数组的长度不为0
if (arr2 != null && arr2.length != 0) {
//利用for循环,遍历二维数组的每一个元素
for (int i = 0; i < arr2.length; i++) {
//二维数组的每一个元素又是一个数组,所以还需要判断数组不能为null并且数组的长度不为0
if (arr2[i] != null && arr2[i].length != 0) {
//利用for循环,遍历二维数组的每一个一维数组中的元素
for (int j = 0; j < arr2[i].length; j++) {
int z = arr2[i][j];
//在一行输出每个一维数组中的元素,用,分隔
System.out.print(z+",");
}
//每输出完一个一维数组,换行
System.out.println();
} else {
System.out.println("一维数组不能为null并且数组长度不能为0");
}
}
}else {
System.out.println("二维数组不能为null并且数组长度不能为0");
}
}
练习:
分析以下需求,并用代码实现:
(1)定义一个int类型的一维数组,内容为{6,2,9,15,1,5,20,7,18}
(2)将数组最大元素与最后一位元素进行交换,最小元素与第一位元素进行交换,并打印数组,最后效果{1,2,9,15,6,5,18,7,20}
提示思路:先查找最大值和最小值出现的索引。
代码实现:
public static void main(String[] args) {
int[] arr = {6,2,9,15,1,5,20,7,18};//{1,2,9,15,6,5,18,7,20}
//判断数组不能为null并且数组长度不能为0
if(arr != null&&arr.length != 0){
//判断数组中的元素个数是否为1,如果只有一个数,直接输出
if(arr.length == 1){
System.out.println(arr[0]);
//判断数组中元素个数是否为2,如果有两个,判断大小,最后输出结果
}else if(arr.length == 2){
if(arr[0]>arr[1]){
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
for(int i = 0;i
System.out.print(arr[i]+",");
}
//判断数组中的数据个数是否为2个以上
}else if(arr.length > 2){
//定义几个变量假设是最小值,最大值,最小值的索引,最大值的索引
int min = arr[0];
int max = arr[arr.length-1];
int minIndex = 0;
int maxIndex = arr.length-1;
//使用for循环进行遍历
for(int i = 0;i
//找到最小值和最小值的索引
if(arr[i]
minIndex = i;
min = arr[i];
}
//找到最大值和最大值的索引
if(arr[i]>max){
maxIndex = i;
max = arr[i];
}
}
//将最小值和第一个数替换
int tempMin = arr[minIndex];
arr[minIndex] = arr[0];
arr[0] = tempMin;
//将最大值和最后一个数替换
int tempMax = arr[maxIndex];
arr[maxIndex] = arr[arr.length-1];
arr[arr.length-1] = tempMax;
//for循环遍历输出最后结果
for(int i = 0;i
System.out.print(arr[i]+",");
}
}
}else{
System.out.println("数组不能为null并且数组长度不能为0");
}
}