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

ops/2024/12/27 8:13:45/

一、数组的定义

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];
}

http://www.ppmy.cn/ops/145326.html

相关文章

windows11家庭版安装docker无法识别基于wsl2的Ubuntu

软件环境&#xff1a;windows11家庭版安装WSL2,Ubuntu22.04&#xff0c;docker4.34.2 问题描述&#xff1a;安装docker时&#xff0c;设置阶段无法识别Ubuntu22.04. 原因&#xff1a;windows11家庭版本默认没有Hyper-V 解决方案&#xff1a;将下述代码保存在新建记事本中&am…

python+reportlab创建PDF文件

目录 字体导入 画布写入 创建画布对象 写入文本内容 写入图片内容 新增页 画线 表格 保存 模板写入 创建模板对象 段落及样式 表格及样式 画框 图片 页眉页脚 添加图形 构建pdf文件 reportlab库支持创建包含文本、图像、图形和表格的复杂PDF文档。 安装&…

JWT认证机制在Node.js中的详细阐述

一、概念 JWT&#xff08;JSON Web Token&#xff09;是一种基于Token的认证机制&#xff0c;它允许服务器无状态地验证用户身份。JWT是一个开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种简洁的、自包含的用于各方之间安全传输信息的JSON对象。JWT通常被…

论文研读:AnimateDiff—通过微调SD,用图片生成动画

1.概述 AnimateDiff 设计了3个模块来微调通用的文生图Stable Diffusion预训练模型, 以较低的消耗实现图片到动画生成。 论文名&#xff1a;AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning 三大模块&#xff1a; 视频域适应…

vue前端项目中实现电子签名功能(附完整源码)

文章目录 一、具体思路二、所需依赖三、添加签名面板2.1 canvas 转base642.2 电子签名等比例缩小 四、html转cavas&#xff08;原始文档&#xff09;五、合成图片六、效果测试七、完整源码 一、具体思路 在vue项目中使用以下步骤思路去实现&#xff1a; 起初的原始文档的格式都…

Scala课堂小结

(一)数组&#xff1a; 1.不可变数组 2.创建数组

路由器转发数据报的封装过程

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器转发数据的封装过程 路由器转发数据的封…

游戏引擎学习第61天

回顾并计划接下来的事情 我们现在的目标是通过创建一个占位符版本的游戏来展示我们所做的工作。这个版本的游戏包含了许多基本要素&#xff0c;目的是快速构建一些东西&#xff0c;进行测试&#xff0c;并观察代码结构的形成。这些代码的实施是为了理解系统如何工作&#xff0…