【数组知识的扩展①】

在这里插入图片描述
](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)

🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法
💫个人格言:“没有罗马,那就自己创造罗马~”

ArrayList在Java数组中的使用技巧

这篇博客灵感来源于某一天Aileen(🤫)遇到了一道数组合并的题,于是她按照自己的思路把这道题的解题过程写了下来,如下图所示:

在这里插入图片描述

她的想法是想把奇数和偶数分别用两个数组装起来再把它们合并在一个新的数组里面But她尝试通过编写代码实现自己的想法,如下:
import java.util.Arrays;
public class Work11_1 {public static  String reverse(int[] arr){//创建一个空数组装所有元素int[] all = new int[]{};//创建一个空数组装偶数int[] evenarr = new int[]{};//创建一个空数组装奇数int[] oddarr = new int[]{};for (int i = 0; i < arr.length; i++) {if (arr[i] % 2 == 0) {evenarr[i] = arr[i];}else{oddarr[i] = arr[i];}}System.arraycopy(oddarr,0,all,0,oddarr.length);return Arrays.toString(all);}public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5,6};System.out.println(reverse(array));}

运行结果:

在这里插入图片描述

通过报错信息我们可以知道,她的代码存在着一些问题:
数组在初始化时(即:`all` ,`evenarr`,`oddarr`的创建)未给它们分配大小,导致后面我们其实是无法向这些数组里面添加元素的,中国有句古话“强扭的瓜不甜”,即使我们强制给他们添加新元素,这也是徒劳,最终就会看到控制台那句报错信息写的:数组越界异常~

在这里插入图片描述

她为了解决这个问题,在Java中找到了一个内置类,即 `ArrayList` , 下面我们将进入ArrayList的学习:

ArrayList:这个类是Java内置的一个类它继承了Java中的AbstractList并实现了List接口。他是一个可以动态修改的数组,与普通数组相比,他没有固定大小的限制,我们可以通过它进行添加或删除元素。

import java.util.ArrayList;public class ArrList {public static void main(String[] args) {// 创建一个 mylist 存储字符串ArrayList<String> mylist = new ArrayList<>();System.out.println("---添加----------------------------------------------------------------------");// 添加元素mylist.add("Apple");mylist.add("Banana");mylist.add("Cherry");System.out.println(mylist);System.out.println("---访问------------------------------------------------------------------------");//使用 get() 方法访问ArrayList中的元素System.out.println(mylist.get(2));//访问第三个元素System.out.println("---修改------------------------------------------------------------------------");//set() 方法修改ArrayList中的元素mylist.set(0,"youzi");//第一个参数为索引位置,第二个是要修改的值System.out.println(mylist);System.out.println("---删除------------------------------------------------------------------------");//remove() 方法删除ArrayList中的元素mylist.remove(2);//删除第三个元素System.out.println(mylist);System.out.println("---计算大小------------------------------------------------------------------------");System.out.println( mylist.size());System.out.println("---迭代打印数组列表------------------------------------------------------------------------");for (int i = 0; i < mylist.size(); i++) {System.out.println(mylist.get(i));}System.out.println("---使用for-each打印数组列表------------------------------------------------------------------------");for (String fruit:mylist) {System.out.println(fruit);}}
}

打印结果:
在这里插入图片描述

让我们把上面学到的ArrayList类的方法用到我们解决这道题的思路上吧~

学以致用

使用ArrayList(单线程常用)解决问题

import java.util.ArrayList;
import java.util.Arrays;
public class Work11_1 {public static String reverse(int[] arr) {//创建两个 Integer 类型的 ArrayList 数组用于储存 奇数和偶数 的数组//偶数数组ArrayList<Integer> evenList = new ArrayList<>();//奇数数组ArrayList<Integer> oddList = new ArrayList<>();//遍历数组,将对应的元素放到对应的数组里面for (int i=0; i < arr.length ; i++){if (arr[i] % 2 == 0) {evenList.add(arr[i]);//将偶数元素装入其对应数组}else{oddList.add(arr[i]);//将奇数元素装入其对应数组}}//创建合并后的数组int [] all = new int[evenList.size()+ oddList.size()];//将奇数数组复制到合并后的数组for (int i = 0; i < oddList.size() ; i++) {all[i] = oddList.get(i);}//将偶数数组复制到合并后的数组for (int i = 0; i < evenList.size(); i++) {all[oddList.size()+i] = evenList.get(i);}return  Arrays.toString(all);}public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5,6};System.out.println(reverse(array));}}
我们通过使用ArrayList这个动态数组能够提高读`get()`写`add()`、`set()`操作的高效性,并且其内存开销比较小,因为它不会每次修改创建数组的副本。However`ArrayList`不是线程安全的,在多线程环境中,如果多个线程同时对同一个`ArrayList`修改,可能会导致数据不一致,或者抛出异常,如果想在多线程环境中使用`ArrayList`.需要手动同步,但它会增加代码的复杂性和错误的风险。

使用CopyOnWriteArrayList(多线程适用)解决问题

import java.util.Arrays;
import java.util.concurrent.CopyOnWriteArrayList;public class Work11_1 {public static String reverse(int[] arr) {// 使用 CopyOnWriteArrayList 来存储奇数和偶数CopyOnWriteArrayList<Integer> evenList = new CopyOnWriteArrayList<>();CopyOnWriteArrayList<Integer> oddList = new CopyOnWriteArrayList<>();// 遍历输入数组,将奇数和偶数分别放入不同的列表for (int i = 0; i < arr.length; i++) {if (arr[i] % 2 == 0) {evenList.add(arr[i]); // 偶数} else {oddList.add(arr[i]); // 奇数}}// 创建合并后的数组int[] all = new int[evenList.size() + oddList.size()];// 将奇数列表复制到合并后的数组for (int i = 0; i < oddList.size(); i++) {all[i] = oddList.get(i);}// 将偶数列表复制到合并后的数组for (int i = 0; i < evenList.size(); i++) {all[oddList.size() + i] = evenList.get(i);}// 返回合并后的数组的字符串表示return Arrays.toString(all);}public static void main(String[] args) {int[] array = new int[]{1, 2, 3, 4, 5, 6};System.out.println(reverse(array));}
}

Java中for-each的使用

基本语法

for (元素类型 变量名 : 数组或集合){//这里编写对变量的操作
}

具体实例

public class ForEach {public static void main(String[] args) {int[] numbers = {1,2,3,4,5};//使用for-each循环遍历数组//通过变量num遍历数组numbers里面的每一个元素for(int num : numbers){System.out.print(num+" ");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/882907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 文件防感染扫描

一、安装 首先&#xff0c;你需要安装 secplugs-python-client 库。你可以通过 pip 命令来安装&#xff1a; pip install secplugs-python-client确保你的 Python 环境已经正确设置&#xff0c;并且网络连接畅通&#xff0c;以便能够顺利安装。 二、基本用法 1. 初始化客户…

First - Word Fall - Through ( FWFT ) Read Operation

When looking at Xilinx 8 Kintex-7 4 FPGAs memory resources 32, you’ll find that its FIFO generators support two modes of read options - standard read operating and FWFT read operation. What is FWFT? FWFT is a acronym for First-Word Fall-Through. It is g…

【记录】Windows|Windows 修改字体大全(Windows 桌面、VSCode、浏览器)

【记录】Windows&#xff5c;Windows 修改字体大全&#xff08;Windows 桌面、VSCode、浏览器&#xff09; 前言 最近从学长那里发现了一款非常美观的衡水体字体——Maple Mono SC NF。您可以通过以下链接下载该字体&#xff1a;https://github.com/subframe7536/maple-font/…

TiDB替换Starrocks:业务综合宽表迁移的性能评估与降本增效决策

作者&#xff1a; 我是人间不清醒 原文来源&#xff1a; https://tidb.net/blog/6638f594 1、 场景 业务综合宽表是报表生成、大屏幕展示和数据计算处理的核心数据结构。目前&#xff0c;这些宽表存储在Starrocks系统中&#xff0c;但该系统存在显著的性能瓶颈。例如&#…

Vue组件开发的属性

组件开发的属性&#xff1a; 1.ref属性&#xff1a; 如果在vue里&#xff0c;想要获取DOM对象&#xff0c;并且不想使用JS的原生语法&#xff0c;那么就可以使用ref属性 ref属性的用法&#xff1a; 1&#xff09;在HTML元素的开始标记中&#xff0c;或者在Vue子组件中的开始…

JVM、字节码文件介绍

目录 初识JVM 什么是JVM JVM的三大核心功能 JVM的组成 字节码文件的组成 基础信息 Magic魔数 主副版本号 其它基础信息 常量池 字段 方法 属性 字节码常用工具 javap jclasslib插件 阿里Arthas 初识JVM 什么是JVM JVM的三大核心功能 1. 解释和运行虚拟机指…

我的世界之合成

合成&#xff08;Crafting&#xff09;是一种在Minecraft中获得多种方块、工具和其他资源的方法。合成时&#xff0c;玩家必须先把物品从物品栏移入合成方格中。22的简易合成方格可以直接在物品栏中找到&#xff0c;而33的合成方格需要使用工作台或合成器来打开。 目录 1合成系…

当数据遇到威胁:强化治理以抵御网络攻击

当数据遇到威胁&#xff1a;强化治理以抵御网络攻击 在当今这个信息化高速发展的时代&#xff0c;数据已成为企业乃至国家的核心资产。无论是金融交易、医疗健康、个人隐私&#xff0c;还是国家安全信息&#xff0c;都依赖于数字系统的存储与传输。然而&#xff0c;随着数据价…

LabVIEW智能螺杆空压机测试系统

基于LabVIEW软件开发的螺杆空压机测试系统利用虚拟仪器技术进行空压机的性能测试和监控。系统能够实现对螺杆空压机关键性能参数如压力、温度、流量、转速及功率的实时采集与分析&#xff0c;有效提高测试效率与准确性&#xff0c;同时减少人工操作&#xff0c;提升安全性。 项…

Ubuntu22.04 制作系统ISO镜像

第一步&#xff1a;安装软件-Systemback 1.如果已经添加过ppa&#xff0c;可以删除重新添加或者跳过此步 sudo add-apt-repository --remove ppa:nemh/systemback 2.添加ppa 我是ubuntu20&#xff0c;但这个软件最后支持的是 ubuntu16.04版本&#xff0c;所以加一个16版本…

C++ | Leetcode C++题解之第480题滑动窗口中位数

题目&#xff1a; 题解&#xff1a; class DualHeap { private:// 大根堆&#xff0c;维护较小的一半元素priority_queue<int> small;// 小根堆&#xff0c;维护较大的一半元素priority_queue<int, vector<int>, greater<int>> large;// 哈希表&#…

LeetCode53:最大子数组和

题目链接&#xff1a;53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 代码如下 class Solution { public:int maxSubArray(vector<int>& nums) {//dp含义&#xff1a;dp[i]是以nums[i]结尾的最大连续子数组//if(nums[i] > nums[i - 1])//dp[i] dp[i…

MySQL 中如何优化 DISTINCT 查询:基于 Java 的实践与应用

全文目录&#xff1a; 开篇语前言摘要简介概述1. 使用索引优化2. 限制选择字段3. 使用 GROUP BY 替代 DISTINCT 核心源码解读Java代码示例&#xff1a;优化DISTINCT查询代码说明 案例分析案例一&#xff1a;数据去重优化 应用场景演示场景一&#xff1a;日志数据去重场景二&…

Tftpd.exe源代码分析----TftpdIoPostReceiveBuffer函数分析

第一部分&#xff1a; TftpdIoAssignSocket函数调用了TftpdIoInitializeSocketContext函数 TftpdIoInitializeSocketContext函数注册了回调函数TftpdIoReadNotification void TftpdIoInitializeSocketContext(PTFTPD_SOCKET socket, PSOCKADDR_IN addr, PTFTPD_CONTEXT conte…

学SQL第一天

一&#xff0c;SQL指结构化查询语言&#xff0c;全称是Structured Query Language。 SQL可以访问和处理数据库&#xff0c;包括数据查询&#xff0c;插入&#xff0c;更新和删除。 SQL可以创建新数据库&#xff0c;新的表和创建存储过程。 sql语句分为四类 DDL数据定义语言 …

自动化测试实施过程中需要考虑的因素!

自动化测试是软件开发过程中不可或缺的一部分&#xff0c;它能够提高测试效率、减少人力成本&#xff0c;并确保软件质量的一致性。然而&#xff0c;自动化测试的实施并非没有挑战。为了确保自动化测试的有效性和可持续性&#xff0c;开发者需要综合考虑多种因素&#xff0c;包…

【CTF-SHOW】Web入门 Web14 【editor泄露-详】【var/www/html目录-详】

editor泄露问题通常出现在涉及文件编辑器或脚本编辑器的题目中&#xff0c;尤其是在Web安全或Pwn&#xff08;系统漏洞挖掘&#xff09;类别中。editor泄露的本质是由于系统未能妥善处理临时文件、编辑历史或进程信息&#xff0c;导致攻击者可以通过某种途径获取正在编辑的敏感…

Spring Security 如何进行权限验证

阅读本文之前&#xff0c;请投票支持这款 全新设计的脚手架 &#xff0c;让 Java 再次伟大&#xff01; FilterSecurityInterceptor FilterSecurityInterceptor 是负责权限验证的过滤器。一般来说&#xff0c;权限验证是一系列业务逻辑处理完成以后&#xff0c;最后需要解决的…

EasyOCR——超强超便捷的OCR开源算法介绍与文本检测模型CRAFT微调方法

背景 最近在实际操作阿拉伯文小语种OCR功能的时候&#xff0c;尝试了诸多开源算法&#xff0c;但效果均不尽如人意。 说实在的&#xff0c;针对阿拉伯文的OCR开源算法&#xff0c;若仅仅是效果没那么优秀&#xff0c;比如识别率能有个70%80%&#xff0c;我还能微调微调&#…

【React系列三】—React学习历程的分享

一、组件实例核心—Refs 通过定义 ref 属性可以给标签添加标识 字符串形式的Refs 这种形式已经不再推荐使用&#xff0c;官方不建议使用 https://zh-hans.legacy.reactjs.org/docs/refs-and-the-dom.html#legacy-api-string-refs 回调形式的Refs <script type"te…