假设出现一种情况,我想记录100个数字,定义100个变量还可行吗?

2-9 数组和算法 - 图1

我们可以使用到数组,数组是相同类型数据的有序集合。数组可以代表任何相同类型的一组内容(包括引用类型和基本类型)其中存放的每一个数据称为数组的一个元素,数组的下标是从0开始,也就是第一个元素的索引是0!

  1. int[] arr = new int[10]; //需要new关键字来创建!
  2. String[] arr2 = new String[10];

数组本身也是类(编程不可见,C++写的),不是基本数据类型!

  1. int[] arr = new int[10];
  2. System.out.println(arr.length); //数组有成员变量!
  3. System.out.println(arr.toString()); //数组有成员方法!

一维数组

一维数组中,元素是依次排列的(线性),每个数组元素可以通过下标来访问!声明格式如下:

  1. 类型[] 变量名称 = new 类型[数组大小];
  2. 类型 变量名称n = new 类型[数组大小]; //支持C语言样式,但不推荐!
  3. 类型[] 变量名称 = new 类型[]{...}; //静态初始化(直接指定值和大小)
  4. 类型[] 变量名称 = {...}; //同上,但是只能在定义时赋值

创建出来的数组每个元素都有默认值(规则和类的成员变量一样,C语言创建的数组需要手动设置默认值),我们可以通过下标去访问:

  1. int[] arr = new int[10];
  2. arr[0] = 626;
  3. System.out.println(arr[0]);
  4. System.out.println(arr[1]);

我们可以通过数组变量名称.length来获取当前数组长度:

  1. int[] arr = new int[]{1, 2, 3};
  2. System.out.println(arr.length); //打印length成员变量的值

数组在创建时,就固定长度,不可更改!访问超出数组长度的内容,会出现错误!

String[] arr = new String[10];
System.out.println(arr[10]);  //出现异常!

//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
//    at com.test.Application.main(Application.java:7)

思考:能不能直接修改length的值来实现动态扩容呢?

int[] arr = new int[]{1, 2, 3};
arr.length = 10;

数组做实参,因为数组也是类,所以形参得到的是数组的引用而不是复制的数组,操作的依然是数组对象本身

public static void main(String[] args) {
    int[] arr = new int[]{1, 2, 3};
    test(arr);
    System.out.println(arr[0]);
}

private static void test(int[] arr){
    arr[0] = 2934;
}

数组的遍历

如果我们想要快速打印数组中的每一个元素,又怎么办呢?

传统for循环

我们很容易就联想到for循环

int[] arr = new int[]{1, 2, 3};
for (int i = 0; i < arr.length; i++) {
   System.out.println(arr[i]);
}

foreach

传统for循环虽然可控性高,但是不够省事,要写一大堆东西,有没有一种省事的写法呢?

int[] arr = new int[]{1, 2, 3};
for (int i : arr) {
    System.out.println(i);
}

foreach属于增强型的for循环,它使得代码更简洁,同时我们能直接拿到数组中的每一个数字。

二维数组

二维数组其实就是存放数组的数组,每一个元素都存放一个数组的引用,也就相当于变成了一个平面。

//三行两列
int[][] arr = { {1, 2},
                {3, 4},
                {5, 6}};
System.out.println(arr[2][1]);

二维数组的遍历同一维数组一样,只不过需要嵌套循环!
二维数组的遍历同一维数组一样,只不过需要嵌套循环!

int[][] arr = new int[][]{ {1, 2},
                           {3, 4},
                           {5, 6}};
for (int i = 0; i < 3; i++) {
     for (int j = 0; j < 2; j++) {
          System.out.println(arr[i][j]);
     }
}

多维数组

不止二维数组,还存在三维数组,也就是存放数组的数组的数组,原理同二维数组一样,逐级访问即可。

可变长参数

可变长参数其实就是数组的一种应用,我们可以指定方法的形参为一个可变长参数,要求实参可以根据情况动态填入0个或多个,而不是固定的数量

public static void main(String[] args) {
     test("AAA", "BBB", "CCC");    //可变长,最后都会被自动封装成一个数组
}

private static void test(String... test){
     System.out.println(test[0]);    //其实参数就是一个数组
}

由于是数组,所以说只能使用一种类型的可变长参数,并且可变长参数只能放在最后一位!