跳转至

7. 数组

前言

前边已经讲过了 Java 中的 8 大基本数据类型,这篇文章主要讲解引用类型中的 数组

主要内容:

  • 数组简介
  • 遍历
  • 排序
  • 常用方法

数组简介

数组是多个相同数据类型的元素按一定顺序排列而成的集合。

  • 索引位置从 0 开始计数。
  • 一经创建,大小不可改变。
  • 数组元素有默认值:整型是 0,浮点型是 0.0,布尔型是 false。

初始化方式

静态初始化

int[] arr1 = {1, 3, 5, 8, 10};
int[] arr2 = new int[]{1, 3, 5, 8, 10};

动态初始化

int[] arr = new int[5];
arr[0] = 1;
arr[1] = 3;
arr[2] = 5;
arr[3] = 8;
arr[4] = 10;

求数组长度

int[] arr = new int[10];
int size = arr.length; // 10

二维数组

初始化

静态初始化方法

int[][] arr1 = {{1, 2, 4}, {5, 7, 9}, {19, 12, 18}};

动态初始化方法

int[][] arr1 = new int[3][3];
arr1 = new int[][]{{1, 2, 4}, {5, 7, 9}, {19, 12, 18}};

int[][] arr2 = new int[3][];
arr2 = new int[][]{{1, 2, 4}, {5, 7, 9}, {19, 12, 18}};

求二维数组长度

int[][] arr = new int[10][20];
int row = arr.length;     // 行数
int col = arr[0].length;  // 列数

数组遍历

标准 for 循环

public class TraverseTest {
    public static void main(String[] args) {
        String[] arr = {"安信株式会社", "海贼王", "进击的巨人", "鬼灭之刃", "斗罗大陆"};
        int size = arr.length;
        for (int i = 0; i < size; i++) {
            System.out.println("第 " + (i + 1) + " 个元素:" + arr[i]);
        }
    }
}

增强 for 循环

public class EnforceTraverseTest {
    public static void main(String[] args) {
        String[] arr = {"安信株式会社", "海贼王", "进击的巨人", "鬼灭之刃", "斗罗大陆"};
        int index = 0;
        for (String name : arr) {
            System.out.println("第 " + (index + 1) + " 个元素:" + name);
            index++;
        }
    }
}

标准库遍历

import java.util.Arrays;

public class StandardLibraryTest {
    public static void main(String[] args) {
        String[] arr = {"安信株式会社", "海贼王", "进击的巨人", "鬼灭之刃", "斗罗大陆"};
        System.out.println(Arrays.toString(arr));
    }
}

⚠️ 对于二维数组,可以使用 Arrays.deepToString()


数组排序

冒泡排序

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        char[] chArray = {'c', 'u', 'n', 'y', 'u'};
        System.out.println(Arrays.toString(chArray)); // 排序前

        for (int i = 0; i < chArray.length - 1; i++) {
            for (int j = 0; j < chArray.length - 1 - i; j++) {
                if (chArray[j] < chArray[j + 1]) {
                    char temp = chArray[j];
                    chArray[j] = chArray[j + 1];
                    chArray[j + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(chArray)); // 排序后
    }
}

标准库排序

import java.util.Arrays;

public class StandardLibrarySortTest {
    public static void main(String[] args) {
        String[] arr = {"安信株式会社", "海贼王", "进击的巨人", "鬼灭之刃", "斗罗大陆"};
        System.out.println(Arrays.toString(arr)); // 排序前
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr)); // 排序后
    }
}

常用方法

Java Arrays 工具类提供了丰富的方法:

  • public static String toString(Object[] a):将数组转换为字符串形式输出。
  • public static List asList(T... a):将数组转换为 List(固定长度)。
  • public static boolean equals(Object[] a, Object[] b):判断两个数组是否内容相同。
  • public static boolean deepEquals(Object[] a1, Object[] a2):深度比较多维数组是否相等。
  • public static void sort(int[] a):对整型数组进行升序排序。
  • public static int binarySearch(int[] a, int key):使用二分法查找指定元素的索引(需已排序)。
  • public static void fill(int[] a, int val):将数组中所有元素设置为指定值。
  • public static void fill(T[] a, T val):将对象数组填充为指定值。
  • public static T[] copyOf(T[] original, int newLength):复制数组到指定长度的新数组。
  • public static T[] copyOfRange(T[] original, int from, int to):复制数组的指定范围。
  • public static boolean mismatch(T[] a, T[] b)【JDK 9】:返回第一个不同元素的索引。
  • public static T[] copyOfRange(T[] original, int from, int to, Class<? extends T[]> newType)【JDK 1.6】:复制指定范围并指定类型的新数组。

示例

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CommonMethodsTest {
    public static void main(String[] args) {
        String[] arr = {"安信株式会社", "海贼王", "进击的巨人", "鬼灭之刃", "斗罗大陆"};

        System.out.println(Arrays.toString(arr)); // 数组转字符串

        List<String> list = new ArrayList<>(Arrays.asList(arr));
        System.out.println(list); // 数组转 List

        list.add("镇魂街");
        String[] newArr = new String[list.size()];
        list.toArray(newArr);
        System.out.println(Arrays.toString(newArr)); // List 转数组

        System.out.println(Arrays.asList(newArr).contains("进击的巨人")); // true
        System.out.println(Arrays.asList(newArr).contains("网球王子")); // false
    }
}

总结

数组相关内容总结:

  • 一维、二维数组初始化方式(静态、动态)
  • 数组的长度和默认值
  • 三种常见遍历方式(for、增强 for、标准库)
  • 排序方法(冒泡排序、Arrays.sort
  • 常用库方法(toStringasList 等)

数组是 Java 编程中最常见的数据结构之一,必须熟练掌握。