Java中 普通for循环, 增强for循环( foreach) List中增删改查的注意事项
文章目录
- 俩种循环
- 遍历
- 增加
- 删除
- 1 根据index删除
- 2 根据对象删除
- 修改
俩种循环
Java中 普通for循环, 增强for循环( foreach) 俩种List的遍历方式有何异同,性能差异?
普通for循环(使用索引遍历):
for (int i = 0; i < list.size(); i++) { Object item = list.get(i); // 处理item
}
这是最基本的遍历方式,它使用索引来访问列表中的每一个元素。
增强for循环(也称为“foreach”循环):
for (Object item : list) { // 处理item
}
这种循环在Java 5中被引入,作为对集合遍历的语法糖。在内部,它仍然使用Iterator,但语法更为简洁。很多开发者也称之为“foreach”循环,但实际上在Java中并没有名为“foreach”的关键字;这是C#中的一个关键字。在Java中,这只是增强for循环的一种常见称呼。
异同点:
普通for循环:
需要显式地通过索引来访问元素。
可以方便地访问和修改当前索引位置的元素。
对于List的随机访问操作,性能是高效的,因为ArrayList等基于数组的列表支持快速的随机访问。
增强for循环:
语法简洁,不需要关心索引。
只能访问元素,不能方便地修改元素(除非元素是可变的对象,并且你修改了对象的内部状态)。
在内部,它使用Iterator,所以对于不支持快速随机访问的数据结构(如LinkedList),它的性能可能更优。
性能差异:
对于ArrayList等基于数组的列表:普通for循环通常会比增强for循环稍微快一点,因为它直接通过索引访问元素,避免了Iterator的开销。但这种差异在大多数情况下是微不足道的,除非列表非常大或者这段代码是性能瓶颈。
对于LinkedList等不支持快速随机访问的列表:增强for循环可能会更有优势,因为它内部使用Iterator,这与LinkedList的迭代访问方式相匹配。
遍历
ArrayList 情况下,普通for循环遍历就是最基础的for循环,而foreach底层是使用迭代器。
增加
删除
1 根据index删除
List<String> list = new ArrayList<>(4);list.add("a");list.add("ab");list.add("abc");list.add("abcd");
//错误方式 根据下标remove 数组形式 普通for循环for (int i = 0; i < list.size(); i++) {if (list.get(i).contains("a")) {list.remove(i);}}
[ab, abcd]
读者可能回想,怎么不是空的list呢?不妨让我们看下remove这个方法。(这个是ArrayList 里面的实现)
public E remove(int index) {rangeCheck(index);modCount++;E oldValue = elementData(index);int numMoved = size - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its workreturn oldValue;}
其中
System.arraycopy(elementData, index+1, elementData, index,numMoved);
拿i=0举例,原来的list = [a,ab,abc,abcd], 执行一次remove后, arraycopy将[a,ab,abc,abcd] 的后三个前移一位,把第一位覆盖,这是数组删除元素的方式。这样一来,原list就变成[ab,abc,abcd],第二次循环的时候i=1,此时list.get(1) = abc,直接跳过了ab,所以最后没有达到我们预期的空[].
正确的做法是使用迭代器
//正确方式 迭代器Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {if (iterator.next().contains("a")) {// 删除元素iterator.remove();}}
2 根据对象删除
//根据对象删除List<String> list2 = new ArrayList<>();list2.add("111");list2.add("222");list2.add("222");list2.add("333");
正确 普通for循环
//for (int i = 0; i <list2.size(); i++) {list2.remove("222");}
错误,增强for循环 抛异常
//for (String s : list2) {list2.remove("222");}
原因:
迭代器内部的每次遍历都会记录List内部的modcount当做预期值,然后在每次循环中用预期值与List的成员变量modCount作比较,但是普通list.remove调用的是List的remove,这时modcount++,但是iterator内记录的预期值并没有变化,所以会报错。
如果想要删除元素的话需要使用迭代器内部的remove方法。
修改
foreach不可以删除/修改集合元素,而for可以
foreach和for都可以修改元素(对象)里面的属性
相关文章:
Java中 普通for循环, 增强for循环( foreach) List中增删改查的注意事项
文章目录 俩种循环遍历增加删除1 根据index删除2 根据对象删除 修改 俩种循环 Java中 普通for循环, 增强for循环( foreach) 俩种List的遍历方式有何异同,性能差异? 普通for循环(使用索引遍历): for (int…...
昇思25天学习打卡营第19天|LSTM+CRF序列标注
概述 序列标注指给定输入序列,给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取,包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场(…...
微服务: 初识 Spring Cloud
什么是微服务? 微服务就像把一个大公司拆成很多小部门,每个部门各自负责一块业务。这样一来,每个部门都可以独立工作,即使一个部门出了问题,也不会影响整个公司运作。 什么是Spring Cloud? Spring Cloud 是一套工具包&#x…...
探索InitializingBean:Spring框架中的隐藏宝藏
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ 👋 Spring框架的浩瀚海洋中&#x…...
JVM专题之垃圾收集算法
标记清除算法 第一步:标记 (找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间) 缺点: 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需 要分配较大对象时,无法找到…...
2024年6月后2周重要的大语言模型论文总结:LLM进展、微调、推理和对齐
本文总结了2024年6月后两周发表的一些最重要的大语言模型论文。这些论文涵盖了塑造下一代语言模型的各种主题,从模型优化和缩放到推理、基准测试和增强性能。 LLM进展与基准 1、 BigCodeBench: Benchmarking Code Generation with Diverse Function Calls and Com…...
大数据面试题之数仓(1)
目录 介绍下数据仓库 数仓的基本原理 数仓架构 数据仓库分层(层级划分),每层做什么?分层的好处? 数据分层是根据什么? 数仓分层的原则与思路 知道数仓建模常用模型吗?区别、优缺点? 星型模型和雪花模型的区别?应用场景?优劣对比 数仓建模有哪些方式…...
[机器学习]-4 Transformer介绍和ChatGPT本质
Transformer Transformer是由Vaswani等人在2017年提出的一种深度学习模型架构,最初用于自然语言处理(NLP)任务,特别是机器翻译。Transformer通过自注意机制和完全基于注意力的架构,核心思想是通过注意力来捕捉输入序列…...
基于深度学习的电力分配
基于深度学习的电力分配是一项利用深度学习算法优化电力系统中的电力资源分配、负荷预测、故障检测和系统管理的技术。该技术旨在提高电力系统的运行效率、稳定性和可靠性。以下是关于这一领域的系统介绍: 1. 任务和目标 电力分配的主要任务是优化电力系统中的电力…...
飞书 API 2-4:如何使用 API 将数据写入数据表
一、引入 上一篇创建好数据表之后,接下来就是写入数据和对数据的处理。 本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇(飞书 API 2-4)创建的数据表进行操作。上面最终的数据表只有 2 个字段:序号和邮箱。序…...
系统设计题-日活月活统计
一、题目描述 根据访问日志统计接口的日活和月活。日志格式为 yyyy-mm-dd|clientIP|url|result 其中yyyy-mm-dd代表年月日,一个日志文件中时间跨度保证都在同一个月内,但不保证每行是按照日期顺序。 clientIP为合法的点分十进制ipv4地址(1.1.1.1和1.01.…...
在CentOS7云服务器下搭建MySQL网络服务详细教程
目录 0.说明 1.卸载不要的环境 1.1查看当前环境存在的服务mysql或者mariadb 1.2卸载不要的环境 1.2.1先关闭相关的服务 1.2.2查询曾经下载的安装包 1.2.3卸载安装包 1.2.4检查是否卸载干净 2.配置MySQLyum源 2.1获取mysql关外yum源 2.2 查看当前系统结合系统配置yum…...
【数据结构与算法】快速排序霍尔版
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ...
无人机5公里WiFi低延迟图传模组,抗干扰、长距离、低延迟,飞睿智能无线通信新标杆
在科技日新月异的今天,我们见证了无数通信技术的飞跃。从开始的电报、电话,到如今的4G、5G网络,再到WiFi的广泛应用,每一次技术的革新都极大地改变了人们的生活方式。飞睿智能5公里WiFi低延迟图传模组,它以其独特的优势…...
Kappa架构
1.Kappa架构介绍 Kappa架构由Jay Kreps提出,不同于Lambda同时计算和批计算并合并视图,Kappa只会通过流计算一条的数据链路计算并产生视图。Kappa同样采用了重新处理事件的原则,对于历史数据分析类的需求,Kappa要求数据的长期存储能…...
护网在即,助力安服仔漏洞扫描~
整合了个漏扫系统,安服仔必备~ 使用场景 网前布防,漏洞扫描,资产梳理 使用方法: 启动虚拟机后运行命令: ./StartSystemScript.sh 输入密码attack 启动完成后浏览器打开网站: http://IP:5000 相关账户…...
3C电子制造行业MES系统,提高企业生产效率
随着科技的不断进步,3C电子制造行业正迎来传统工厂向数字化工厂转型的阶段。在这场变革中,MES系统发挥着重要的作用,成为了企业变革的“智慧大脑”,引领着生产流程的优化和升级。 那么,MES系统究竟有哪些功能…...
C++ 多态和虚函数
参考C:多态 详解_c多态-CSDN博客 C多态——虚函数_c的a* a new b()是什么意思-CSDN博客 一.多态的概念 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如 Student 继承了 Person。 Person 对象买票全价,…...
七月记录上半
7.5 运行mysql脚本 mysql -u root -p 数据库名 < 脚本名 7.6 使用screen在服务器后台长期运行一个程序: screen -S 窗口名:创建窗口 执行程序脚本 ctrlad:退出窗口 screen -ls :查看所有窗口 screen -r 窗口号 &#…...
Wing FTP Server
文章目录 1.Wing FTP Server简介1.1主要特点1.2使用教程 2.高级用法2.1Lua脚本,案例1 1.Wing FTP Server简介 Wing FTP Server,是一个专业的跨平台FTP服务器端,它拥有不错的速度、可靠性和一个友好的配置界面。它除了能提供FTP的基本服务功能以外&#…...
OpenCV需要的Numpy知识
图像 NumPy 数组彩色图:(高度, 宽度, 3)灰度图:(高度, 宽度)像素值:0~255,类型 uint8下面所有内容,都围绕这句话。1. 创建数组1.1 np.array () —— 把列表变成数组import numpy as np a np.array([1, 2, 3]) b …...
重磅更新!Pydantic AI 引入在线 Eval 与 MCP 控制,Agent 落地难的问题正在被解决
Agent 开发进入“深水区”:pydantic-ai v1.74.0 释放了什么信号?在 AI 应用开发的圈子里,一直存在一个尴尬的现象:写一个能跑的 Chatbot Demo 只需要一下午,但要把这个 Demo 变成稳定可靠的生产级应用,可能…...
数字记忆争夺战:WechatDecrypt本地解密技术实现与场景化应用指南
数字记忆争夺战:WechatDecrypt本地解密技术实现与场景化应用指南 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 问题溯源:当数字记忆遭遇加密牢笼 从一则数据丢失案例说起 张先…...
避坑指南:OpenClaw安装Qwen3-4B镜像的5大常见错误
避坑指南:OpenClaw安装Qwen3-4B镜像的5大常见错误 1. 为什么需要这份避坑指南 上周我在本地部署OpenClaw对接Qwen3-4B镜像时,连续踩了三个坑:先是npm版本冲突导致安装失败,接着模型地址格式写错导致连接超时,最后又遇…...
探索法律AI深度应用:在快马平台集成多模型驱动openlaw智能法律问答助手
最近在做一个法律AI相关的项目,发现用AI辅助开发法律问答系统真的能大幅提升效率。这里分享一下我在InsCode(快马)平台上搭建智能法律问答原型的经验,整个过程特别适合想尝试法律科技的朋友。 项目背景与需求分析 法律咨询场景中,用户的问题往…...
Nunchaku-flux-1-dev性能调优:针对STM32嵌入式设备演示的图片预处理
Nunchaku-flux-1-dev性能调优:针对STM32嵌入式设备演示的图片预处理 最近在折腾一个智能门禁项目,需要在STM32上跑人脸识别。想法挺简单,本地抓拍人脸,然后传给云端的大模型Nunchaku-flux-1-dev去分析。结果一上手就发现…...
双向互转|IEC104↔Modbus 工业网关,电力 / 工业现场一键通联
一、产品核心定位三格电子推出SG-IEC104-TCP与SG-TCP-IEC104两款工业级网关,专为电力、能源、智能制造场景打造,实现IEC104 与 Modbus 双向协议转换,兼容 DLT645 电表采集,支持 MQTT 上云,打通电力主站与现场设备的数据…...
(28)UE 里在树视图等里点击条目,会触发三个事件,先是 entry里的用户列表接口里的事件,再是树视图里的事件
(51)(52) 谢谢...
如何快速解密科学文库加密文档:终极免费解密工具指南
如何快速解密科学文库加密文档:终极免费解密工具指南 【免费下载链接】ScienceDecrypting 破解CAJViewer带有效期的文档,支持破解科学文库、标准全文数据库下载的文档。无损破解,保留文字和目录,解除有效期限制。 项目地址: htt…...
Qwen3.5-9B-AWQ-4bit与Claude对比评测:开源与闭源模型的技术选型
Qwen3.5-9B-AWQ-4bit与Claude对比评测:开源与闭源模型的技术选型 1. 评测背景与目标 在AI大模型领域,开源与闭源模型的选择一直是开发者面临的重要决策。本次评测聚焦于两款在开发者社区中备受关注的模型:开源的Qwen3.5-9B-AWQ-4bit和闭源的…...
