java的二维数组在创建时就与C语言有很大不同
SE.08.02.00.00
public class helloworld {
public static void main(String[] args) {
int[][] arr1 = {{1, 2, 3}, {4, 5, 6}};//与后面一种定义完全相同,只不过这种是简写
int[][] arr2 = new int[][]{{1, 2, 3}, {4, 5, 6}};//静态初始化
int [][] arr3 = new int[2][3];//动态初始化
}
}
java中二维数组的初始化赋值时一定要注意要区分好行列。
和一维数组定义的时候一样 new int arr[][]{}方阔号和大括号里面只允许有一个是赋值的。
java在二维数组上非常强调“二维数组是特殊的一维数组”,我们将aar2[0]打印出来就会发现打印出来的是一个地址,这个地址就是{1,2,3}这个一维数组的地址
public class helloworld {
public static void main(String[] args) {
int[][] arr1 = {{1, 2, 3}, {4, 5, 6}};//与后面一种定义完全相同,只不过这种是简写
int[][] arr2 = new int[][]{{1, 2, 3}, {4, 5, 6}};//静态初始化
int [][] arr3 = new int[2][3];//动态初始化
System.out.println(arr2[0]);//打印出来是一个地址,并不是整型数字。
}
}
所以一定要注意,二维数组的java虚拟机里是这样存储的
当我们创建int[][] arr2 = new int[][]{{1, 2, 3}, {4, 5, 6}};
时,系统先创建三个一维数组arr2、{1,2,3}、{4,5,6},这个arr2有两个元素,这俩个元素都是地址,一个地址指向的是{1,2,3}这个数组,一个地址是指向{4,5,6}这个数组
所以我们在写arr2.length
时这个值并不是6 ,而是2。而{1,2,3}这个数组元素个数可以用arr[i].length
来表示
所以遍历打印二维数组元素的代码如下:
import java.util.Arrays;
public class helloworld {
public static void main(String[] args) {
int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 6}};//静态初始化
//一种方式,用两次循环
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
//第二种方式,用toString
for (int i = 0; i < arr.length; i++) {
System.out.println(Arrays.toString(arr[i]));
}
//第三种方式,用for each
for (int[] ret : arr) {
for (int x :ret) {
System.out.print(x+" ");
}
System.out.println();
}
//第四种方式,用deepToString
System.out.println(Arrays.deepToString(arr));
}
}
打印结果
此外
在C语言中我们在定义二维数组时要求行下标可以省略,列下标不可以省略,这样就保证了C语言中创建的二维数组是先铺满一行再铺满一行这样的分布的。
但是在java中恰恰是相反的,行下标不可以省略,列下标可以省略,所以java里面的二维数组可以是不规则的。
请看下面的代码
public class helloworld {
public static void main(String[] args) {
int[][] arr = new int[2][];//静态初始化
arr[0] = new int[2];
arr[1] = new int[4];
//一种方式,用两次循环
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
至此,二维数组简单讲解到这里