【java】for和foreach的区别

2023-11-14

一、概述

       普通for循环在遍历集合时使用下标来定位集合中的元素。java在JDK1.5开始支持foreach循环,foreach在一定程度上简化了对集合的遍历。但某些情况下,foreach是不能完全代替for循环的。

       限制场景:

1、foreach适用于数组或实现了iterator的集合类。foreach就是使用Iterator接口来实现对集合的遍历的。

2、在用foreach循环遍历一个集合时,不能改变集合中的元素,如增加元素、修改元素。否则会抛出ConcurrentModificationException异常。想了解原因的可以研究一下源码

也不能修改集合中的元素(不报异常),但可以修改元素的属性。


二、验证之旅

(1)添加或移除元素

添加和移除是一样的,这里只给出了移除的代码。感兴趣的童鞋们可以自己试一试,毕竟纸上得来终觉浅嘛。


1、普通for循环进行添加或移除元素



         由输出结果可知,普通for循环,成功移除了元素“jingjing”。


2、foreach循环添加或移除元素



       由输出结果可知,foreach循环抛出ConcurrenModificationException异常。


(2)修改元素


1、普通for循环修改元素


         由输出结果可知,普通for循环成功将list集合中的每一个元素修改成“nini”


2、foreach循环修改元素



      由输出结果可知通过foreach方式并不能修改list中的元素


3、foreach循环修改元素的属性


首先声明一个学生类,代码如下:

package foreach;

public class Student {
     private int age;
     public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	private String name;
     public Student(){};
     public Student(int age,String name){
    	 this.age=age;
    	 this.name=name;
     }
} 
StudentTest类的测试代码如下:

  Student student=new Student(1,"beibei");
	   Student student1=new Student(1,"jingjing");
	   List<Student> studentList=new ArrayList<Student>();
	   studentList.add(student);
	   studentList.add(student1);
	   System.out.println(student); 
	   System.out.println(student1); 
	   System.out.println(student.getName()); 
	   System.out.println(student1.getName()); 
	   for(Student stu:studentList)
	    {
	  	   stu.setName("huanhuan");
	    }
	   System.out.println(student); 
	   System.out.println(student1);    
	   System.out.println(student.getName()); 
	   System.out.println(student1.getName()); 


最后的测试结果如下:


       由输出结果可知,student1和student2对象本身并没有改变,但他们的name属性发生了变化。


三、意外发现:

        验证之路似乎很完美,一切都和自己的预想结果相符,不过却总有意外的惊喜。


       1、list集合中的元素只有两条,使用foreach循环移除元素。


       


      2、list集合中的元素大于2个,对foreach循环加上try--catch。


    在这两种情况下,成功移除了元素。









