【Java】数组,从基础到常用操作,一篇就够了

大家好,我是云扬。

今天咱们来啃一啃 Java 基础里必学、必考、必用的核心知识点 —— 数组。数组不只是编程里最基础的数据结构,更是咱们后面学 ArrayList、各种集合框架的底层根基,把数组吃透,后面学源码会轻松很多。

一、数组到底是个啥?

先给数组下个清晰的定义:

  • 数组是一个对象,用来存放固定数量、相同类型的元素
  • 元素按索引存放,索引从 0 开始
  • 元素类型可以是基本数据类型(int、double 等),也可以是引用类型(String、自定义对象等)

而且大家要记住:ArrayList 的底层就是用数组实现的,核心就是 Object[] elementData,所以学好数组 = 理解集合的第一步。

二、数组的声明与初始化

1. 两种声明方式(推荐第一种)

// 推荐写法:类型[] 数组名
int[] anArray;

// 不推荐写法(兼容 C/C++ 风格)
int anOtherArray[];

2. 两种初始化方式

(1)动态初始化:指定长度,自动赋默认值

new 关键字创建,说明数组真的是对象,不同类型默认值不同:

  • 基本数字类型:0
  • 布尔类型:false
  • 引用类型:null
// 开辟长度为 10 的 int 数组,默认全 0
int[] arr1 = new int[10];

// 开辟长度为 3 的 String 数组,默认全 null
String[] arr2 = new String[3];

(2)静态初始化:直接指定元素

// 完整写法
int[] arr3 = new int[]{1, 2, 3, 4, 5};

// 简写(常用)
int[] arr4 = {1, 2, 3, 4, 5};

三、数组最常用操作:访问 & 遍历

1. 按索引访问元素

int[] arr = {10, 20, 30};
// 赋值
arr[0] = 100;
// 取值
System.out.println(arr[0]); // 输出:100

⚠️ 注意:索引范围是 0 ~ length-1,超出就会抛 数组越界异常 ArrayIndexOutOfBoundsException

2. 两种遍历方式

① 普通 for 循环(需要操作索引时用)

for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

② for-each 循环(只遍历元素,推荐)

for (int num : arr) {
    System.out.println(num);
}

四、可变参数:本质就是数组

Java 里的可变参数 ...,底层就是用数组实现的,可以接收 0 个或多个参数。

/**
 * 可变参数方法
 * @param varargs 本质就是 String[]
 */
public void varargsMethod(String... varargs) {
    for (String str : varargs) {
        System.out.println(str);
    }
}

// 调用方式1:直接传多个字符串
varargsMethod("云扬", "一枚有趣的程序员");

// 调用方式2:直接传数组
String[] strArr = {"云扬", "Java 爱好者"};
varargsMethod(strArr);

五、数组 ↔ List 互转(高频面试 + 开发)

开发中经常要在数组和 List 之间切换,这里有个大坑一定要注意。

1. 数组转 List

import java.util.*;
import java.util.stream.Collectors;

public class ArrayToListDemo {
    public static void main(String[] args) {
        Integer[] arr = {1, 2, 3, 4, 5};

        // 1. Arrays.asList 转换
        List<Integer> list = Arrays.asList(arr);
        // ⚠️ 坑:这里返回的不是 java.util.ArrayList,不能增删!
        // list.add(6); // 运行报错!

        // 2. 转成真正的、可增删的 ArrayList(标准写法)
        List<Integer> realList = new ArrayList<>(Arrays.asList(arr));
        realList.add(6); // 正常执行

        // 3. int[] 这类基本类型数组,要用流式装箱
        int[] intArr = {1,2,3};
        List<Integer> intList = Arrays.stream(intArr)
                                     .boxed()
                                     .collect(Collectors.toList());
    }
}

2. List 转数组

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);

// List 转数组
Integer[] arr = list.toArray(new Integer[0]);

六、数组排序 & 二分查找

1. 排序:Arrays.sort()

int[] sortArr = {5, 2, 9, 1, 3};
// 升序排序
Arrays.sort(sortArr);
// 结果:[1, 2, 3, 5, 9]

2. 二分查找(必须先排序)

数组有序后,用二分查找效率远高于挨个遍历:

// 查找元素 3,返回对应索引
int index = Arrays.binarySearch(sortArr, 3);
System.out.println(index); // 输出:2

七、数组复制:高效写法

数组复制推荐用官方底层方法,效率远高于自己写循环

1. System.arraycopy(native 方法,性能最高)

int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[5];

// 参数:源数组, 源起始索引, 目标数组, 目标起始索引, 复制长度
System.arraycopy(src, 0, dest, 0, src.length);

2. Arrays.copyOfRange(常用,底层还是 System.arraycopy

// 从索引1复制到索引4(左闭右开)
int[] copyArr = Arrays.copyOfRange(src, 1, 4);
// 结果:[2, 3, 4]

八、最常见异常:数组越界

只要记住一句话:

数组索引从 0 开始,最大索引 = 数组长度 – 1

错误示例:

int[] arr = {1,2,3}; // 长度 3,索引 0、1、2
System.out.println(arr[3]); // 抛 ArrayIndexOutOfBoundsException

以上就是 Java 数组最核心、最常用的知识点,从定义、初始化、遍历,到和 List 互转、排序复制、异常避坑,基本覆盖了开发和面试里 90% 的数组考点。

我是云扬,后续会继续更新 Java 基础、MySQL、网站建设相关干货,咱们下篇见。

Tags:

发表回复

Your email address will not be published. Required fields are marked *.

*
*