浅谈 foreach 的原理
package com.shenzhou; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class ForeachTest { private static int[] array = { 1, 2, 3 };
private static int[][] arrayTwo = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
private static List<String> list = new ArrayList<String>(); static {
list.add("array - 1");
list.add("array - 2");
list.add("array - 3");
} public static void main(String[] args) {
oldWrite();
newWrite();
foreachTwo();
forList();
iteratorList();
foreachList();
} /**
* 旧形式的遍历
*/
private static void oldWrite() {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
} /**
* 新形式的遍历
* @since JDK5.0
*/
private static void newWrite() {
for (int i : array) {
// foreach实现原理一:实际上本方法去遍历数组的时候使用的是for一样的方式去循环遍历数组
System.out.println(i);
}
} /**
* 新形式对于多维数组的遍历
* @since JDK5.0
*/
private static void foreachTwo() {
for (int[] i : arrayTwo) {
for (int j : i) {
System.out.println(j);
}
}
} /**
* 旧方式遍历集合
*/
private static void forList() {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)); }
} /**
* 使用迭代器遍历集合
*/
private static void iteratorList() {
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
System.out.println((String) iterator.next());
}
} /**
* 使用新形式遍历集合
* @since JDK5.0
*/
private static void foreachList() {
for (String string : list) {
// foreach实现原理二:实际上本方法遍历容器使用的方式是通过迭代器来进行的
System.out.println(string);
}
} }
输出结果:
1
2
3
1
2
3
1
2
3
4
5
6
7
8
9
array - 1
array - 2
array - 3
array - 1
array - 2
array - 3
array - 1
array - 2
array - 3
Foreach的原理:
要使用foreach来遍历的对象必须实现Iterable接口,这是因为foreach内部其实是封装了一个迭代器对象来对所要遍历的对象进行迭代,而这个迭代器的来源是通过所要遍历对象的Iterator iterator()方法来 获取的,Iterator iterator()这个方法封装在Iterable接口中,所以要遍历对象必须实现Iterable 接口。
特点:
1.foreach遍历不能对元素进行赋值操作
2.同时只能遍历一个
3.遍历的时候,只有当前被遍历的元素可见,其他不可见
4.只能正向遍历,不能反向
浅谈 foreach 的原理的更多相关文章
- 浅谈html运行原理
浅谈HTML运行原理,所谓的HTML简单的来说就是一个网页,虽然第一节就讲html原理可能大家会听不懂,就当是给一个初步印象把,至少大概知道一个网页的运行流程是怎样的,下面上一张图: 大致的一个htm ...
- 浅谈React工作原理
浅谈React工作原理:https://www.cnblogs.com/yikuu/p/9660932.html 转自:https://cloud.tencent.com/info/63f656e0b ...
- 浅谈一致性Hash原理及应用
在讲一致性Hash之前我们先来讨论一个问题. 问题:现在有亿级用户,每日产生千万级订单,如何将订单进行分片分表? 小A:我们可以按照手机号的尾数进行分片,同一个尾数的手机号写入同一片/同一表中. 大佬 ...
- [iOS]浅谈NSRunloop工作原理和相关应用
一. 认识NSRunloop 1.1 NSRunloop与程序运行 那么具体什么是NSRunLoop呢?其实NSRunLoop的本质是一个消息机制的处理模式.让我们首先来看一下程序的入口——main ...
- 【JDK源码分析】浅谈HashMap的原理
这篇文章给出了这样的一道面试题: 在 HashMap 中存放的一系列键值对,其中键为某个我们自定义的类型.放入 HashMap 后,我们在外部把某一个 key 的属性进行更改,然后我们再用这个 key ...
- 浅谈 pid的原理与差异
pid 官方语言就是:比例 积分 微分.究其本质意义,比例到底是什么,原理是什么,这三个到底如何在物理世界这种运作的,大概了解的人又很少.过惯了拿起数据公式无脑推的日子的人更是如此,数学公式是很 ...
- 浅谈JVM编译原理->.java文件转变为.class文件的过程
为什么需要编译? 我们平常写代码,有规范的命名方式,都能够看得懂,但是我们写的代码计算机是看不懂的,所以需要编译,也就是一个转换的过程,如下: 1.这个是咱们平时写的代码,就比较好理解,对人友好 2. ...
- 浅谈ConcurrentHashMap实现原理
我们都知道HashTable是线程安全的类,因为使用了Synchronized来锁整张Hash表来实现线程安全,让线程独占: ConcurrentHashMap的锁分离技术就是用多个锁来控制对Hash ...
- 浅谈P2P终结者原理及其突破
P2P终结者按正常来说是个很好的网管软件,但是好多人却拿它来,恶意的限制他人的流量,使他人不能正常上网,下面我们就他的功能以及原理还有突破方法做个详细的介绍! 我们先来看看来自在网上PSP的资料:P2 ...
随机推荐
- Hadoop概念学习系列之谈hadoop/spark里为什么都有,YARN呢?(四十一)
在Hadoop集群里,有三种模式: 1.本地模式 2.伪分布模式 3.全分布模式 在Spark集群里,有四种模式: 1.local单机模式 结果xshell可见: ./bin/spark-submit ...
- Mongo查询分组
db.test.aggregate( {'$match':{"url":/http:\/\/www.baidu.cn\/member\/T107581\//}}, {'$group ...
- SecureCRT & SecureFx 绿色破解版
租了腾讯云的服务器,是 ubuntu 版的,需要用到 SecureCRT 工具来远程链接,但是连接的只是控制台,只能输入命令操作,如果要下载文件什么的,就很麻烦,这时可以使用 SecureFx 来传输 ...
- Hadoop+Hbas完全分布式安装部署
Hadoop安装部署基本步骤: 1.安装jdk,配置环境变量. jdk可以去网上自行下载,环境变量如下: 编辑 vim /etc/profile 文件,添加如下内容: export JAVA_HO ...
- Python3 文件的重命名
在Python3中我们要实现将本地文件homework.txt中的内容的修改操作时,大体的思路是这样的:先将homework.txt文件的内容读取到内存中,在内存中对里面的数据进行修改,接着将修改完成 ...
- lamda匿名函数(与sorted(),filter(),map() 一起用), 递归函数, 二分查找
一. 匿名函数 为了解决一些简单的需求而设计的一句话函数. lambda表示的是匿名函数. 不需要用def来声明, 一句话就可以声明出一个函数 语法: 函数名 = lambda 参数: 返回值 ...
- Unreal Engine 4 Based Materials
转自:http://www.52vr.com/article-862-1.html 材质参数 UE4的材质参数有4个,输入范围都是0~1之间……分别为: Base Color Roughnes ...
- javascript-typeof篇
isString (o) { //是否字符串 return Object.prototype.toString.call(o).slice(8, -1) === 'String' } isNumber ...
- 1449 - The user specified as a definer ('test'@'%') does not exist
最近在做一个项目,由于服务器切换,所以需要将原有服务器的mysql数据表以及存储过程导入到另一个服务器的mysql数据库中.导入完成之后以为一切是那么的简单,却没有想到总还是出现了一些莫名其妙的问题. ...
- Java 6- Java 运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其他运 ...