java ArrayList遍历删除效率对比

AD在建PCB封装时如何添加元器件的3D模型 3D模型 阅读详情
最近在程序中使用到了ArrayList的删除方法。

我知道list有两种迭代方式(Iterator,index)。我写了两个方法根据这两种迭代方式做删除操作,看哪种速度快一点

/** iterator方式删除
* @param list
* @param deleted
*/
private static void listRemoveByIterator(List<String> list, Set<String> deleted){

Iterator<String> it = list.iterator();
String string;
while (it.hasNext()) {
string = (String) it.next();
if(deleted.contains(string)){
it.remove();
}
}
}
/**index 方式删除
* @param list
* @param deleted
*/
private static void listRemoveByIndex(List<String> list, Set<String> deleted){

String string;
for(int i =0 ;i<list.size(); ){
string = list.get(i);
if(deleted.contains(string)){
list.remove(i);
} else {
i++;
}
}
}


经过100000000次运算我得到的数据如下:
通过index删除耗时:7555ms
通过Iterator删除耗时:10226ms
通过Index方式便利删除list速度更快一些。
有人会问list.size()每次计算会不会很耗时,其实是大可不必担心的。因为list.size()。本就是取的是ArrayList父类AbstractList的私有变量的值。ArrayList是基于迭代模式编写的类。懂其原理的应该都知道。


下面是我的测试类:


import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;




public class TestLIstRemove {

/**原始数据*/
private static List<String> list;
/** 想要从list中删除的数据*/
private static Set<String> deleted;
/** 开始结束事件定义*/
private static long startTime,endTime,baseTime;
/** 循环次数*/
private static int maxTimes = 100000000;

public static void main(String[] args) {

initData();
List <String> cpdList  = null;


/** 逻辑正确性测试*/
cpdList = new ArrayList<String>(list);
listRemoveByIterator(cpdList, deleted);
System.out.println("iterator方式删除输出结果:");
for(String e : cpdList){
System.out.print(e + " ");
}
System.out.println();

cpdList = new ArrayList<String>(list);
listRemoveByIndex(cpdList, deleted);
/** 逻辑正确性测试*/
System.out.println("index方式删除输出结果:");
for(String e : cpdList){
System.out.print(e + " ");
}
System.out.println();
System.out.println();

/** 运算速度测试*/

/** 创建对象耗时*/
startTime = System.currentTimeMillis();
for(int i=0; i<maxTimes;i++){
cpdList = new ArrayList<String>(list);
}
endTime = System.currentTimeMillis();
baseTime = endTime-startTime;
System.out.println("创建对象耗时:" + (baseTime)+"ms");

/** 通过index删除耗时*/
startTime = System.currentTimeMillis();
for(int i=0; i<maxTimes;i++){
cpdList = new ArrayList<String>(list);

listRemoveByIndex(cpdList, deleted);
}
endTime = System.currentTimeMillis();
System.out.println("通过index删除耗时:" + (endTime-startTime-baseTime)+"ms");


/** 通过Iterator删除耗时*/
startTime = System.currentTimeMillis();
for(int i=0; i<maxTimes;i++){
cpdList = new ArrayList<String>(list);

listRemoveByIterator(cpdList, deleted);
}
endTime = System.currentTimeMillis();


System.out.println("通过Iterator删除耗时:" + (endTime-startTime-baseTime)+"ms");
}

/**
* 初始化数据
*/
private static void initData(){
list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("e");
list.add("f");
list.add("g");
list.add("h");

deleted = new HashSet<String>();
deleted.add("h");
deleted.add("e");
}



/**index 方式删除
* @param list
* @param deleted
*/
private static void listRemoveByIndex(List<String> list, Set<String> deleted){

String string;
for(int i =0 ;i<list.size(); ){
string = list.get(i);
if(deleted.contains(string)){
list.remove(i);
} else {
i++;
}
}
}

/** iterator方式删除
* @param list
* @param deleted
*/
private static void listRemoveByIterator(List<String> list, Set<String> deleted){

Iterator<String> it = list.iterator();
String string;
while (it.hasNext()) {
string = (String) it.next();
if(deleted.contains(string)){
it.remove();
}
}
}
}