本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【java】for和foreach的区别 的相关文章

  • 关于定时情况下,大量数据进去SQL表中如何保存

    大量数据如何完成添加 一 多用于定时任务的情况 当大量数据进入时 没有保存完成 而新的一轮定时任务就已经重复进入的情况下 该如何进行处理呢 import com alibaba fastjson JSONObject import java
  • vue2中无法监听数组和对象的某些变化问题

    一 数组 1 不能监听的情况 1 直接通过下标赋值 arr i value 2 直接修改数组长度 arr length newLen 2 替代做法 1 修改值 1 2 3 Vue set arr index newvalue vm set
  • Proteus中ADC0808的使用注意事项

    之前在本科单片机课程设计中 使用Protues中的ADC0808做温度采集 数据协议完全按照手册编写 但是无论是轮询还是中断读数 数据始终胡乱变化 没有任何规律 排查好久也没找到原因 一度怀疑是仿真软件的BUG 现在想想自己脑洞真是大 没办
  • DeeplabV3Plus源码分析

    DeeplabV3Plus源码分析 数据读取和预处理 网络前向传播 ASPP层 模型训练 数据读取和预处理 定义了预处理函数 进入到VOCSegmentation函数 读取数据和标签并进行预处理 网络前向传播 modeling py根据传递
  • 深入解析Java中的==和equals方法:如何正确比较对象

    目录 一 概述 二 操作符 三 equals方法 四 字符串的特殊性 五 如何覆盖equals方法 5 1 覆盖equals方法遵循的原则 5 2 覆盖equals方法的步骤 六 和equals区别 七 应用场景 总结 一 概述 在介绍 和
  • 【Netty4】netty ByteBuf(三)如何释放ByteBuf

    相关文章 netty ByteBuf 一 如何创建ByteBuf对象 netty ByteBuf 二 引用计数对象 reference counted objects netty ByteBuf 三 如何释放ByteBuf 概述 经过前面2
  • 【论文复现】—— 基于最小平方中值的点云平面拟合算法

    目录 一 算法原理 1 论文概述 2 参考文献 二 代码实现 三 结果展示 一 算法原理 1 论文概述 三维扫描获取待测对象点云时 不可避免地会出现噪声点和异常值 严重影响点云平面参数估计和平面拟合精度 采用随机抽样一致性 RANSAC 和
  • 【Qt connect传参方式及lambda函数传参方式详解】

    Qt connect传参方式及lambda函数传参方式详解 一 一般connect用法 1 无参用法 设槽函数 void buttonClicked 1 1 信号 槽均无参数 connect myButton SIGNAL clicked
  • codeblocks 安装 MinGW-w64 和 安装 wxWidgets

    1 安装 MinGW w64 参考链接 Code Blocks mingw64 编译64位程序配置方法 下载链接 https sourceforge net projects mingw w64 files Toolchains targe
  • 鸿蒙ide使用

    隔2个月时间 发现新东西增加不少 还记得第一次收集各种资料 看产业前景 现在可以下定决心 启动鸿蒙专题学习 ios架构师学习路上 更加的艰苦了 这就是这个行业 来链接 HarmonyOS应用开发 服务开发 开发 UI Java UI框架 J
  • 【人体姿态估计2】Real-time Multi-person 2d pose estimation using part affinity fields_2017

    文章目录 1 Introduction 2 Method 2 1 Simultaneous Detection and Association 2 2 Confidence Maps for part detection 2 3 Part
  • 五、命令模式

    五 命令模式 1 模式结构及结构图 模式结构 1 1 命令抽象类 Command 声明执行命令的接口 具有命令执行的抽象方法execute 1 2 具体命令类 concrete Command 实现命令接口 它具有接收者对象 并调用接收者对
  • 指针数组和数组指针的区别

    指针数组和数组指针的区别 指针数组 array of pointers 即用于存储指针的数组 也就是数组元素都是指针 数组指针 a pointer to an array 即指向数组的指针 还要注意的是他们用法的区别 下面举例说明 int
  • java. gc原理面试_一文带你深入JAVA GC(垃圾回收机制)面试讲解!!!

    1 什么是GC 大白话说就是垃圾回收机制 内存空间是有限的 你创建的每个对象和变量都会占据内存 gc做的就是对象清除将内存释放出来 这就是GC要做的事 2 需要GC的区域 说起垃圾回收的场所 了解过JVM Java Virtual Mach
  • 扩频技术详解

    扩频是什么 扩频是一种信息处理传输技术 扩频技术是利用同欲传输数据 信息 无关的码对被传输信号扩展频谱 使之占有远远超过被传送信息所必需的最小带宽 扩频技术原理 在发端输入的信息先经信息调制形成数字信号 然后由扩频码发生器产生的扩频码序列去
  • Mac 上无法使用netstat的-p参数

    解决方法 改为使用lsof命令 例 lsof i P grep i listen 问题解析 如果像linux一样使用netstat tunlp 会收到如下报错 netstat option requires an argument p Us
  • js实现字母序号自动递增

    在实现一个考试管理系统的时候 可能会遇到试题的选项不是固定的情况 需要灵活的增加选项 选项自动递增 A B C D F 通过Unicode编码的方式可以灵活实现 本案例是基于layui表格实现的 如果是其他形式 可以修改部分代码 首先获取到
  • urlopen error [Errno 10061] 解决(附python 获取状态码)

    urllib2 URLError
  • 短连接和保持连接有什么区别,举个具体的网站开发的例子说明两者之间的区别

    短连接和保持连接是指客户端和服务器之间的网络连接模式 短连接是指客户端请求服务器后 发送完请求并接收到服务器的响应后 就立即关闭与服务器的连接 在下一次请求时 需要重新建立连接 这种模式下 服务器不需要在后台一直保持与客户端的连接 可以更好
  • 电阻分压器的阻值大小

    原文连接 https electronics stackexchange com questions 28897 how to choose value of resistor in voltage divider 在选择电阻作为分压器时

