聊聊Java中的数组

数组是 Java 中用来存储固定大小同类型元素的数据结构。数组在内存中是连续存储的,可以通过索引访问元素。

数组的特点

  1. 固定长度 - 一旦创建,大小不能改变

  2. 相同类型 - 所有元素必须是同一数据类型

  3. 快速访问 - 通过索引直接访问,时间复杂度 O(1)

  4. 内存连续 - 元素在内存中是连续存储的

  5. 下标从0开始 - 第一个元素索引是0,最后一个元素索引是length-1

声明和初始化数组

1. 声明数组

// 声明语法
数据类型[] 数组名;  // 推荐方式
或
数据类型 数组名[];  // C风格,不推荐

示例:

int[] numbers;     // 声明整型数组
String[] names;    // 声明字符串数组
double scores[];   // 不推荐这种声明方式

2. 初始化数组

(1) 静态初始化 - 声明时直接赋值
// 完整语法
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...};

// 简化语法
数据类型[] 数组名 = {元素1, 元素2, ...};

示例:

int[] arr1 = new int[]{1, 2, 3, 4, 5};
int[] arr2 = {1, 2, 3, 4, 5};  // 简化写法
String[] fruits = {"Apple", "Banana", "Orange"};
(2) 动态初始化 - 先声明大小再赋值
数据类型[] 数组名 = new 数据类型[长度];

示例:

int[] numbers = new int[5];  // 创建长度为5的整型数组
String[] names = new String[3]; // 创建长度为3的字符串数组

// 后续赋值
numbers[0] = 10;
numbers[1] = 20;
// ...
names[0] = "Alice";
names[1] = "Bob";

访问数组元素

数组名[索引]  // 访问元素
数组名[索引] = 值  // 修改元素

示例:

int[] nums = {10, 20, 30, 40, 50};

// 访问第3个元素(索引2)
int third = nums[2];  // 30

// 修改第1个元素(索引0)
nums[0] = 100;  // 数组变为 {100, 20, 30, 40, 50}

数组长度

使用length属性获取数组长度:

int len = 数组名.length;

示例:

int[] arr = {1, 2, 3};
System.out.println(arr.length);  // 输出3

多维数组

Java 支持多维数组,最常见的是二维数组。

1. 声明和初始化

// 静态初始化
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// 动态初始化
int[][] matrix = new int[3][3];  // 3行3列

2. 访问元素

int value = matrix[行索引][列索引];

示例:

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

System.out.println(matrix[1][2]);  // 输出6(第2行第3列)

数组的常用操作

1. 遍历数组

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

// 使用增强for循环(foreach)
for(int num : arr) {
    System.out.println(num);
}

2. 数组排序

import java.util.Arrays;

int[] numbers = {5, 2, 9, 1, 5};
Arrays.sort(numbers);  // 升序排序

3. 数组复制

// 使用Arrays.copyOf()
int[] copy = Arrays.copyOf(original, newLength);

// 使用System.arraycopy()
System.arraycopy(src, srcPos, dest, destPos, length);

4. 数组转字符串

String str = Arrays.toString(arr);

注意事项

  1. 数组越界 - 访问超出索引范围会抛出ArrayIndexOutOfBoundsException

    int[] arr = new int[3];
    int x = arr[3];  // 错误!最大索引是2

  2. 空指针异常 - 未初始化的数组为null,访问会抛出NullPointerException

    int[] arr;
    System.out.println(arr[0]);  // 错误!arr未初始化

  3. 基本类型数组对象数组的区别:

    • 基本类型数组直接存储值

    • 对象数组存储的是引用

  4. 数组与集合的区别

    • 数组大小固定,集合大小可变

    • 数组可以存储基本类型和对象,集合只能存储对象

    • 数组效率更高,集合功能更丰富

实用技巧

  1. 可变参数本质上是数组:

    public void printNumbers(int... numbers) {
        // numbers是一个int数组
    }

  2. 使用Arrays工具类进行各种操作:

    Arrays.fill(arr, value);      // 填充数组
    Arrays.equals(arr1, arr2);    // 比较数组
    Arrays.binarySearch(arr, key);// 二分查找

  3. Java 8+ 流式处理数组:

    int[] numbers = {1, 2, 3, 4, 5};
    int sum = Arrays.stream(numbers).sum();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值