什么是数组?
数组本质上就是让程序员能够批量创建一组相同类型的变量。
创建数组
//动态初始化
数据类型[] 数组名称 = new 数据类型[数组长度] ;//静态初始化
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2 ,........} ;
数据类型[] 数组名称 = {初始化数据};
代码实例:
//动态初始化
int[] arr = new int[3];
//静态初始化
//基本格式
int[] arr = new int[]{1,2,3};
//省略格式
int[] arr = {1,2,3};
//获取数组元素
System.out.println(arr[0]);//1
System.out.println(arr[1]);//2
System.out.println(arr[2]);//3
注意:
- 静态初始化时,数组元素个数和初始化数据的格式是一致的。
- 访问数组元素,在使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值(如果是整数类型,默认值为0;如果是浮点类型,默认值为0.0;等等)。
- 访问数组元素,在使用静态初始化数组的时候,系统自动马上将默认值替换成为了大括号当中的具体数值。
数组的使用
代码示例:获取数组长度 & 访问元素
- 获取数组长度(数组名称.length)
- 访问元素(数组名称[下标])
int[] arr = {1, 2, 3};
// 获取数组长度
System.out.println("length: " + arr.length); // 执行结果: 3
// 访问数组中的元素
System.out.println(arr[1]); // 执行结果: 2
System.out.println(arr[0]); // 执行结果: 1
arr[2] = 100;
System.out.println(arr[2]); // 执行结果: 100
注意:
- 使用arr.length能够获取到数组的长度(一旦数组创建好了之后,此时length就是固定的,无法动态进行修改);
- 使用[ ]按下标取数组元素,下标从0开始计数;
- 使用[ ]操作既能读取数据,也能修改数据;
- 下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围, 会出现下标越界异常。
数组在内存中的存储
Java中内存可以划分成为五个部分:
一个数组的内存图:
使用for - each遍历数组
代码示例:
public class Test{
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for (int x : arr) {
System.out.println(x);
}
}
}
for - each是for循环的另一种使用方式,能够更方便的完成对数组的遍历。
数组作为方法的参数----传递地址
当调用方法的时候,向方法的小括号进行传参,传递进去的师叔祖的地址值。
数组作为方法的参数,返回的是数组的地址值。
代码示例:
public class Test{
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
System.out.println(arr);//地址值
printArray(arr);
}
public static void printArray(int[] a) {
for (int x: a) {
System.out.println(x);
}
}
}
//int[] a 是函数的形参,int[] arr 是函数的实参
数组作为方法的返回值---返回地址
数组作为方法的返回值,返回的是数组的地址值。
代码参考:
public class Test {
public static void main(String[] args) {
int[] ret = calculate(1,2,4);
System.out.println(ret[0]);
System.out.println(ret[1]);
}
public static int[] calculate(int a,int b,int c) {
int sum = a + b + c;
int avg = sum / 3;
int[] arr = {sum , avg};
return arr;
}
}
代码示例:写一个方法,将数组中的每个元素都 * 2
public class Test{
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int[] result = transform(arr);
printArray(result);
}
public static int[] transform(int[] arr) {
int[] ret = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
ret[i] = arr[i] * 2;
}
return ret;
}
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
数组转字符串
Arrays.toString(arr);
数组拷贝
copyOf()方法---复制数组至指定长度----开辟新的内存空间,原数组不变
Arrays.copyOf(arr,arr.length);
数组查询
Arrays类的binarySearch()方法---用二分搜索法搜索指定数组---返回要搜索元素的索引值---适用于各种类型数组
Arrays.binarySearch(Object[], Object key);
二维数组
二维数组本质上也是一维数组,只不过每个元素又是又是一个一维数组
基本语法
数据类型[ ][ ] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
代码示例
public class Test{
public static void main(String[] args) {
int[][] arr = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
for (int row = 0; row < arr.length; row++) {
for (int col = 0; col < arr[row].length; col++) {
System.out.printf("%d\t", arr[row][col]);
}
System.out.println("");
}
}
}
运行结果: