1.数组的初始化
下面是两种数组初始化语法的代码示例:
double[] myList; // 首选的方法 或 double myList[]; // 效果相同,但不是首选方法
创建数组的三种方式:🙌
// 数组初始化创建 // 第一种方式,声明并分配空间 double[] scores = new double[5]; // 第二种方式,分步骤执行 int[] apples; // 声明数组,还没有分配空间 apples = new int[5]; // 分配空间 // 第三种方式,静态初始化 double[] hens = {3, 5, 1, 2.5, 7.8};
2.数组的赋值机制
数组赋值机制
数组在默认情况下是引用传递,赋的值是地址,赋值方式为引用传达🚓
示例:
// 数组的赋值机制 int[] arr1 = {1, 2, 3}; int[] arr2 = arr1; // 获得的其实是arr1的地址 System.out.println(arr1); // [I@4eec7777 System.out.println(arr2); // [I@4eec7777 ---------------------- 可以看到arr1与arr2的地址是一样的,本质上还是一个数组
值传递与引用传递
值传递:
拷贝值,会新建一个空间
示例:
int n1 = 10; int n2 = n1; n2 = 80;
内存图示:
引用传递:
拷贝地址,不会新建空间
代码见上文数组赋值机制的例子
图示:
3.For-Each 循环
JDK 1.5 引进了一种新的循环类型,被称为 For-Each 循环或者加强型循环,它能在不使用下标的情况下遍历数组。
语法格式如下:
for(type element: array) { System.out.println(element); }
示例:
int[] dogs = {1, 2, 3, 4, 5}; for (int dog : dogs) { System.out.println(dog); // 1 // 2 // 3 // 4 // 5 }
有个更加简单的方式打印数组中的所有值,即利用Arrays类的toString
方法:
int[] dogs = {1, 2, 3, 4, 5}; System.out.println(Arrays.toString(dogs)); // [1, 2, 3, 4, 5]
4.数组拷贝
如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法:
int[] dogs = {1, 2, 3, 4, 5}; int[] cats = Arrays.copyOf(dogs, dogs.length); System.out.println(dogs); // [I@4eec7777 System.out.println(cats); // [I@3b07d329
可以看到,他们的地址变得不一致了,也就是cats数组新开辟了一块内存空间,实现了值拷贝操作
另外说明,这个方法通常用来增加数组的大小:
int[] dogs = {1, 2, 3, 4, 5}; dogs = Arrays.copyOf(dogs, 2 * dogs.length); System.out.println(dogs.length); // 10
5.数组排序
要想对数值型数组进行排序,可以使用Arrays类中的sort方法:
这个方法使用了优化的快速排序算法
int[] dogs = {1, 22, 38, 4, 5}; Arrays.sort(dogs); for (int dog : dogs) { System.out.println(dog); // 1 // 4 // 5 // 22 // 38 }
6.数组其他常见API
static int binarySearch(type[] a, int start, int end, type v):
采用二分搜索算法查找值v。如果查找成功,则返回相应的下标值;否则,返回一个负数值r。-r-1是为保持a有序v应插入的位置
int[] dogs = {1, 22, 38, 4, 5}; int i = Arrays.binarySearch(dogs, 0, dogs.length, 38); System.out.println(i); // 2
static void fill(type[] a, type v):
将数组的所有数据元素值设置为v
int[] dogs = new int[3]; Arrays.fill(dogs, 521); System.out.println(Arrays.toString(dogs)); // [521, 521, 521]
static boolean equals(type[] a, type[] b):
如果两个数组大小相同,并且下标相同的元素都对应相等,返回true
int[] dogs = {1, 2, 3}; int[] cats = {1, 2, 3}; System.out.println(Arrays.equals(dogs, cats)); // true
7.二维数组
二维数组的基本使用示例:
// 二维数组 int[][] doubleArr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 双重循环遍历 for (int i = 0; i < doubleArr.length; i++) { for (int j = 0; j < doubleArr[i].length; j++) { System.out.println(doubleArr[i][j]); } }
内存分析🧇
当我们创建一个二维数组时,它在JVM内存中是这样表示的:
另外,要想快速地打印一个二维数组的数据元素列表,可以调用deepToString方法:
int[][] dogs = {{1, 2, 3}, {4, 5, 6}}; System.out.println(Arrays.deepToString(dogs)); // [[1, 2, 3], [4, 5, 6]]