随机推荐

  • 一些常见warning的原因和解决方法

    在入职三周后 终于赶齐了接手项目落下两个月的项目 有了一些自己的空闲时间对项目进行整理 主要整理包括类目的整合 从原来一个系统文件夹下几百个文件整改为以MVC设计思想为原则的分文件夹整理类目 井然有序了很多 也不需要再用查找关键字来寻找想要
  • 单主机多网卡位于同一个网段

    一个设备有两张网卡 一个以太网卡 一个wifi无线网卡 如route命令输出的 eth0的IP地址是10 12 39 10 wlan0的IP地址是10 12 39 11 当eth0的RJ45接口的网线连上 wlan0的无线wifi不连上 发
  • Mysql语句整理大全

    综合使用 查询 目录 综合使用 书写顺序 select distinct from 表名 where 限制条件 group by 分组依据 having 过滤条件 order by limit 展示条数 执行顺序 from 查询 where
  • python爬虫对网页进行数据抓取

    1 拿到网页源代码 1 1 先看网址 和请求方式 1 2导入requests模块 1 3 发现爬不出来 是因为豆瓣做了伪装 1 3需要更换头部 1 4需要设置utf 8 要不然会乱码2 提取想要的数据 2 1 加载re模块 并且进行预加载
  • 相位误差补偿表LUT-创建

    LUT 1 相位误差补偿表 就是建立一个查找表对由gamma效应造成的投影仪光栅非正弦性进行一个补偿 2 相关资料可以看李中伟博士的论文 或者其他资料 3 步骤 3 1 获得理想相位图 用多步相移代替理想相位 3 2 获得实际相位图 3 3
  • 六、图形程序设计

    1 Swing概述 Swing是指 被绘制的 用户图形界面类 AWT是指像事件处理这样的窗口工具箱的底层机制 使用Swing的好处 Swing拥有一个丰富 便捷的用户界面元素合集 Swing对底层平台依赖的很少 因此与平台相关的bug很少
  • C语言编程 三角形图形绘制教程

    C语言编程 三角形图形绘制教程 三角形是计算机图形学中最基本的图形元素之一 也是很多图形和游戏中的重要组成部分 本文将介绍如何使用C语言编程绘制三角形 包括原始的点绘制方法和简单的三角形填充算法 C语言编程 三角形图形绘制教程 绘制三角形的
  • 高帧率手机 Flutter 列表慢慢拖动的时候会有明显的抖动

    高帧率手机上 Flutter列表慢慢拖动的时候会感觉到明显的抖动现象 比如 一加手机输入的运行频率为120hz 而显示屏的运行频率为90hz 滚动时 这种不匹配会导致性能下降 google团队通过以下的方法来解决此问题 void main
  • 在react中使用接口请求的方式

    在 React 中使用接口 数据交互的关键 React 是一个流行的 JavaScript 前端框架 用于构建交互式的用户界面 在实际开发中 我们经常需要与后端服务器进行数据交互 这就需要使用接口来获取和发送数据 本文将介绍在 React
  • 网络安全协议之IPSec协议

    简介 IPSec即IP安全协议 网络层在传输的时候可能会遭到攻击 这时我们需要用IPSec协议来进行保护 就像使用SSL协议来保护传输层一样 IPSec经常用于建立虚拟专用网络 VPN 它通过对IP数据包进行加密和认证 来提供两台计算机之间
  • 热力图(Thermodynamic diagram)绘制MATLAB代码详解

    目录 Preface 1 表格型热力图 Tabular thermal diagram 相关系数矩阵热力图 Thermal diagram of correlation coefficient matrix Thermal diagram
  • python-pcl安装和使用

    安装 因为工作中要进行点云数据的显示 因此要安装python pcl 网上搜了很多教程 但是安装中还是遇到很多问题 这里把自己遇到的和可能遇到的问题总结一下 环境 Ubuntu 14 04 python 2 7 6 pcl 1 7 0 网上
  • java反射-通过反射操作注解

    java反射 操作注解 创建注解 创建类注解 类名的注解 Target ElementType TYPE Retention RetentionPolicy RUNTIME interface Tablewang String value
  • 【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 相移键控 PS K 是利用载波相位直接表示
  • java简单线程同步方法(volatile)实现线程同步

    学习笔记 多线程中的非同步问题主要出现在对域的读写上 如果让域自身避免这个问题 则就不需要修改操作该域的方法 用final域 有锁保护的域和volatile域可以避免非同步的问题 volatile关键字为域变量的访问提供了一种免锁机制 使用
  • React18.x + i18next + antd 国际化正确使用姿势及避坑指南

    如果你使用这个教程还不能够解决你的问题的话 直接私信我 免费一对一给你解决 一 使用vite创建一个react项目 具体的创建方法大家参考vite官方文档 大概的操作如下 如果需要更详细的 大家去自行搜索即可 pnpm create vit
  • C# 动态加载Treeview

    失败的方法一 public void showTreeview string sqlContent SELECT monitorType monitorContent FROM monitorcontent DataTable dtCont
  • Error Domain=DVTMachOErrorDomain Code=0“Found an unexpected Mach-O header code_ 0x72613c21

    Failed to generate distribution items with error Error Domain DVTMachOErrorDomain Code 0 Found an unexpected Mach O head
  • Qt_Qt报错No rule to make target

    第一种情况 Qt编译工程时候 所有用到的源文件包括头文件和库文件的 总路径长度不能超过190个左右字符 一旦超过 就会提示找不到那个文件 这个可能是Qt的makefile的机制问题 解决方法 工程文件夹名字命名尽量比较短 而且工程目录文件夹
  • 【java】for和foreach的区别

    一 概述 普通for循环在遍历集合时使用下标来定位集合中的元素 java在JDK1 5开始支持foreach循环 foreach在一定程度上简化了对集合的遍历 但某些情况下 foreach是不能完全代替for循环的 限制场景 1 forea