遍历

迭代器Iterator与for循环的区别

冷暖自知 提交于 2019-12-09 05:46:29
迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部. 1.Iterator Java提供一个专门的迭代器<<interface>>Iterator,我们可以对某个序列实现该interface,来提供标准的Java迭代器。Iterator接口实现后的功能是“使用”一个迭代器. 文档定义: [java] view plain copy print ? Package java.util; public interface Iterator<E> { boolean hasNext(); //判断是否存在下一个对象元素 E next(); void remove(); } [java] view plain copy print ? <span style= "font-size:18px;" >Package java.util; public interface Iterator<E> { boolean hasNext(); //判断是否存在下一个对象元素 E next(); void remove(); } </span> 2.Iterable Java中还提供了一个Iterable接口,Iterable接口实现后的功能是“返回”一个迭代器

List遍历:for,foreach Iterator 速度比较

久未见 提交于 2019-12-09 05:46:01
结论: 如果是 ArrayList ,用三种方式遍历的速度是for>Iterator>foreach,速度级别基本一致; 如果是 LinkedList ,则三种方式遍历的差距很大了,数据量大时越明显( 一般是超过 100000级别 ),用for遍历的效率远远落后于foreach和Iterator,Iterator>foreach>>>for; 模拟 100000条数据,放入ArrayList和LinkedList,对两个List分别用三种方式进行遍历,耗时如下图所示: public class Test { public static void main(String[] args) { // 初始化 List<String> arrList = new ArrayList<String>(); List<String> linkList = new LinkedList<String>(); for (int i = 0; i < 100000; i++) { arrList.add( String.valueOf( i ) ); linkList.add( String.valueOf( i ) ); } System.out.println( "---------------------测试结果------------------------" ); System.out

浅析C#中foreach引用变量

☆樱花仙子☆ 提交于 2019-12-09 05:39:27
昨天做老师的网站作业。要对一些对象做添加修改删除处理。别的倒没什么,删除时出现了点问题似的。 因为是从一个类的集合中删除掉一个元素。这样就要遍历整个集合,而foreach正是为遍历准备的新玩意。自然而然用上了。于是代码类似如下: string temp = name .Text; // 从TextBox中读出数据 foreach (LCourse cou in Data.myCourse) // 在List中遍历 { if ( cou.name == temp) // 判断cou的名字匹配 { Data.myCourse.Remove(cou); // 匹配的即为要删除的,从列表中去除 break; // 跳出循环 } } 很容易就想到这么用foreach,貌似也没错误。但是印象中关于foreach的注意点就是只适用于遍历读取,不能修改。上边的代码却删除成功。这样,矛盾的种子就种在了心里,到底foreach是个什么东西? C#中foreach引用变量过程: 看了MSDN文档,可是文档里的示例用到时都是遍历读取每个元素,所以帮助不大。相关测试,异常,编译错误反倒有很大用处。 过程细节和总结: 1.自定义整型数组然后遍历修改 foreach(int myint in myArray) { myint+=8;} 错误:“myint”是一个“foreach 迭代变量”,无法为它赋值G:

c#中 foreach 用法

别说谁变了你拦得住时间么 提交于 2019-12-09 05:39:09
foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成。in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。 该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值。放到只读变量中去,如果括号中的整个表达式返回值为true,foreach块中的语句就能够执行。一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到foreach块后面 的执行语句。 foreach语句经常与数组一起使用,下面实例将通过foreach语句读取数组的值并进行显示。 数组的属性:Array.Length数组的容量 利用这个属性,我们可以取得数组对象允许存储的容量值,也就是数组的长度、元素个数,这个比较好理解,数组还有其他的属性,比如数组的维数等,属性的用法比较简单,学会一种,其他的格式基本一致,这里我们就不举例了。 当数组的维数、容量较多时,C#提供了foreach语句,专门用来读取集合/数组中的所有元素,我们把这种功能叫做遍历。语法书写如下: 遍历数组:foreach(type objName in collection/Array) 这段语句会逐一检查数组中的所存储的变量值,并且一一将其取出,其中的type是你所要读取的数组对象将要存储在objName变量的数据类型

C#中foreach的实现原理

五迷三道 提交于 2019-12-09 05:38:07
在探讨foreach如何内部如何实现这个问题之前, 我们需要理解两个 C# 里边的接口, IEnumerable 与 IE numerator. 在 C# 里边的遍历集合时用到的相关类中, IEnumerable 是最基本的接口。这是一个可以进行泛型化的接口,比如说 IEnumerable<User>. 在微软的 .NET 推出了这两个接口后,才有了 foreach 的用法,可以说, foreach 是建立在这两个接口的基础之上的, foreach 的前提是其里边的容器要实现了 IEnumerable 接口。 IEnumerable 这个接口里边定义的内容非常简单,最重要的就是里边有一个抽象方法GetEnumerator. I Enumerable 的意思是这个集合是可以遍历的,而这个 GetEnumerator 方法返回的 IEnumerator 的就是一个遍历器,用这个工具来遍历这个类。 如果说 IEnumerable 是一瓶香槟,那么 IEnumerator就是一个开瓶器。 在实现这个 IE numerable 接口的时候,必须要实现这个 GetEnumerator 方法,要返回一个实例化的IEnumorator. 下面来介绍一下这个 IEnumorator 接口。 这个接口中定义的内容也很简单,包括 Cu rrent ,就是返回这个遍历工具所指向的那个容器的当前的元素,

java HashMap遍历的三种方式以及效率对比

时光毁灭记忆、已成空白 提交于 2019-12-09 05:02:19
java HashMap遍历的三种方式以及效率对比 /* HashMap */ public static void hashMap(){ Map<String,String> hashMap = new HashMap<String, String>(); for(int i=0;i<100000;i++) hashMap.put(i+"", i+"v"); long time = System.currentTimeMillis(); System.out.println("==============方式1:通过遍历keySet()遍历HashMap的value"); Iterator<String> it = hashMap.keySet().iterator(); while(it.hasNext()){ hashMap.get(it.next()); //System.out.println(hashMap.get(it.next())); } System.out.println("用时:"+(System.currentTimeMillis() - time)); time = System.currentTimeMillis(); System.out.println("==============方式2:通过遍历values()遍历HashMap的value")

java list三种遍历方法性能比较

纵饮孤独 提交于 2019-12-09 05:01:12
从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入1千万条记录,然后遍历 ArrayList ,发现了一个奇怪的现象,测试代码如下: package com.hisense.tiger.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListTest { public static void main(String[] args) { List<String> list = new ArrayList<String>(); long t1,t2; for(int j = 0; j < 10000000; j++) { list.add("aaaaaa" + j); } System.out.println("List first visit method:"); t1=System.currentTimeMillis(); for(String tmp:list) { //System.out.println(tmp); } t2=System.currentTimeMillis(); System.out.println("Run Time:" +

PHP中foreach用法详解

爷,独闯天下 提交于 2019-12-09 04:56:38
foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement 第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。 第二种格式做同样的事,只是除了当前单元的键名也会在每次循环中被赋给变量 $key。 先来看第一个语句,这个语句比较简单,array_expression指的是一个数组表达式,as $val语句将顺序取得该数组的值并保存到$val变量中,此种方法只能取得数组内的值,而不能取得数组的下标索引值。例如: $myArray=array("1"=>"val1","2"=>"val2","3"=>"val3"); foreach ($myArray as $val) { print($val." "); } 其结果会输出:val1 val2 val3 再来看看第二种格式,第二种格式除了能像第一种格式一样得到数组内元素的值外,还能得到元素的索引值,并保存到$key变量中,如果数组的索引值未经过人工设定,则返回系统默认的设定值, 看正面例子: 先看一个简单的一维数组: $myArray=array("1"=>"val1",

Java for循环和foreach循环的性能比较

亡梦爱人 提交于 2019-12-09 04:56:17
就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了? 两种循环的语法格式: 普通for循环语法: for (int i = 0; i < integers.length; i++) { System.out.println(intergers[i]); } foreach 循环语法: for(Integer in : integers){ System.out.println(in); } 今天我们来比较一下两种for循环对ArrayList和LinkList集合的循环性能比较。首先简单的了解一下ArrayList和LinkList的区别: ArrayList:ArrayList是采用数组的形式保存对象的,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦,查询比较方便。 LinkList:LinkList是将对象放在独立的空间中,而且每个空间中还保存下一个空间的索引,也就是数据结构中的链表结构,插入和删除比较方便,但是查找很麻烦,要从第一个开始遍历。 下面是我测试的代码: public static void main(String[] args){ //实例化arrayList List<Integer> arrayList = new ArrayList<Integer>(); /

Iterator,for,forEach的遍历和效率

↘锁芯ラ 提交于 2019-12-09 04:55:33
对应数据的遍历方式有很多,下面介绍下Iterator,for,forEach三种方式的遍历和执行效率问题 1.代码如下: /** * Iterator,for,forEach比较 * @author w2cboy * date 2014-03-24 */ public class Test { private static final int COUNT = 10000; private static List<Person> persons = new ArrayList<Person>(); public static void init(){ //初始化,生成对象个数 Person person=null; for(int i=0;i<COUNT;i++){ person=new Person(i,"张三"+i,i+""); persons.add(person); } } //Iterator遍历 public static long testIterator(){ //开始编译执行时间 long start =System.nanoTime(); Person person=null; for (Iterator<Person> iterator = persons.iterator(); iterator.hasNext();) { person = (Person)