绕过ROS2!在RDK X5上直接用Python调用海康相机C++ SDK的避坑指南 本文详细介绍了在RDK X5上绕过ROS2,直接使用Python调用海康相机C++ SDK的轻量化方案。通过Cython构建Python绑定,提取海康相机SDK核心组件,实现高效图像采集。文章涵盖环境准备、Cython接口设计、编译系统配置及性能优化技巧,特别适合ARM64平台开发者。 阅读详情

相关推荐

微信小程序真机HTTPS证书链失效排查与修复指南

HTTPS证书信任链是保障Web通信安全的基础机制,其核心在于客户端能否通过服务器提供的证书及其上级签发者,逐级回溯至自身预置的可信根证书。在微信小程序场景中,由于客户端不复用系统根证书库,而是采用固化、精简且更新滞后的自研CA白名单,导致大量符合浏览器标准的证书(如Let’s Encrypt新版ISRG Root X1、TrustAsia等)在真机环境下触发net::ERR_CERT_AUTHORITY_INVALID错误。该问题本质是证书链断裂或签名算法/密钥长度不合规,而非域名配置或CORS策略异常。

weixin_33935636的博客 681

java arraylist 对象 删除_删除Java ArrayList中的对象 - 时间消耗

每次从ArrayList中删除一个元素时,它都必须将具有较大索引的所有元素向下移动一个插槽。假设您删除了7M元素列表的第一个元素 - 那么您也必须移动6,999,999个元素。如果您在循环中执行此操作,则需要O(n^2)时间,其中n是列表的大小。对于7M元素列表,这将是非常缓慢的。相反,如果您知道要提前删除哪些元素,则可以在一次传递中将所有元素向下移动:int dst = 0;for (int s...

weixin_33796891的博客 348

结合qtdesigner,用pyqtgraph在界面上绘制波形图(一)

思路:先画图,然后在qtdesigner上放一个容器,给这个容器添加一个布局,然后把图当作一个Widget放入布局中。二、PyUIC把test.ui转换成test.py,再新建一个load_test.py写脚本。就这么简单,基础部分就完成了。也可以给它添加样式,我知道的样式不算多,但会继续写。一、随便拖进来一个容器控件,我拖了一个Widget。要想把波形图显示在界面上,核心思想其实很简单。三、load_test.py的代码。

learninger_lt7的博客 1804

技巧:ArrayList删除元素时, 各种方法效率对比

import java.util.List; import java.util.ArrayList; public class ArrayListTest { /** * @param args */ public static void main(String[] args) { String str = "dai"; long start = S

novelly的专栏 4591

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

mizhiakk的博客 8426

代数拓扑与AI架构:AI应用架构师深入探索数学研究如何分析复杂系统的结构特性

随着人工智能技术的飞速发展,AI系统变得越来越复杂。AI应用架构师需要有效的工具和方法来理解、设计和优化这些复杂系统。代数拓扑作为数学的一个分支,提供了独特的视角和技术来分析复杂系统的结构特性。本文旨在帮助AI应用架构师深入了解代数拓扑,以及如何将其应用于AI架构设计中,提升对复杂系统的分析能力。首先,我们会介绍代数拓扑和AI架构相关的核心概念及其联系,通过有趣的故事引入主题,让读者轻松理解复杂概念。接着,深入探讨代数拓扑的核心算法原理,结合具体的编程语言代码示例详细阐述。

大模型应用工坊 671

[Java 集合]你确定 LinkedList 在新增/删除元素时,效率比 ArrayList 高?

能不能定位到问题

自由而不独立,仍是奴隶。 1047

鸿蒙应用发布实战:应用热更新的实现

在移动应用开发领域,应用更新是持续交付价值的关键环节。传统的应用更新方式需要用户手动下载完整安装包,不仅用户体验差,而且更新率往往不理想。热更新技术(也称为OTA更新)允许应用在不重新安装的情况下动态更新部分功能,极大提升了用户体验和迭代效率。本文专注于鸿蒙操作系统下的应用热更新实现方案,涵盖从原理到实践的完整知识体系。鸿蒙热更新的技术架构差分更新算法实现动态部署机制实际项目中的最佳实践安全与性能优化策略首先介绍鸿蒙热更新的背景和核心概念深入分析技术原理和算法实现。

操作系统内核探秘的博客 965

ArrayList中remove和clear及trimToSize的使用

今天在研究JDK11中的ArrayList源码的时候,偶然发现了一个以前没有注意过的东西,特立稿记之。 首先,先上一段代码: ArrayList<Integer> list = new ArrayList<>(3); list.add(1); list.add(2); list.add(3); list.remove(1); System.out.println(list.size()); list.add(100); System.out.println(list.siz

domiの博客 729

大疆视觉算法面试,手推极线几何这关刷掉了一半人

摘要:大疆机器视觉算法工程师面试重点考察目标检测工程优化、深度估计几何原理和视觉SLAM全流程。目标检测侧重模型压缩和部署优化,需掌握知识蒸馏、量化及算子融合;深度估计要求推导双目几何并理解单目深度恢复方法;视觉SLAM需熟悉前后端流程及ORB-SLAM3/VINS-Mono区别。面试常要求手推PnP等公式,注重实践能力。准备需重点练习公式推导和代码实现,掌握工程落地细节。

郑伟强dev的专栏 194

Spring Boot 集成 Spring AI:实现可被大模型调用的 MCP Server

本文介绍了如何利用Spring AI框架构建MCP Server,使大模型能够调用业务系统的接口。主要内容包括:1)MCP协议简介,分为MCP Server和Client两部分;2)环境配置要求,需Java 17+和Spring Boot 3.5.0+;3)实现步骤,通过@McpTool注解将Service方法暴露给大模型调用;4)使用Cherry Studio作为MCP Client测试效果,成功实现订单查询和下单功能。本文仅实现MCP Server部分,后续将介绍如何开发MCP Client。

