跳转至

Java 中数组(Array)与列表(List)的深入探讨

简介

在 Java 编程中,数组(Array)和列表(List)是两种常用的数据结构,用于存储和管理一组数据。它们各自有独特的特性、使用场景和方法。深入理解这两者之间的区别和正确的使用方式,对于编写高效、健壮的 Java 代码至关重要。本文将详细探讨数组和列表在 Java 中的基础概念、使用方法、常见实践以及最佳实践。

目录

  1. 基础概念
    • 数组的概念
    • 列表的概念
  2. 使用方法
    • 数组的创建与初始化
    • 列表的创建与初始化
    • 访问元素
    • 修改元素
    • 添加元素
    • 删除元素
  3. 常见实践
    • 遍历数组和列表
    • 排序
    • 查找元素
  4. 最佳实践
    • 何时选择数组
    • 何时选择列表
  5. 小结
  6. 参考资料

基础概念

数组的概念

数组是一种固定大小的数据结构,它在内存中是连续存储的。一旦数组被创建,其大小就不能改变。数组可以存储基本数据类型(如 intdoublechar 等)或对象引用。数组中的每个元素都有一个索引,从 0 开始,通过索引可以快速访问元素。

列表的概念

列表是一种接口,在 Java 中主要由 ArrayListLinkedList 实现。列表的大小是动态可变的,可以根据需要自动扩展或收缩。列表只能存储对象引用,不能存储基本数据类型,但可以通过自动装箱和拆箱机制来处理基本数据类型。列表提供了更丰富的操作方法,如添加、删除、插入元素等。

使用方法

数组的创建与初始化

创建一个数组有两种常见方式:

// 声明并创建一个整数数组,大小为 5
int[] array1 = new int[5]; 

// 声明并初始化一个字符串数组
String[] array2 = {"Apple", "Banana", "Cherry"}; 

列表的创建与初始化

ArrayList 为例:

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

// 创建一个空的 ArrayList
List<String> list1 = new ArrayList<>(); 

// 创建并初始化一个 ArrayList
List<String> list2 = new ArrayList<>(List.of("Apple", "Banana", "Cherry")); 

访问元素

数组

通过索引访问数组元素:

int[] numbers = {1, 2, 3, 4, 5};
int value = numbers[2]; // 获取索引为 2 的元素,值为 3

列表

使用 get 方法访问列表元素:

List<Integer> numberList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
int listValue = numberList.get(2); // 获取索引为 2 的元素,值为 3

修改元素

数组

直接通过索引修改数组元素:

int[] array = {1, 2, 3};
array[1] = 4; // 将索引为 1 的元素修改为 4

列表

使用 set 方法修改列表元素:

List<Integer> list = new ArrayList<>(List.of(1, 2, 3));
list.set(1, 4); // 将索引为 1 的元素修改为 4

添加元素

数组

数组一旦创建,大小固定,无法直接添加元素。若要添加元素,需要创建一个新的更大的数组,并将原数组元素复制到新数组中。

int[] oldArray = {1, 2, 3};
int[] newArray = new int[oldArray.length + 1];
System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
newArray[oldArray.length] = 4; // 添加新元素 4

列表

使用 add 方法添加元素:

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

删除元素

数组

和添加元素类似,数组不能直接删除元素,需要创建新数组并复制不需要删除的元素。

int[] oldArray = {1, 2, 3, 4, 5};
int indexToRemove = 2;
int[] newArray = new int[oldArray.length - 1];
System.arraycopy(oldArray, 0, newArray, 0, indexToRemove);
System.arraycopy(oldArray, indexToRemove + 1, newArray, indexToRemove, oldArray.length - indexToRemove - 1);

列表

使用 remove 方法删除元素:

List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
list.remove(2); // 删除索引为 2 的元素

常见实践

遍历数组和列表

数组

  • 传统 for 循环
int[] array = {1, 2, 3, 4, 5};
for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}
  • 增强 for 循环(for - each)
int[] array = {1, 2, 3, 4, 5};
for (int num : array) {
    System.out.println(num);
}

列表

  • 传统 for 循环
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}
  • 增强 for 循环(for - each)
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
for (int num : list) {
    System.out.println(num);
}
  • 迭代器(Iterator)
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

排序

数组

使用 Arrays.sort 方法对数组进行排序:

import java.util.Arrays;

int[] array = {5, 3, 1, 4, 2};
Arrays.sort(array); // 数组将被排序为 [1, 2, 3, 4, 5]

列表

使用 Collections.sort 方法对列表进行排序:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

List<Integer> list = new ArrayList<>(List.of(5, 3, 1, 4, 2));
Collections.sort(list); // 列表将被排序为 [1, 2, 3, 4, 5]

查找元素

数组

使用 Arrays.binarySearch 方法在排序后的数组中查找元素:

import java.util.Arrays;

int[] array = {1, 2, 3, 4, 5};
int index = Arrays.binarySearch(array, 3); // 返回元素 3 的索引 2

列表

使用 indexOf 方法查找元素的索引:

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

List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
int index = list.indexOf(3); // 返回元素 3 的索引 2

最佳实践

何时选择数组

  • 当你确切知道数据的数量并且不会改变时,数组是一个很好的选择。例如,存储一年的月份名称,因为月份数量固定为 12 个。
  • 如果你需要频繁地通过索引访问元素,数组的性能更好,因为数组在内存中是连续存储的,可以通过索引快速定位元素。

何时选择列表

  • 当数据的数量不确定,需要动态添加或删除元素时,列表更合适。例如,存储用户输入的一系列数字,用户可能随时添加或删除数字。
  • 如果你需要使用丰富的集合操作方法,如排序、查找、插入等,列表提供了更方便的接口。

小结

在 Java 中,数组和列表各有优缺点和适用场景。数组适用于数据量固定且需要快速通过索引访问的场景,而列表则更适合数据量动态变化且需要丰富操作方法的情况。通过了解它们的基础概念、使用方法和最佳实践,开发者可以根据具体需求选择合适的数据结构,从而编写更高效、更健壮的代码。

参考资料

希望这篇博客能帮助你更好地理解和使用 Java 中的数组和列表。如果你有任何问题或建议,欢迎留言讨论。