| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 高薪程序员&面试题精讲系列18之for和foreach的区别、原理,哪个效率更高? -> 正文阅读 |
|
[Java知识库]高薪程序员&面试题精讲系列18之for和foreach的区别、原理,哪个效率更高? |
一. 面试题及剖析1. 今日面试题我们在刚开始学习Java基础知识的时候,很早就接触到了关于循环的内容,在面试时,面试官在这个地方也可能会问到一些面试题,比如:
2. 题目剖析上面这个题目主要是考察我们对Java中循环的操作和理解,这道题目本身没有太难的地方,题目的答案以记忆为主,没有太多需要理解的地方。 二. 参考答案1. for与foreach的区别1.1 语法不同 常规的for循环语法如下:
增强型foreach是 Java 提供的一种语法糖,主要用来对数组或者集合进行遍历,其语法格式如下:
1.2 使用场景不同
1.3 执行原理不同
1.4 循环执行效果不同
1.5 性能不同 foreach语句是Java5中新增的循环功能,在遍历数组、集合时性能比一般的for循环要高一些。 1.6 各自优缺点不同
三. foreach遍历操作底层原理为了加深各位对foreach遍历操作的理解,壹哥 再深入讲解一下foreach遍历操作的底层原理。 我们可以先编写一个Java类,内部定义一个数组与一个集合,然后利用foreach循环分别对其进行遍历。
上面定义的Java类编写之后,我们先编译生成对应的Java字节码,然后使用JAD反编译工具,对该字节码进行反编译,可以看到反编译后的效果如下图所示: 最终得出结论如下: 当利用foreach这个语法糖遍历一个Array数组时,其实会把foreach循环转为普通的for循环。而foreach在遍历List等集合时,是使用的Iterator迭代器。 四. 实验代码接下来 壹哥 设计几个代码案例,分别测试for与foreach循环,在遍历时是否可以对集合元素进行增、删、改操作。 1. 普通for循环添加或移除元素我先测试普通for循环遍历时对元素进行修改操作。
执行结果如下: 2. foreach循环添加或移除元素接着我再测试foreach循环遍历时对元素进行修改操作。
执行结果如下: 从上面的代码执行结果可以看出,foreach循环遍历时,如果对元素进行添加、修改、删除操作,会抛出ConcurrenModificationException异常。 3. ConcurrentModificationException异常原因分析这时候你可能会很好奇,为什么普通的for循环遍历时就可以对元素进行添加、删除等操作,而在foreach循环遍历时就会出现ConcurrentModificationException异常呢? 别急,壹哥 给各位分析一下。 foreach遍历时进行元素添加、删除时,之所以会出现ConcurrentModificationException异常,这是因为foreach循环对List等集合遍历时,内部是利用Iterator迭代器进行遍历的。而当迭代器运行的时候,会在当前线程 A 中,单独的创建一个线程 B,A 线程负责继续迭代,B 线程负责元素删除。但是 B 线程每删除一个元素,都会去检查 A 线程中的元素与B线程中的元素还是否相同,如果不相同就会产生并发操作异常。原理如下图所示: 4. 问题解决这时候可能会有小伙伴提出新的问题,如果我们非要在foreach循环中删除集合元素,可不可以呢?既然有这样的需求,那么 壹哥 就尽量想办法满足小伙伴的需求啦~(@^_^@)~ 我们知道,在上面代码中,删除方法是用的Collection(ArrayList 的父类) 集合中的 remove()方法,但该方法只能从集合中删除元素,而不能把迭代器中的元素也删除了,所以我们可以使用 iterator 迭代器中的remove()方法来进行删除集合元素,另外foreach循环也要更改为while循环。代码如下:
执行结果如下: 五. 结论这样 壹哥 就为各位分析梳理了for与foreach循环的区别,主要是从以下方面进行分析的:
另外我们还要弄清楚foreach底层操作的相关原理,尤其是foreach操作时为什么不能进行元素的修改操作,清楚ConcurrentModificationException异常的产生原因。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 2:45:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |