四、数组
1、数组的定义
数组当中数据类型必须统一,运行期间不可改变。
创建数组之后不能修改数组的大小。
(1) 动态初始化(指定长度)
int[] arrayA = new int[300];//动态初始化基本格式
(2) 静态初始化(指定内容)直接给内容
int[] arrayA = new int[] {5,25,25};
(3) 省略格式(静态初始化)
int[] arrayA ={10,20,30};
(4) 静态、动态初始化可以分两步写
int[] arrayB;
arrayB=new int[]{112,21,23};
int[] arrayC;
arrayC=new int[5];
注意,分两步必须写new,不能省略。
int[] arrayB;
arrayB={112,21,23};//错误!!!!!!!!!!!!!
2、数组的访问、赋值
(1)数组访问:下标从0开始
array[0] //下标从0开始
array //返回地址的哈希值
(2)赋值
动态初始化会给定默认值
- 整数类型:0
- 浮点类型:0.0
- 字符类型:'\u0000'
- 布尔类型:false
- 应用类型:null
array[1] =123;\\赋值格式
(3)java数组内存分析
Java的内存需要划分成为5个部分:
-
1)栈(Stack):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。
局部变量:方法的参数,或者是方法(内部的变量
作用域:一旦超出作用域,立刻从栈内存当中消失。 -
2)堆(Heap)︰凡是new出来的东西,都在堆当中。
堆内存里面的东西都有一个地址值:16进制
堆内存里面的数据,都有默认值,参考数组默认值。 - 3)方法区(Method Area):存储.class相关信息,包含方法的信息。
- 4)本地方法栈(Native Method Stack):与操作系统相关。
- 5)寄存器(pc register): 与CPU相关。
单个数据内存示意图
两个数据内存示意图
两个指向同一个数组
int[] arrayC = array;
System.out.println(arrayC[0]);
arrayC[1]=2222;
System.out.println(array[1]);//array[1]变为2222
注意:arrayC的操作会影响array!!!!
3、常见异常
(1)越界异常
int[] arrayA = new int[] {5,25,25};
System.out.println(arrayA[3]);
下标只到2,超出范围
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
(2)空指针
int[] arrayB =null;
System.out.println(arrayB[1]);
空指针报错
Exception in thread "main" java.lang.NullPointerException: Cannot load from int array because "arrayB" is null
4、二维数组
(1)二维数组定义
两种声明方式:
int arr1[][]; \\数组元素类型 数组名字[][];
float[][] arr2; \\数组元素类型[][] 数组名字;
常用第一种
(2)二维数组赋值与查询
每一行都是一个数组
public class a {
public static void main(String[] args) {
/* 第一种方式 */
int arr1_0[][] = { { 1, 3, 5 }, { 5, 9, 10 } }; //指定元素,长度相同,new int[][]省略。
int arr1_1[][];
arr1_1 =new int[][] { { 1, 3, 5 }, { 5, 9, 10 } };
/* 第二种方式 */
int arr2[][] = new int[][] { { 65, 55, 12 }, { 92, 71 } }; //可以不等长
/* 第三种方式 */
int arr3[][] = new int[2][3]; // 先给数组分配内存空间
arr3[0] = new int[] { 6, 54, 71 }; // 给第一行分配一个一维数组
arr3[1][0] = 1; // 给第二行第一列赋值为1
arr3[1][1] = 2; // 给第二行第二列赋值为2
arr3[1][2] = 3; // 给第二行第三列赋值为3
/* 第四种方式 不规则数组*/
int arr4[][] = new int[2][]; // 可以不先指定列数,每一行列数可以不同
arr4[0] = new int[] { 6, 54, 71 }; // 第一行分配3个元素
arr4[1] = new int[] { 6, 54 }; // 第一行分配2个元素
}
}
错误方式:没有声明行的数量
int arr1[][] = new int[][];
int arr2[][] = new int[][2];
二维数组读取:
System.out.println(arr4[1]);//返回第一行数组的地址 [I@30946e09
System.out.println(arr4[1][1]);//返回具体元素
System.out.println(arr4.length);//二维数组的行数,2
5、多维数组
建议使用Map、List等集合数据类型
int arr1[][][] = new int[2][3][4];//创建三维数组
float arr2[][][][] = new char[6][7][8][9];//创建四维数纹
double arr3[][][][][]= new double[10][11][12][13][14]; // 建五维数组
6、数组的基本操作
(1)数组长度 array.length
运行期间不能改变长度
int[] arrayC = new int[3];
System.out.println(arrayC.length);
arrayC = new int[5];
System.out.println(arrayC.length);
下面是相当于创建了新的数组,只是数据组沿用旧的名字。二维数组长度返回的是行数。
(2)遍历输出,普通for循环
System.out.print(arr[i][j]);//不换行输出
System.out.println(arr[i][j]);//换行输出
注意:"" 代表字符串 ''代表字符
二维数组输出例子
public class a {
public static void main(String[] args) {
int arr4[][] = new int[2][]; // 可以不先指定列数,每一行列数可以不同
arr4[0] = new int[] { 6, 54, 71 }; // 第一行分配3个元素
arr4[1] = new int[] { 6, 54 }; // 第一行分配2个元素
for (int i=0; i< arr4.length; i++){
for (int j = 0; j < arr4[i].length; j++) {
System.out.print(arr4[i][j]+" ");
}
System.out.print("\n");
}
}
}
\* 输出
6 54 71
6 54
*\
(3)遍历输出,foreach
类似于python里的
for i in list:
pass
例子
public class a {
public static void main(String[] args) {
int arr4[][] = new int[2][]; // 可以不先指定列数,每一行列数可以不同
arr4[0] = new int[] { 6, 54, 71 }; // 第一行分配3个元素
arr4[1] = new int[] { 6, 54 }; // 第一行分配2个元素
for (int i=0; i< arr4.length; i++){
System.out.println("arr4["+i+"]有"+arr4[i].length+"个元素:");
for (int temp : arr4[i]) {
System.out.print(temp+" ");
}
System.out.println("\n");
}
}
\* 输出
arr4[0]有3个元素:
6 54 71
arr4[1]有2个元素:
6 54
*\
(4)元素反转
public class a {
public static void main(String[] args) {
int arr[] = new int[]{1,2,3}; // 可以不先指定列数,每一行列数可以不同
for (int min = 0, max =arr.length-1; min < max; min++ ,max--) {
int temp =arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
} // 3 2 1
}
}
(5)填充和替换数组元素
有许多重构语法
Arrays.fill()(int[] a ,int value)
Arrays.fill()(char[] b ,char value)
填充与替换案例
import java.util.Arrays;
public class a {
public static void main(String[] args) {
int arr[] = new int[]{1,2,3}; // 替换数组值
Arrays.fill(arr,4);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
} // 4 4 4
System.out.print("\n");
int arr1[] = new int[4]; // 填充空数组
Arrays.fill(arr1,5);
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+" ");
} // 5 5 5 5
}
}
(6)数组作为方法参数:
printArray(array);
这里主函数传入的是地址值,方法接收地址值,因此在方法内修改数组,数组会发生永久变化
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
array[1]=2222;
}
外部数组此时也变化了
(7)数组作为方法返回值,返回多个结果:
public static int[] calculate(int a,int b, int c) {
int sum= a+b+c;
int ave=sum/3;
int[] array = {sum,ave};
return array;
}
7、练习案例
(1)横竖打印列表
public class a {
public static void main(String[] args) {
char arr[][] = new char[4][];
arr[0] = new char[]{'体','育','课'};
arr[1] = new char[]{'数','学','课'};
arr[2] = new char[]{'语','文','课'};
arr[3] = new char[]{'物','理','课'};
System.out.println("————横着打印课表————");
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]);
}
if(i % 2 ==0){
System.out.println(";");
} else{
System.out.println("。");
}
}
System.out.println("————竖着打印课表————");
for (int j = 0; j < arr[0].length; j++) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i][j]);
}
System.out.print("\n");//相当于 System.out.println();
}
System.out.println(";。;。");
}
}
输出为:
————横着打印课表————
体育课;
数学课。
语文课;
物理课。
————竖着打印课表————
体数语物
育学文理
课课课课
;。;。
(2)打印杨辉三角
public class a {
public static void main(String[] args) {
//输出10行杨辉三角
int[][] arr =new int[10][];
//给杨辉三角赋值
for (int i = 0; i < arr.length; i++) {
arr[i] =new int[i+1];
for (int j = 0; j < arr[i].length; j++) {
if (i<2) {
arr[i][j] = 1;//前两行赋值为1
} else {
if (j==0 || j == (arr[i].length-1)){
arr[i][j] =1;
} else {
arr[i][j] = arr[i-1][j-1] +arr[i-1][j];
}
}
}
}
//输出
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+"\t");//制表符!!好东西
}
System.out.println();
}
}
}
注意制表符可以保证数字对齐
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1