Java数组深入解析:定义、操作、常见问题与高频练习

一、数组的定义

1. 什么是数组

数组是一个容器,用来存储多个相同类型的数据。它属于引用数据类型,可以存储基本数据类型(如int、char)或者引用数据类型(如String、对象)。

2. 数组的定义方式

a. 动态初始化

动态初始化时,只有数组的长度被定义,数组元素的值在之后可以进行赋值。

java 复制代码
数据类型[] 数组名 = new 数据类型[长度];
数据类型 数组名[] = new 数据类型[长度];

示例:

java 复制代码
// 声明数组
int[] arr;  // 推荐的声明方式
// 或者
int arr[];
// 创建数组arr = new int[5];  // 创建一个长度为5的整数数组

// 声明并初始化数组
int[] arr2 = {1, 2, 3, 4, 5, 6};  // 创建并初始化数组

b. 静态初始化

静态初始化时,数组在创建时就已经有了具体的元素值。

java 复制代码
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...};

不推荐使用这种方式,因为它显得冗长。

c. 简化的静态初始化

简化静态初始化可以在声明时直接指定数组元素,代码更简洁。

java 复制代码
数据类型[] 数组名 = {元素1, 元素2, ...};

示例:

java 复制代码
int[] arr = {1, 2, 3, 4, 5};  // 创建一个包含5个整数的数组
String[] names = {"Alice", "Bob", "Charlie"};

二、数组操作

1. 获取数组的长度

数组的长度可以通过 .length 属性来获取。

java 复制代码
int[] arr = {100, 200, 300};
int length = arr.length;  // 获取数组的长度,值为3

注意,length 后面没有小括号,因为它不是方法,而是数组的一个属性。

2. 数组的索引

数组元素是通过索引来访问的,索引从 0 开始,最大索引为 length - 1。

java 复制代码
int[] arr = {100, 200, 300};
System.out.println(arr[0]);  // 输出 100
System.out.println(arr[1]);  // 输出 200
System.out.println(arr[arr.length-1]);  // 输出 30

3. 存储元素

使用索引将元素存入数组:

java 复制代码
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

4. 获取数组元素

通过索引获取数组中的元素:

java 复制代码
int value = arr[0];  // 获取索引0位置的元素

5. 遍历数组

可以使用 for 循环来遍历数组中的元素:

java 复制代码
// 普通for循环
int[] arr = {10, 20, 30, 40, 50};
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);  // 打印数组中的每个元素
}

// 增强型for循环
for (int num : arr) {  // 声明一个整数类型的变量 num,用来存储数组中的每个元素
    System.out.println(num);  // 输出每个元素
}

6. 数组的复制

将一个数组的元素复制到另一个数组中:

java 复制代码
int[] arr1 = {1, 2, 3};
int[] arr2 = new int[arr1.length];

for (int i = 0; i < arr1.length; i++) {
    arr2[i] = arr1[i];
}

三、常见问题

1. 数组索引越界异常 (ArrayIndexOutOfBoundsException)

当你访问的索引超出了数组的有效范围时,会抛出该异常。数组索引必须在 0 到 length - 1 之间。

示例:

java 复制代码
int[] arr = {0,1, 2, 3};
System.out.println(arr[4]);  // 会抛出 ArrayIndexOutOfBoundsException

2. 空指针异常 (NullPointerException)

如果你尝试访问一个值为 null 的数组或对象,就会发生空指针异常。

示例:

java 复制代码
int[] arr = null;
System.out.println(arr.length);  // 会抛出 NullPointerException

四、数组常用练习

1. 求数组最大值

通过遍历数组,找出其中的最大值。

java 复制代码
int[] arr = {10, 4, 7, 1, 9};
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
    if (arr[i] > max) {
        max = arr[i];
    }
}
System.out.println("最大值是:" + max);

2. 统计符合条件的数组元素

假设需要统计数组中既能被3整除又能被5整除的元素个数,但不能被7整除。

java 复制代码
int count = 0;
for (int i = 0; i < arr.length; i++) {
    if (arr[i] % 3 == 0 && arr[i] % 5 == 0 && arr[i] % 7 != 0) {
        count++;
    }
}
System.out.println("符合条件的元素个数是:" + count);

3. 通过键盘输入并输出数组

java 复制代码
Scanner sc = new Scanner(System.in);
String[] arr = new String[3];
for (int i = 0; i < arr.length; i++) {
    System.out.println("请输入第" + (i + 1) + "个名字:");
    arr[i] = sc.next();
}
for (String name : arr) {
    System.out.println(name);
}

4. 数组扩容

如果数组的大小不够,可以创建一个新的数组,并将旧数组的元素复制到新数组中。

java 复制代码
int[] oldArr = {1, 2, 3, 4, 5};
int[] newArr = new int[10];
for (int i = 0; i < oldArr.length; i++) {
    newArr[i] = oldArr[i];
}
oldArr = newArr;  // 让旧数组指向新的扩容数组

5. 数组合并

合并两个数组:

java 复制代码
int[] arr1 = {1, 2, 3};
int[] arr2 = {4, 5, 6};
int[] newArr = new int[arr1.length + arr2.length];

for (int i = 0; i < arr1.length; i++) {
    newArr[i] = arr1[i];
}
for (int i = 0; i < arr2.length; i++) {
    newArr[arr1.length + i] = arr2[i];
}
相关推荐
特立独行的猫A29 分钟前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
云和数据.ChenGuang1 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
憧憬成为java架构高手的小白2 小时前
LangGraph4j 实战(下)
java
天诰2 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
蜗牛一步步往上爬5 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
这个昵称不容易6 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长6 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
张张123y7 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
文丑颜不良啊8 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼8 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发