一、数组基础

数组就是个“批量装同类型数据的盒子”,能一次存好多数据,方便一起操作。

1. 怎么用数组?

• 第一步:声明数组,告诉电脑“我要存什么类型的数据,叫啥名”
int[] a; // 推荐这么写,一眼就知道是数组
• 第二步:给数组分配空间,告诉它“最多存多少个数据”
a = new int[5]; // 这个数组能存5个整数
• 第三步:存、取数据

◦ 存数据:数组名[下标] = 数据; 比如 a[0] = 10;

◦ 取数据:数组名[下标] 比如 System.out.println(a[0]);

◦ 下标从0开始,范围是0 ~ 数组长度-1,超出会报错(数组下标越界)

• 遍历数组:用循环把每个元素都看一遍
for(int i = 0; i < a.length; i++){ // a.length 就是数组的长度
    System.out.println(a[i]);
}
2. 数组默认值

刚创建的数组,每个位置都有默认值:

• 整数:0

• 小数:0.0

• 布尔:false

• 字符:空字符

• 引用类型(比如字符串):null

3. 快速初始化数组

• 声明+分配空间一步到位:int[] a = new int[5];

• 直接写好要存的数据:int[] a = {1,2,3,4,5};(长度由花括号里的数决定)

• 注意:不能先声明,再单独给数组赋值,比如int[] a; a = {1,2,3};是错的。
二、数组在内存里是什么样的?

• 数组在内存里是连在一起的一块空间,所以读取速度很快。

• 数组变量存的不是数据本身,而是数组的起始地址。

• 数组下标从0开始,是为了让电脑计算地址更方便。

• 两个数组变量互相赋值时,传的是地址,所以两个变量会指向同一个数组;而普通变量赋值,传的是具体数值。
三、数组扩容

如果数组存满了,想继续加数据,就得“换个更大的盒子”,这就是扩容。

1. 扩容思路

1. 先创建一个比原来大的新数组(一般是原来的2倍)

2. 把旧数组里的数据都复制到新数组里

3. 让原来的数组变量指向新数组

2. 三种实现方式

1. 手动复制(用循环)
int[] oldArr = {1,7,4,3};
// 1. 建一个长度为原来2倍的新数组
int[] newArr = new int[oldArr.length * 2];
// 2. 把旧数组的数一个个复制过去
for(int i = 0; i < oldArr.length; i++){
    newArr[i] = oldArr[i];
}
// 3. 让旧数组变量指向新数组
oldArr = newArr;
2. 用System.arraycopy工具
int[] oldArr = {1,7,4,3};
int[] newArr = new int[oldArr.length * 2];
// 直接复制数据,参数分别是:原数组、起始位置、新数组、起始位置、复制长度
System.arraycopy(oldArr, 0, newArr, 0, oldArr.length);
oldArr = newArr;
3. 用Arrays.copyOf工具(最简单)
int[] oldArr = {1,7,4,3};
// 直接创建一个扩容后的新数组,参数是原数组和新长度
int[] newArr = Arrays.copyOf(oldArr, oldArr.length * 2);
oldArr = newArr;
四、可变长参数

这是JDK 5.0新增的语法,让方法能接收任意个同类型的参数。

• 语法:public static void 方法名(数据类型... 变量名)

• 用法:可变长参数在方法里会被当成数组处理,比如:
public static void printNums(int... nums){
    for(int i = 0; i < nums.length; i++){
        System.out.println(nums[i]);
    }
}
// 调用的时候可以传1个、3个、5个任意数量的参数
printNums(1,2,3);
printNums(5);
• 注意:一个方法里最多只能有一个可变长参数,而且必须放在参数列表的最后。
五、数组排序

1. 冒泡排序

把相邻的两个数比一比,大的往后挪,每一轮都把当前最大的数移到最后。
int[] arr = {3,1,4,2};
for(int i = 1; i < arr.length; i++){ // 控制比较几轮
    for(int j = 0; j < arr.length - i; j++){ // 每轮要比较几次
        if(arr[j] > arr[j+1]){
            // 交换两个数
            int temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
        }
    }
}
2. 选择排序

先固定一个位置,和后面所有数比一比,找到最小的数放到当前位置。
int[] arr = {3,1,4,2};
for(int i = 0; i < arr.length - 1; i++){ // 控制要放的位置
    for(int j = i+1; j < arr.length; j++){ // 和后面的数比
        if(arr[i] > arr[j]){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}
3. 工具方法排序(开发里常用)

直接调用java.util.Arrays.sort(arr);,电脑会自动帮你排好序,效率很高。
六、二维数组(了解就行)

二维数组就是“数组里套数组”,可以理解成表格,有行有列。

1. 基本用法

• 声明:int[][] a;

• 分配空间:a = new int[3][4];(3行4列)

• 访问元素:a[行下标][列下标],行和列的下标都从0开始

• 获取长度:a.length是行数,a[0].length是第0行的列数

2. 初始化方式

• 声明+分配空间:int[][] a = new int[3][4];

• 直接写数据:int[][] a = {{1,2}, {3,4,5}, {6}};(行数和列数由花括号里的元素个数决定)

3. 不规则二维数组

二维数组的每一行可以长度不一样,比如:
int[][] a = new int[3][]; // 只指定行数,不指定列数
a[0] = new int[2]; // 第0行有2个元素
a[1] = new int[3]; // 第1行有3个元素
a[2] = new int[1]; // 第2行有1个元素

更多推荐