遍历list的三种方式

FFmpeg + Qt 实现摄像头采集与 MP3 背景音乐 RTSP 推流 在直播或视频监控场景中,我们经常需要将摄像头画面与背景音乐混合后推送到 RTSP 服务器。本文将详细介绍如何使用Qt框架结合摄像头实时采集(Windows 下使用dshow,Linux 使用v4l2视频预览(显示为 QImage)视频 H.264 编码 + RTSP 推流从 MP3 文件读取音频,重采样为 AAC 编码并推流循环播放音频文件解决中文文件路径打开失败的问题文章将剖析每个技术环节的关键代码,并给出完整的类实现。 阅读详情

问题场景

在IDEA里面用传统for循环遍历list的时候,提示‘for loop replaceable with foreach …’,为什么会提示?难道foreach的效率高?动手实验了一把。

思考与比较

首先foreach其实是语法糖,是对迭代器的简化,它让你不用关心索引的问题,即可遍历数组或者集合,但这也是它的缺点。foreach的循环对象一般是一个集合、ArrayList、LinkedList、Vector、数组等。

众所周知,集合里的ArrayList底层是用数组实现的,擅长随机访问;LinkedList底层是用链表实现的,擅长顺序访问。

for VS (foreach & iterator)

  1. 遍历数组或者集合时,如果你不需要使用到下标,你可以使用foreach。
  2. 使用foreach不能修改数组或者集合,因为foreach里的元素指向的不是数组或者集合的本身,而是一个副本。
  3. 对于数组类型的集合foreach效率稍微高一些,因为for循环遍历数组时需要先判断数组长度,引入自增变量,每次自增变量是否在范围内,再去hash查找元素;而foreach循环遍历数组时指针会自动指向下一个,如果有的话,不需要知道数组长度和判断,但是差距不会太大,在一个数量级上。见图一。
  4. 对于链表类型的集合foreach的效率明显高于for,因为链表适合顺序访问,而foreach正是遵循迭代器的规律逐个访问的,数据量大情况差距就不止一个数量级了。见图二。

结果

图一:
ArrayList遍历1千万条数据三种方式耗时,for用时29秒,foreach用时27秒,在一个数量级上,迭代器也是27秒。
这里写图片描述

图二:
LinkedList遍历50万条数据三种方式耗时,for用时1449秒,foreach用时1.3秒,完全不在一个数量级上,迭代器1.4秒。
这里写图片描述

CODE

package forx;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by yangyouxing
 * date on 2017/6/2.
 */
public class ForTest {

    public static void print(List<String> list) {
        for (int i = 0; i < list.size(); i++) {
            //list.get(i);
            System.out.println(list.get(i));
        }
    }

    public static void print1(List<String> list) {
        for (String s : list) {

            System.out.println(s);
        }
    }

    public static void print2(List<String> list) {
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            //iterator.next();
            System.out.println(iterator.next());
        }
    }

    public static List<String> create(long num, boolean isLinkedList) {
        List<String> list;
        if (isLinkedList) {
            list = new LinkedList<>();
        } else {
            list = new ArrayList<>();
        }
        for (int i = 0; i < num; i++) {
            list.add(i + "");
        }
        return list;
    }

    public static void main(String[] args) {

        //遍历ArrayList比较
        //test(10000000, false);

        //遍历LinkedList比较
        test(500000, true);

    }

    private static void test(long num, boolean isLinkedList) {

        String type;
        List<String> list;
        if (isLinkedList) {
            list = create(num, true);
            type = "LinkedList";
        } else {
            list = create(num, false);
            type = "ArrayList";
        }

        //传统for
        long a = System.currentTimeMillis();
        print(list);
        long b = System.currentTimeMillis();

        //foreach
        long c = System.currentTimeMillis();
        print1(list);
        long d = System.currentTimeMillis();

        //迭代器
        long e = System.currentTimeMillis();
        print2(list);
        long f = System.currentTimeMillis();

        System.out.println(type + " -> 传统for循环耗时:" + (b - a) + "ms");
        System.out.println(type + " -> foreach循环耗时:" + (d - c) + "ms");
        System.out.println(type + " -> 迭代器循环耗时:" + (f - e) + "ms");
    }
}
华为OD机试真题 新系统2026-04-01 C++ 实现【计算数列位置N的值】 如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;1、输入M、N两个数,则按照以下规则形成一个数列;两个整数,用逗号分割,分别表示M和N。一个整数,表示数列第N个位置上的数值。2、数列的前M个元素的值为1到M;请计算该数列第N个位置上的数值。N取值范围:1<= N<=50。M取值范围:3<=M<=10。 阅读详情

相关推荐

stm32cubeMX使用HAL库点亮LED流水灯

目录

weixin_46129506的博客 3797

IDEA中foreach的快捷键用法

