数组就是同类元素的集合。相同类型的数据,放在一起就是数组。
Java 当中的数组有三种创建方式。如下:
int[] arr1 = {
1,2,3,4,5};
int[] arr2 = new int[5];
int[] arr3 = new int[]{
1,2,3,4,5};
这三种的意思分别是:
1 直接创建数组,并且初始化为 1,2,3,4,5
2 创建一个大小为 5 的数组
3 创建一个大小为 5 的数组,并且初始化为 1,2,3,4,5
new 是一个关键字,把数据开辟在堆区。
数组的访问也是通过下标来获取元素对应的值。不过在 Java 当中,数组的长度可以用 length 直接算出。代码示例:
int[] arr = new int[]{
1,2,3,4,5};
System.out.println(arr[0]); //1
System.out.println(arr[1]); //2
System.out.println(arr[2]); //3
System.out.println(arr.length); //5
通过 arr.length 来直接算出数组的长度。因为 arr.length 事数组的长度,所以访问的时候,最大范围就是 arr.length - 1 。
通过 for 循环来把数组内容全部遍历一遍。代码示例:
int[] arr = new int[]{
1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
foreach 有三个参数。第一个是数组的元素类型,第二个是变量名称,第三个是数组名。代码如下:
int[] arr = new int[]{
1,2,3,4,5,6,7,8,9,10};
for (int x: arr) {
System.out.print(x+" ");
}
System.out.println();
用 foreach 也可以实现,但是和 for 循环的区别是:foreach 循环只能遍历,并不能返回下标。
在 Java 当中,数组也是可以作为参数传递的。接收的时候也用数组接收就好了。代码示例:
public static void print2(int[] ret){
for (int i = 0; i < arr.length; i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = new int[]{
1,2,3,4,5,6,7,8,9,10};
print2(arr);
}
这里就是通过参数把数组 arr 传到打印方法里面,然后通过方法输出值。
在方法接收的时候,其实是数组的引用。数据放在堆区,变量放在栈区,用新的参数来接收对取数据的地址,就是引用。就是下图的这种关系。
通过栈区的另外一个变量也能访问到堆区的数据。
因为有引用,引用就是指向的对象。所以就有 null 指向的对象为空。
数组也可以和其它类型一样作为方法的返回值。代码如下:
public static int[] newArr(){
int[] ret = new int[]{
1,2,3,4,5};
return ret;
}
public static void main(String[] args) {
int[] arr = newArr();
System.out.println(Arrays.toString(arr));
}
通过 toString 方法来把数组转化为字符串。代码示例:
int[] arr = new int[]{
1,2,3,4,5,6,7,8,9,10};
String str = Arrays.toString(arr);
System.out.println(str);
通过 Arrays.toString 方法,来把数组转化为字符串。
Arrays.copyOf() 方法,有两个参数,第一个是源数组,第二个是要拷贝的长度。代码示例:
int[] arr = new int[]{
1,2,3,4,5};
int[] ret = Arrays.copyOf(arr, arr.length);
System.out.println(Arrays.toString(ret));
这里就完成了数组的拷贝。如果长度变为 2 * arr.length 就是数组的扩容。
Arrays.copyOfRange 有三个参数,第一个是源数组,第二个是数组的起始下标,第三个是数组的结束下标。要注意的是:Java 当中的范围都是左闭右开。代码示例:
int[] arr = new int[]{
1,2,3,4,5};
int[] ret = Arrays.copyOfRange(arr,1,3);
System.out.println(Arrays.toString(ret));
因为是拷贝的下标 1 到 下标 3 所以只有两个数据,就是 2 3 。
System.arraycopy 有五个参数:第一个是原数组,第二个是从原数组的开始拷贝位置,第三个是拷贝的目的地数组,第四个是 目的地数组的开始位置,第五个是拷贝长度。
int[] arr = new int[]{
1,2,3,4,5};
int[] ret = new int[arr.length];
System.arraycopy(arr,0,ret,0,arr.length);
System.out.println(Arrays.toString(ret));
数组名.clone 就是直接把数组克隆出来,产生一个一模一样的副本。代码示例:
int[] arr = new int[]{
1,2,3,4,5};
int[] ret = arr.clone();
System.out.println(Arrays.toString(ret));
Java 当中提供了一种查找方法 Arrays.binarySearch 有两个参数,第一个是需要查找的数组,第二个是要查找的元素。代码示例:
int[] arr = new int[]{
1,2,3,4,5,6,7,8,9,10};
int ret = Arrays.binarySearch(arr, 5);
System.out.println(ret);
Arrays.sort 只需要把数组名传进去就可以完成排序。代码示例:
int[] arr = new int[]{
1,4,2,9,5,10,7,6,8,3};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
二维数组的本质是一维数组,不过每个元素有是一维数组。如下图:
把 arr[0] 和 arr[1] 看成一维数组,arr[0] 又是一行的一维数组。所以说二维数组的本质也是一维数组。
二维数组的表示也有三种表示方法。如下示例:
int[][] arr1 = {
{
1,2,3},{
4,5,6}};
int[][] arr2 = new int[2][3];
int[][] arr3 = new int[][]{
{
1,2,3},{
4,5,6}};
打印二维数组的时候,用两个 for 循环嵌套就好。或者用深度打印:Arrays.deepToString 代码示例:
int[][] arr = new int[][]{
{
1,2,3},{
4,5,6}};
System.out.println(Arrays.deepToString(arr));