学习Java数组操作:从基础到高级技巧详解
在Java编程中,数组是一种非常基础且常用的非 primitives 数据结构,它用于存储一组相同类型的值。无论是数据处理、遍历还是其他操作,数组都是一个不可或缺的工具。本文将从数组的基本概念开始,逐步介绍常用的操作方法,帮助你全面掌握Java数组操作的技巧。
一、数组的基础知识
1. 数组的定义
在Java中,数组是一种定长对象容器,用于存储一组数据。它通过索引的方式进行随机访问,支持从0到length-1的合法索引范围。
int[] numbers = new int[5]; // 创建一个长度为5的整数数组
2. 数组的基本属性
- 长度:使用
numbers.length获取数组的长度。 - 元素类型:数组的元素类型由定义时指定,如
int[]、String[]等。
3. 数组的初始化
有两种方式初始化数组:
- 使用
new关键字并指定长度:int[] numbers = new int[5]; - 使用数组 initializer语法(从Java 7开始):
int[] numbers = {1, 2, 3, 4, 5};
二、数组的操作方法
1. 访问和修改数组元素
通过索引可以访问或修改数组中的元素。
示例:
int[] numbers = new int[]{1, 2, 3, 4, 5};
System.out.println(numbers[0]); // 输出:1
numbers[2] = 10;
System.out.println(numbers[2]); // 输出:10
2. 遍历数组
使用for循环或增强的for循环(推荐)来遍历数组中的所有元素。
示例:
int[] numbers = new int[]{1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {System.out.println(numbers[i]);
}
三、数组的常用操作
1. 找出数组的最大值
使用Math.max()方法结合遍历数组的方法。
public class ArrayMax {public static void main(String[] args) {int[] numbers = {1, 4, 2, 5, 3};int max = numbers[0];for (int i = 1; i < numbers.length; i++) {if (numbers[i] > max) {max = numbers[i];}}System.out.println("最大值为:" + max);}
}
2. 找出数组的最小值
与找最大值的方法类似,使用Math.min()方法。
public class ArrayMin {public static void main(String[] args) {int[] numbers = {1, 4, 2, 5, 3};int min = numbers[0];for (int i = 1; i < numbers.length; i++) {if (numbers[i] < min) {min = numbers[i];}}System.out.println("最小值为:" + min);}
}
3. 排序数组
可以使用冒泡排序、选择排序等方法。
示例(冒泡排序):
public class BubbleSort {public static void main(String[] args) {int[] numbers = {5, 4, 3, 2, 1};for (int i = 0; i < numbers.length - 1; i++) {for (int j = 0; j < numbers.length - i - 1; j++) {if (numbers[j] > numbers[j + 1]) {int temp = numbers[j];numbers[j] = numbers[j + 1];numbers[j + 1] = temp;}}}System.out.println("排序后:");for (int num : numbers) {System.out.print(num + " ");}}
}
4. 反转数组
使用双指针法或 streams反转。
示例(双指针法):
public class ReverseArray {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};for (int i = 0; i < numbers.length / 2; i++) {int temp = numbers[i];numbers[i] = numbers[numbers.length - 1 - i];numbers[numbers.length - 1 - i] = temp;}System.out.println("反转后:");for (int num : numbers) {System.out.print(num + " ");}}
}
四、数组的高级操作
1. 删除数组元素
通过索引指定位置删除元素。
public class RemoveElement {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};// 删除第三个元素(索引为2)System.arraycopy(numbers, 0, numbers, 3, numbers.length - 3);System.out.println("删除后:");for (int num : numbers) {System.out.print(num + " ");}}
}
2. 插入数组元素
使用Array.insert()方法或直接赋值。
public class InsertElement {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};// 在索引为4的位置插入6numbers.insert(numbers.length - 1, 6);System.out.println("插入后:");for (int num : numbers) {System.out.print(num + " ");}}
}
3. 替换数组元素
直接修改特定位置的值。
public class ReplaceElement {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};// 将索引为2的位置替换为6numbers[2] = 6;System.out.println("替换后:");for (int num : numbers) {System.out.print(num + " ");}}
}
五、数组的遍历与检查
1. 检查数组是否为空
public class CheckEmpty {public static void main(String[] args) {int[] empty = new int[0];boolean isEmpty = true;for (int i = 0; i < empty.length; i++) {isEmpty = false;break;}System.out.println("数组是否为空:" + isEmpty);}
}
2. 检查元素是否存在
public class ContainsElement {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};boolean contains6 = false;for (int num : numbers) {if (num == 6) {contains6 = true;break;}}System.out.println("数组中是否含有6:" + contains6);}
}
六、数组的优化与注意事项
1. 避免重复遍历
使用for-each循环代替传统的for循环,简化代码。
public class ForEachLoop {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};for (int num : numbers) {System.out.println(num);}}
}
2. 使用Arrays类
Java 7以后,java.util.Arrays提供了许多数组操作的方法,如排序、查找等。
示例(求数组中第一个重复元素):
import java.util.Arrays;public class ArraysDemo {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5, 1};String result = "";for (int i = 0; i < numbers.length - 1; i++) {if (Arrays.equals(numbers, Arrays.copyOfRange(numbers, 0, i + 1))) {result += Integer.toString(numbers[i]) + "是第一个重复元素\n";break;}}System.out.println(result);}
}
3. 处理空数组
在操作数组时,需要注意数组是否为空。
总结
通过本文的学习,你可以掌握以下内容:
- 数组的基本定义和初始化方式。
- 遍历、访问和修改数组元素的方法。
- 常见的数组操作,如排序、查找、删除、插入等。
- 使用
Arrays类进行高级数组操作。
数组是Java中非常基础但也是非常强大的数据结构,熟练掌握数组的操作对于后续学习其他复杂的数据结构(如链表、栈、队列)具有重要意义。
相关文章:
学习Java数组操作:从基础到高级技巧详解
在Java编程中,数组是一种非常基础且常用的非 primitives 数据结构,它用于存储一组相同类型的值。无论是数据处理、遍历还是其他操作,数组都是一个不可或缺的工具。本文将从数组的基本概念开始,逐步介绍常用的操作方法,…...
算法题(79):两个数组的交集
审题: 本题需要我们查找两个给定数组的无重复数据交集,并以数组的形式返回 思路: 方法一:set 之前我们学习过unordered_set的使用,但是unordered_set是无序的,而这里我们的比对算法需要有序数据,…...
TFChat:腾讯大模型知识引擎+飞书机器人实现AI智能助手
效果 TFChat项目地址 https://github.com/fish2018/TFChat 腾讯大模型知识引擎用的是DeepSeek R1,项目为sanic和redis实现,利用httpx异步处理流式响应,同时使用buffer来避免频繁调用飞书接口更新卡片的网络耗时。为了进一步减少网络IO消耗&…...
Linux红帽:RHCSA认证知识讲解(四)修改远程配置文件,取消root禁用,便于使用root身份远程
Linux红帽:RHCSA认证知识讲解(四)修改远程配置文件,取消root禁用,便于使用root身份远程 前言一、远程连接的用途和原因二、通过 ssh 远程登陆系统三、默认限制及解决方案(一)非常规方法一&#…...
验证码介绍及生成与验证(HTML + JavaScript实现)
验证码介绍及生成与验证(HTML JavaScript实现) 验证码 验证码(全自动区分计算机和人类的图灵测试,CAPTCHA ,Completely Automated Public Turing test to tell Computers and Humans A…...
文心一言AI创意画
介绍 文心一言是百度推出的新一代知识增强大语言模型,属于文心大模型家族的新成员。它能够与人对话互动、回答问题、协助创作,高效便捷地帮助人们获取信息、知识和灵感。 特点 文心一言基于数万亿数据和数千亿知识进行融合学习,采用预训…...
WebRTC解析
一、WebRTC 协议概述 WebRTC(Web Real-Time Communication)是由 Google 发起并成为 W3C 标准的实时音视频通信技术,核心特点: 零插件:浏览器原生支持端到端加密(SRTP DTLS)P2P 优先架构&…...
升级Office软件后,Windows 系统右键里没有新建Word、Excel、PowerPoint文件的解决办法
我办公用的电脑,Office 2013 已经用了好多年,最近突发奇想给升级到了 Ofiice 2024。升级过程还蛮顺利的,但是安装完成后,发现点右键里没有新建Word、Excel、PowerPoint,开始菜单里 Word、Excel、PowerPoint 使用都正常…...
车载DoIP诊断框架 --- 连接 DoIP ECU/车辆的故障排除
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...
洛谷每日1题-------Day4__陶陶摘苹果
# P1046 [NOIP 2005 普及组] 陶陶摘苹果 ## 题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 $10$ 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 $30$ 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩…...
萌新学 Python 之模块管理
模块就是一个 python 代码文件,模块可以包含函数、类,可以提高代码复用率提高效率 python 模块主要分为三种: 1.内置模块:python 自带的模块,导入后可以直接使用,比如 import 模块名 2.第三方模块&#…...
6.3 - UART串口数据发送之中断
文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验使用中断方式实现UART串口数据的连续发送。 2 系统框图 参见6.1。 3 软件设计 注意事项: 系统上电、程序下载后,此时TX FIFO虽然为空,但并不会触发空中断;空中断…...
Fisher信息矩阵(Fisher Information Matrix, FIM)与自然梯度下降:机器学习中的优化利器
Fisher信息矩阵与自然梯度下降:机器学习中的优化利器 在机器学习尤其是深度学习中,优化模型参数是一个核心任务。我们通常依赖梯度下降(Gradient Descent)来调整参数,但普通的梯度下降有时会显得“笨拙”,…...
Mysql基础-多表查询(详细版)
目录 一、表的关系类型与适用场景二、连接方式与使用场景三、易错点与注意事项四、总结 一、表的关系类型与适用场景 1. 一对一关系 场景:一个表的记录对应另一个表的唯一记录 案例:用户表 用户详情表 CREATE TABLE users (id INT PRIMARY KEY,name…...
港科大提出开放全曲音乐生成基础模型YuE:可将歌词转换成完整歌曲
YuE是港科大提出的一个开源的音乐生成基础模型,专为音乐生成而设计,专门用于将歌词转换成完整的歌曲(lyrics2song)。它可以生成一首完整的歌曲,时长几分钟,包括朗朗上口的声乐曲目和伴奏曲目。YuE 能够模拟…...
Python学习第十七天之PyTorch保姆级安装
PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网,找到安装指令 5. 验证pytorch是否安装成功 四、…...
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package...
什么是 Java 中的线程安全?
回答 Java 中的线程安全(Thread Safety)指的是在多线程环境下,当多个线程同时访问和操作共享资源(如对象、变量、数据结构等)时,能够保证程序的正确性,不会出现数据不一致、竞争条件࿰…...
计算机视觉(opencv-python)入门之图像的读取,显示,与保存
在计算机视觉领域,Python的cv2库是一个不可或缺的工具,它提供了丰富的图像处理功能。作为OpenCV的Python接口,cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV CV2常用图像处理方…...
QT:Graphics View的坐标系介绍
在 Qt 的 Graphics View 框架中,存在三种不同的坐标系,分别是 物品坐标系(Item Coordinates)、场景坐标系(Scene Coordinates) 和 视图坐标系(View Coordinates)。这三种坐标系在图形…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