刚开始用foreach循环时,自己一个个手敲进去的,我觉得应该是有快捷键的,果然是有的 for (: ) { } 快捷键是靠近要用foreach的集合,输入iter然后回车就会自动生成了 List<CaseInfo>list = ExcelImportUtil.importExcel(excelFlie , CaseInfo.class, importParams); for (CaseInfo caseI

oyeah_up的博客 8619

硬件压力测试工具使用方法

B, --bind host# 绑定到主机的多个地址中的一个。当客户端到服务器端的测试结束时,服务器端通过-l选项指定的端口(或默认为客户端连接到服务器端的端口),反向连接至客户端。-c, --client host#如果Iperf运行在服务器模式,并且用-c参数指定一个主机,那么Iperf将只接受指定主机的连接。-C, --compatibility# 与低版本的Iperf使用时,可以使用兼容模式。-b, --bandwidth #[KM] UDP模式使用的带宽,单位bits/sec。

weixin_53303772的博客 8215

idea常用快捷键,会在使用的过程中慢慢完善

ctrl+alt+t,if/else与try/catch等的快捷键 Alt+Insert,可以生成构造器/Getter/Setter等 Ctrl+X,剪切 Ctrl+Y,删除当前行 Ctrl+Z,还原 Ctrl+/或Ctrl+Shift+/,注释(//或者/**/) Ctrl+Alt+L,格式化代码 Ctrl+Alt+O,优化导入的类和包 Ctrl+D,复制行 Shift+Enter,向下插入新行 Ctrl+Shift+上下键(将光标放到代码块上,可以切换两个方法的位置) Alt+Shi

lxjhzy的博客 3575

Air780E模组AT指令实战:5分钟搞定MQTT连接EMQX服务器(附完整代码)

本文详细介绍了如何使用Air780E 4G模组通过AT指令快速连接MQTT服务器。从硬件接线、网络注册到MQTT连接配置,提供了完整的实战步骤和代码示例,帮助开发者快速实现物联网设备的数据上报与远程通信。

wdx012345的博客 743

保姆级教程:在NXPS32144环境下安装EB TRESOS 29.0.0并配置MCAL开发环境

本文提供了一份详细的保姆级教程,指导如何在NXP S32K144环境下安装EB TRESOS 29.0.0并配置MCAL开发环境。内容涵盖从前期资源准备、软件安装步骤、核心的MCAL关联配置,到首次创建AUTOSAR工程并进行模块配置的全流程,旨在帮助汽车电子开发者搭建稳定、可用的底层软件开发地基。

wind6的博客 957

mybatis IDEA——foreach标签

SQL语句中有时会使用IN关键字,例如id in ( 1, 2, 3)。可以使用${ids}方式直接获取值,但这种写法不能防止SQL注入,想避免SQL注入就需要用#{}的方式,这时就要配合使用foreach标签来满足需求。 foreach可以对数组、Map或实现了iterable接口(如List、 Set)的对象进行遍历。数组在处理时会转换为List对象,因此foreach遍历的对象可以分为两大类...

Bruce_Json的博客 1814

SYSU-MM01数据集评估避坑指南:从RGB/IR图像理解到Python评估脚本调优

本文详细解析了SYSU-MM01数据集在跨模态行人重识别(ReID)评估中的关键技巧与常见陷阱。从RGB/IR图像理解到Python评估脚本优化,提供了数据评估模式选择、single-shot/multi-shot差异分析、特征文件处理规范等实用指南,帮助研究者避开指标异常问题,提升评估效率与准确性。

weixin_29044713的博客 196

(学习笔记)for循环和forEach性能差异对比

1.写法比较 第一种:普通for循环格式: for(表达式1;循环条件;表达式2){ ...循环体 } 第二种:增强for循环格式: for(类 类的别名 : 类的集合){ ...循环体 } 第三种:iterator 格式: Iterator<Integer> iterator = arrayList.iterator(); while (iterator.hasNext()) { iterator.next(); } 基于增强for实现的扩展写法 forEach:...

qq_35385932的博客 1万+

OnePlus救砖指南:线刷包与OTA全量包实战解析

本文详细解析了OnePlus手机救砖的两种核心方法:线刷包与OTA全量包。针对手机变砖的不同状况(如黑屏、能进Recovery等),文章提供了清晰的判断标准和对应的实战操作指南。重点阐述了线刷包作为终极救砖手段的底层原理与详细步骤,并对比了OTA全量包作为温和修复方案的使用场景与卡刷流程,旨在帮助用户安全、有效地恢复手机系统。

weixin_28312391的博客 1316

ArcGIS渔网分割实战:用Create Fishnet快速生成1km×1km网格(附GDP数据分析案例)

本文详细解析了ArcGIS中Create Fishnet工具在渔网分割中的应用,从基础操作到GDP空间分析全流程。通过1km×1km网格的创建与优化,实现经济数据的空间标准化和可视化表达,解决数据融合与分析的三大核心痛点。

weixin_29250403的博客 295

idea foreach自动补全_IDEA自动补全功能,神操作一秒学会!

看到老师在给你示范的时候,是不是sys,一回车,就直接System.out.println("自己敲要输出的东西");然后,估计你学习的时候,老师用的是eclipse编辑器,当你换了这个IntelliJ IDEA编辑器的时候,就不知道在哪设置了吧。看下图,示范如何设置:图中只是简单的示范了一下,告诉你这个在哪找,然后自己要用什么模板,就可以自己在这地方设置了。我就有如下几个设置:# fo...

weixin_39776344的博客 1803

搭建一个简单的 Django + Vue 项目

在本文中,我将为您详细介绍如何搭建一个简单的 Django + Vue 项目。Django 是一个使用 Python 编写的高级 Web 框架,而 Vue 是一个流行的 JavaScript 框架,用于构建用户界面。通过结合 Django 和 Vue,我们可以创建强大的全栈 Web 应用程序。创建 Django 项目设置 Django 后端创建 Vue 前端连接 Django 和 Vue让我们开始吧!

JfpBlockchain的博客 351

List三种遍历方式

public class ListForeach { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.ad...

青春年少不知疼的博客 7063

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

三种遍历list取值方式

小编最近在项目中总结了三种遍历list的取值方式,总结一下。 第一种 public void testSelectQuestionTypeByExample1() { List list = new ArrayList(); list = questionTypeManagerFacade.selectQuestionTypeByExample();

你若盛开,清风自来 5万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JAVA中循环遍历list有三种方式

JAVA中循环遍历list有三种方式for循环、增强for循环(也就是常说的foreach循环)、iterator遍历。 1、for循环遍历listfor(int i=0;i&lt;list.size();i++){ if(list.get(i).equals("del")) list.remove(i); }   这种方式的问题在于,删除某个元素后,list的大小发生了变...

changjizhi1212的博客 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java List的三种遍历方式

【代码】Java List的三种遍历方式。

西洼工作室的博客 344

List三种遍历方式详解

list集合 list集合常用方法 1、add(int index, Object obj) 在指定的索引增加值 ` List list = new ArrayList(); list.add(0, “abc”); list.add(0, “xyz”); list.add(1, “qq”); 2、remove(int index) 根据指定索引删除数据 list.remove(1) 3、set(int index, Object obj) 将指定索引处的元素进行修改 list.set(1,“qq”);

get_Max的博客 2万+

Java遍历list的三种方式

Java遍历list的三种方式 问题场景 在IDEA里面用传统for循环遍历list的时候,提示‘for loop replaceable with foreach …’,为什么会提示?难道foreach的效率高?动手实验了一把。 思考与比较 首先foreach其实是语法糖,是对迭代器的简化,它让你不用关心索引的问题...

AcceptedLin的博客 1万+

遍历一个List的三种方式

遍历集合List的三种方式         List集合是一种有序的,可重复的集合,集合中每个元素都有自己的元素索引。List集合允许可重复的元素,可以通过索引访问指定位置的元素。         下面列出访问遍历List的三种方式: 方式一: 方式二: 方式三: 完整代码如下: import java.util.ArrayList; import

xzp_12345的博客 3016

java集合之——List的三种遍历方式

java集合之List的三种遍历方式

weixin_45531755的博客 4799

对List的遍历有三种方式

List    list    =    new    ArrayList();      list.add(new    A());      list.add(new    A());      ...          第一种:      for(Iterator    it    =    list.iterator();    i

yijishashou的专栏 642

Java遍历List的三种方式

Java遍历List的主要方法 1、for-each for(Object o :list) { } 2、迭代器 Iterator iter = list.iterator(); while(iter.hasNext()) { Object o = iter.next(); } for (Iterator iter = list.iterator(); it2.hasNext();) {...

sail_today的博客 663

Java List集合存储学生对象用三种方式遍历

List集合存储学生对象用三种方式遍历 需求:创建一个存储学生对象的集合,存储三个学生对象,使用程序实现在控制台遍历该集合 思路: ①定义学生类 ②创建List集合对象 ③创建学生对象 ④把学生添加到集合 public class ListTest { public static void main(String[] args) { List<Student> arr = new...

七七的博客 2179

List集合的三种遍历方式

List集合在Java日常开发中是必不可少的,只要懂得运用各种各样的方法就可以大大提高我们开发的效率,适当活用各种方法才会使我们开发事半功倍。 我总结了三种List集合的遍历方式,下面一一来介绍。 首先来创建一个实体类,以供下面使用。 public class News{ private int id; private String title; private Strin...

大叶子不小的博客 1547

List的三种遍历方式

对List的遍历有三种方式            List    list    =    new    ArrayList();       list.add(new    A());       list.add(new    A());       ...            第一种:       for(Iterator    it    =    list.iterat

知行天下 818
上一篇: 有返回值的多线程示例
下一篇: 支持递归压缩文件夹-org.apache.tools.zip.ZipEntry
sand_clock
博客等级 码龄11年 66粉丝 89原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值