04、数组学习

179 阅读5分钟

一、数组的概述和特点

1、数组

①概念

一组相同类型数据的容器。

  • 相同类型:Java语言要求存入数组的数据类型必须一致
  • 容器:类似于生活中存放物品的容器,在编程的世界中,『容器』可以用来存放数据
  • 一组:容器中可以存放多个数据

②声明数组变量

 int[] ageArray;
 String[] nameArray;
 double salaryArray [];

虽然[]也可以放在变量名的后面,但是还是建议放在类型的后面。

         // 声明数组时不能在方括号中指定数组长度
         char[5] tipArray;

③创建数组对象

[1]动态创建数组

 ageArray = new int[5];

[2]静态创建数组

此时[]中不能写数字指定长度

 nameArray = new String[]{"foo", "bar", "biz"};

也可以这么写:

 int[] numberArray = {5, 7, 11, 13, 17, 19};

④将数据存入数组

 ageArray[0] = 10;
 ageArray[1] = 11;
 ageArray[2] = 12;
 ageArray[3] = 13;
 ageArray[4] = 14;
         
 nameArray[0] = "aaa";
 nameArray[1] = "bbb";
 nameArray[2] = "ccc";

⑤从数组中读取数据

 System.out.println("ageArray[0] = " + ageArray[0]);
 System.out.println("ageArray[1] = " + ageArray[1]);
 System.out.println("ageArray[2] = " + ageArray[2]);
 System.out.println("ageArray[3] = " + ageArray[3]);
 System.out.println("ageArray[4] = " + ageArray[4]);
 ​
 System.out.println("nameArray[0] = " + nameArray[0]);
 System.out.println("nameArray[1] = " + nameArray[1]);
 System.out.println("nameArray[2] = " + nameArray[2]);

⑥遍历数组

 // 6.遍历数组(通过循环依次读取数组中的每一个值)
 // 遍历数组的起点:数组下标0
 // 遍历数组的终点:数组长度-1
 for (int i = 0; i < ageArray.length; i++) {
 ​
     // 在遍历过程中,使用i作为数组下标访问每一个数组元素
     int age = ageArray[i];
     System.out.println("age = " + age);
 }

PS:生成遍历数组的for循环模板的快捷键是数组变量名.fori

⑦数组必须创建对象再访问元素

images

⑧数组中元素默认值

系统创建数组对象后,必须分配和数组长度匹配的空间,此时每一个数组元素都会被系统分配默认值。

images

2、内存分析

①声明基本数据类型变量

int a = 10;

images

②创建对象

Scanner scanner = new Scanner(System.in);

images

③创建数组对象

images

④将数据写入数组

ageArray[1] = 5;

images

⑤多声明一个数组变量

int[] otherArray = ageArray;

images

⑥通过另一个变量访问数组元素

images

⑦数组变量指向新数组对象

otherArray = new int[2];

images

⑧给新数组元素赋值

otherArray[1] = 33;

images

3、多维数组

①概念[逻辑角度]

[1]一维数组

一维数组是线性的结构,通俗来说就是一条线

images

[2]二维数组

二维数组通俗来说就是一个面

images

[3]三维数组

三维数组就是一个立体的空间结构了

images

②多维数组的底层内存存储结构

images

③语法层面

[1]创建二维数组格式一

// 格式1:动态初始化——创建数组对象时就指定了两个维度的数组长度
int[][] arr2d01 = new int[3][2];
arr2d01[0][0] = 100;
arr2d01[0][1] = 101;
arr2d01[1][0] = 102;
arr2d01[1][1] = 103;
arr2d01[2][0] = 104;
arr2d01[2][1] = 105;

images

[2]创建二维数组格式二

// 格式2:动态初始化——仅指定第一个维度的数组长度
int[][] arr2d02 = new int[3][];

// Java中多维数组不必都是规则矩阵形式
arr2d02[0] = new int[]{3, 5, 7};
arr2d02[1] = new int[]{14, 21, 66, 89};
arr2d02[2] = new int[]{90, 100};

images

[3]创建二维数组格式三

// 格式3:静态初始化——在创建对象时将数据填充
// 此时如果某个元素位置设置为null不会编译报错,但是访问这个位置时还是要先初始化
int[][] arr2d03 = new int[][]{{1,2,3}, {4,5}, null, {6,7,8}};

// 前面设置null的地方,需要初始化才可以访问
arr2d03[2] = new int[]{12,24};
arr2d03[2][0] = 5;

images

[4]创建二维数组格式四[不建议]

// 格式4:声明变量时,两层[]没在一起
int[] x[] = new int[][]{{1,2,3}, {4,5}, {6,7,8}};

images

④访问二维数组元素

// 二、访问二维数组元素(读、写)
int[][] arr2d05 = new int[2][2];

// 向数组元素写入数据
arr2d05[1][0] = 10;

// 读取数组元素
System.out.println("arr2d05[1][0] = " + arr2d05[1][0]);

⑤遍历二维数组

// 三、遍历二维数组:需要使用双层嵌套的循环
int[][] arr2d06 = new int[][]{{1,2,3},{4,5,6},{7,8,9}};

// 先遍历第一个维度:取出每一个一维数组
for (int i = 0; i < arr2d06.length; i++) {

    int[] intArr = arr2d06[i];

    for (int j = 0; j < intArr.length; j++) {
        int intValue = intArr[j];
        System.out.println("intValue["+i+"]["+j+"] = " + intValue);
    }

}

⑥杨辉三角练习

images

 // 1.创建二维数组,第一维长度为10
 int[][] yanghuiArr = new int[10][];
 ​
 // 2.通过双层for循环给二维数组填充数据
 for (int i = 0; i < yanghuiArr.length; i++) {
 ​
     // 3.创建一维数组,对yanghuiArr下标i位置进行初始化
     yanghuiArr[i] = new int[ i + 1 ];
 ​
     // 4.遍历一维数组,填充数据
     for (int j = 0; j <= i; j++) {
 ​
         // 5.一头(一维数组的下标0元素)一尾(一维数组的下标长度-1元素)固定就是1
         // 一维数组中最后一个元素的下标正好就是现在外层循环变量:i
         if (j == 0 || j == i) {
 ​
             yanghuiArr[i][j] = 1;
 ​
         } else {
 ​
             // 6.非头尾的元素,由上一行中两个元素相加得到
             // 第一个值的下标:[i-1][j-1]
             // 第二个值的下标:[i-1][j]
             yanghuiArr[i][j] = yanghuiArr[i-1][j-1] + yanghuiArr[i-1][j];
 ​
         }
 ​
     }
 ​
 }
 ​
 // 7.遍历填充数据的二维数组
 for (int i = 0; i < yanghuiArr.length; i++) {
 ​
     int[] yanghuiValueArr = yanghuiArr[i];
 ​
     for (int j = 0; j < yanghuiValueArr.length; j++) {
 ​
         System.out.print(yanghuiValueArr[j] + "\t");
 ​
     }
 ​
     System.out.println();
 ​
 }