基本用法
定义
数组本质上就是让我们能 “批量” 创建相同类型的变量.
注意事项: 在 Java 中, 数组中包含的变量必须是 相同类型
使用
注意事项: 静态初始化的时候, 数组元素个数和初始化数据的格式是一致的.
// 动态初始化
数据类型[] 数组名称 = new 数据类型[长度];
// 静态初始化
数据类型[] 数组名称 = { 初始化数据 };
int arr = new int[3];
int arr1 = {0,0,0};
获取数组长度&访问元素
int[] arr = {1, 2, 3};
// 获取数组长度
System.out.println("length: " + arr.length); // 执行结果: 3
// 访问数组中的元素,通过下标访问
//下标从0开始到arr.length - 1
//超过范围就会抛出java.lang.ArrayIndexOutOfBoundsException 异常
System.out.println(arr[1]); // 执行结果: 2
System.out.println(arr[0]); // 执行结果: 1
arr[2] = 100; //通过下标修改数据
System.out.println(arr[2]); //执行结果:100
注意事项
使用 arr.length 能够获取到数组的长度. . 这个操作为成员访问操作 符. 后面在面向对象中会经常用到.
使用 [ ] 按下标取数组元素. 需要注意, 下标从 0 开始计数
使用 [ ] 操作既能读取数据, 也能修改数据.
下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围, 会出现下标越界异常
遍历数组
所谓 “遍历” 是指将数组中的所有元素都访问一遍, 不重不漏. 通常需要搭配循环语句.
//第一种for循环
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// 执行结果 1 2 3
//第二种 for-each循环遍历
for (int x : arr) {
System.out.println(x);
}
// 执行结果 1 2 3
数组作为方法的参数/返回值
参数传数组类型
在函数内部修改数组内容, 函数外部也发生改变. 此时数组名 arr 是一个 “引用” . 当传参的时候, 是按照引用传参.
内存就是指我们熟悉的 “内存”. 内存可以直观的理解成一个宿舍楼. 有一个长长的大走廊, 上面有很多房间. 每个房间的大小是 1 Byte (如果计算机有 8G 内存, 则相当于有 80亿 个这样的房间).
每个房间上面又有一个门牌号, 这个门牌号就称为 地址
引用相当于一个 “别名”, 也可以理解成一个指针.
创建一个引用只是相当于创建了一个很小的变量, 这个变量保存了一个整数, 这个整数表示内存中的一个地址.
总结: 所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只 是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).
null 在 Java 中表示 “空引用” , 也就是一个无效的引用
注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联.
数组常用方法
Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法.
Arrays.sort(arr); //排序
Arrays.toString(arr);//数组转换为字符串
Arrays.copyOf(arr,arr.length); //深拷贝
…
二维数组
二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组.
数据类型[][] 数组名称 = new 数据类型 [行数][列数];
数据类型[][] 数组名称 = { [初始化数据],[数据],[...],.. };
用法与一维数组大同小异