iioSnail的博客 2129

java循环遍历List时删除元素总结

在日常代码中,遍历List然后删除特定的元素是很常见的操作,Java中的循环主要有普通的for循环、增加for循环、iterator遍历这几种方法,我们知道在循环list时删除元素可能引起异常,这里总结下什么情况下会引起异常,什么情况不会引起异常。 1.for循环正序遍历list for(int i=0;i<list.size();i++){ if(list.get(i).e...

ws6013480777777的博客 1293

[特殊字符] 2026终极实战:Python爬取得物App球鞋实时交易价格 —— 从签名破解到数据可视化全栈指南

价格敏感度:热门鞋款(如Air Jordan 1、Yeezy 350、Dunk SB)价格每分钟都在波动,短线套利空间巨大。稀缺性:限量发售、联名款、地区限定,导致供需关系实时变化。数据壁垒:得物App使用自研WMS签名算法设备指纹绑定动态请求头加密,是爬虫工程师的“练兵场”。本博客将手把手带你从零搭建一套生产级得物球鞋价格爬虫系统,涵盖:抓包与逆向分析(mitmproxy + Frida)签名算法逆向(Python复刻)设备模拟与心跳保活(ADB + uiautomator2)

2201_76125261的博客 1125

arraylist java 遍历删除_java ArrayList遍历删除效率对比

最近在程序中使用到了ArrayList的删除方法。我知道list有两种迭代方式(Iterator,index)。我写了两个方法根据这两种迭代方式做删除操作,看哪种速度快一点/** iterator方式删除* @param list* @param deleted*/private static void listRemoveByIterator(List list, Set deleted){It...

weixin_36180515的博客 147

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java集合(六)--ArrayList、LinkedList和Vector对比

在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这: Java集合(五)--LinkedList源码解读 Java集合(四)--基于JDK1.8的ArrayList源码解读   这篇文章,对比一下ArrayList和LinkedList和Vector,主要是前面两个,因为Vector很少使用,如果考虑并发安全,也会使用 CopyOnWriteArrayList ...

weixin_30488313的博客 93

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ArrayList哪种循环效率更好你真的清楚吗

ArrayList使用哪种循环效率最高?你真的知道吗

root 938

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

list遍历_面试:ArrayList哪种遍历效率最好?

ArrayList简介声明:以下内容都是基于jdk1.8的ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。看过ArrayList 源码的同学有没有注意过有这么一个细节:为什么ArrayLi...

weixin_39961636的博客 120

【Java 基础】-- ArrayList 和 Linkedlist

ArrayList数据结构:基于动态数组实现。特点元素按索引存储,随机访问效率高(时间复杂度 O(1)O(1)O(1))。动态扩容机制,扩容时会重新分配更大的数组,并将旧数组中的元素复制过去。插入或删除时,若非在末尾操作,需要移动大量元素(时间复杂度最差为 O(n)O(n)O(n))。适用场景:频繁读取或操作末尾元素的场景。LinkedList数据结构:基于双向链表实现。特点每个节点存储数据及前后节点的引用。

欢迎来到我的博客,一起探索代码里的世界! 1035

Java集合01----ArrayList的遍历方式及应用

Java集合01----ArrayList的遍历方式及应用 1.ArrayList的遍历方式 a.一般for循环(随机访问) Integer value = null; int size = list.size(); for (int i=0; i<size; i++) { value = (Integer)list.get(i); } b.增强型for循环(for

毛毛虫的小哈 2942

ArrayList还是LinkedList?性能可差千倍

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱Java互联网工程师面试1000题。

VIP129370的博客 420

java遍历删除原理_java遍历删除需要注意的几点

看几段代码:第一部分:1      List list = new ArrayList(Arrays. asList(1, 2, 3, 5));2 for(Integer in : list) {3 if (in == 3) {4 list.remove(in);5 }6 }第二部分:1      List list2 = new ArrayList(Arr...

weixin_42415681的博客 210

Java中常用ArrayList类方法

Java基础Collection常用APIArrayList常用方法ArrayList的三种遍历方式 Collection常用API Collection:储存的数据是不唯一、无序的对象; List:储存的数据是不唯一、有序的对象; Set:储存的数据是唯一、无序的对象; 唯一:不能重复。 有序:不是排序,是输入顺序是否与输出顺序一致。 检验是否唯一: 检验是否有序: ArrayList常用方法 其中List和Set的方法基本一致,但是要注意Set的数据是无序的,所以不能使用下标操作。 方法一:依次按照

qq_45830289的博客 977

三种遍历ArrayList的方法

首先创建ArrayList和插入数据:ArrayList&lt;String&gt; a = new ArrayList&lt;&gt;(); a.add("James"); a.add("Love"); a.add("Wade"); a.add(1, "dont"); a.remove("dont"); //System.out.println(a.contains(&quo

AIlfw的博客 682

java 集合(arraylist set map)遍历问题

1.遍历可以用for和iterator,其效率有区别 使用for循环与使用迭代器iterator的对比 效率上的各有有事 采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快 采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedL

新旧问题集 662

移除集合效率高还是add高_HashMap存取效率高原因、ArrayList和LinkedList区别、JAVA实现链表的基本功能...

一、HashMap存取效率高原因1、Hash也叫散列、哈希。主要用于信息安全领域中的算法,把长度不同的信息转化为杂乱的128位的编码,找到一种数据内容与地址之间的映射关系。注意:不同的输入可能会散列成相同的输出我们最熟悉的Object类中就提供了hashcode的方法。public native int hashCode();2、数据结构Java集合的实现底层大都是基本数据结构的又一层封装。数组:...

weixin_39639514的博客 299

Java ArrayList 与 LinkedList 避坑指南:选对集合 + 优化遍历,性能直接翻倍

这里要注意一个细节:LinkedList 的 add (int index, E element) 方法虽然要先找到索引 5000 的节点(O (n) 时间),但插入操作本身是 O (1),而 ArrayList 的插入操作(移动元素)是 O (n),所以总体来看,LinkedList 在中间插入的性能还是远超 ArrayList。而 LinkedList 插入时,只需找到目标位置的前后节点,修改它们的引用(把前节点的后继指向新节点,新节点的前驱指向前节点、后继指向后节点),不需要移动其他元素。

思索的涟漪,突破自我 518
上一篇: 文件上传
下一篇: 优快云-markdown编辑器
RobertLee~~~~~~~~
博客等级 码龄18年 14粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值