05.数组
数组属于引用类型,数组型数据是对象
数组创建后,如果没有赋值,有默认值:byte[0],short[0],int[0],long[0],float[0.0],double[0.0],char[\u0000],boolean[false],String[null]
数组赋值机制
- 基本数据类型赋值 ,这个值就是具体的数据,而且相互不影响(值拷贝)。
- 数组在默认情况下是引用传递,赋的值是地址(地址拷贝)。
解析:
- JVM的内存主要分三个区域:栈,堆,方法区。
- 基本数据类型的数据放在栈中,例如int a = 1和int b = a就是在栈中开辟了两块空间来存放a和b具体的值,所以改变b并不会影响a的值。
- 数组创建后,例如int[] arr1 = {…}和int[] arr1 = arr1其实是在栈中先开辟一块空间叫arr1,它存放的是地址,指向实际存储的具体数据,而这些数据存储在堆中,当arr1的值赋给arr2时,其实是将地址值赋给了arr2,所以arr2也指向了相同的堆中数据,所以通过arr2也可以改变arr1的值。(也就是说总共开辟了三块空间,栈中两个,堆中一个)
多维数组
int[][] arr = new int[2][3];
//arr[i]表示二维数组第i行的地址
//arr.length表示二维数组的宽度,即一维数组的个数
//arr[i].length表示二维数组每一行的元素的个数,即每个一维数组的长度
解析:
栈中开辟一块空间arr,存放的是地址,指向堆中的一处空间,这个空间存放的也是地址,也就是arr[0]和arr[1]。然后arr[0]指向堆中的另一处空间,这才是二维数组中第一个一维数组的具体的数值,同理,arr[1]也指向堆中的另一处空间,存放的是二维数组中第二个二维数组的具体的数值。(也就是说总共开辟了四块空间,栈中一个,堆中三个)
Java中多维数组可以列数不确定,即各个一维数组的长度可以相同也可以不相同
例题:杨辉三角
/*
* 1
* 1 1
* 1 2 1
* 1 3 3 1
* 1 4 6 4 1
* 1 5 10 10 5 1
*
*思路:化繁为简,先死后活
*
* */
//首先,不管具体的数字,将这个三角形的形状先打印出来,经过观察我们可以发现,杨辉三角的每层数的个数和所在层数是相等的
//然后三角形的层数也先给它一个确定值,比如6层,根据多维数组可以列数不确定的特点,利用for循环,创建数组
int[][] arr = new int[6][];
for(int i = 0; i < arr.length; i++){
arr[i] = new int[i + 1];
}
//当然我们可以写一个辅助for循环遍历数组,查看当前的效果
for(int i = 0; i < arr.length; i++){
for(int j = 0;j < arr[i].length; j++){
System.out.print(arr[i][j]</