浅谈 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 ...
随机推荐
- Maven编译错误记录:Some Enforcer rules have failed
一.错误信息 添加httpclient与httpcore依赖后编译Maven报错. 错误信息如下: Failed to execute goal org.apache.maven.plugins:ma ...
- 导入jar包的方法
右键项目弹出菜单,进行如下选择: 4.在配置页中,选中Libraries标签页,然后点击Add JARs选择刚才拷贝过来的jar包.最后点击apply and close. 添加完成后图标会发生变化 ...
- 数据库SQL语言学习--上机练习3(插入 更新 删除)
上机练习3 . 将一个新学生记录(学号::姓名:陈冬:性别:男:所在系:信息系:年龄:20岁)插入到Student表中: ALTER TABLE Student ,); UPDATE Student ...
- Python——ipython(python programming)
Tab自动补充 Ctrl+c中断程序 ?帮助调出文档 _得到上次的结果 ,__的到上上次结果,___得到上上次结果 %开头的为魔术命令 %timeit 得到运算时间,多次求平均 %%time ...
- 云区域(region),可用区(AZ),跨区域数据复制(Cross-region replication)与灾备(Disaster Recovery)(部分1)
本文分两部分:部分1 和 部分2.部分1 介绍 AWS,部分2 介绍阿里云和OpenStack云. 1. AWS 1.1 AWS 地理组件概况 AWS 提供三种地理性组件: Regions:区域,即A ...
- Spring AOP 之编译期织入、装载期织入、运行时织入(转)
https://blog.csdn.net/wenbingoon/article/details/22888619 一 前言 AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP ...
- HDFS的工作流程
HDFS的工作机制 概述 HDFS集群分为两大角色:NameNode.DataNode NameNode负责管理整个文件系统的元数据 DataNode 负责管理用户的文件数据块 文件会按照固定的大小( ...
- 去掉user agent stylesheet 浏览器默认样式 [ 2.0 版本 ]
今天在写一个网页的时候发现一个问题,我的table的样式很奇怪,也没有设置什么样式,跟其他的页面不一样,打开开发者工具一看,发现有这么点样式: 其中右上角:user agent stylesheet ...
- ZooKeeper系列(8):ZooKeeper伸缩性
一.ZooKeeper中Observer 1.1 ZooKeeper角色 经过前面的介绍,我想大家都已经知道了在ZooKeeper集群当中有两种角色Leader和Follower.Leader可以接受 ...
- 好习惯: 用controller as 语法和$inject数组注入
angular好习惯1: 用controller as 语法和$inject数组注入 1) 像普通的JS类一样实现controller,摆脱$scope 2) 用.$inject数组注入相关模块,便于 ...