-
2018-12-24 14:56:16
迭代器模式。Iterator对已集合类中的任何一个实现类,都可以返回这样一个Iterator对象。就和循环一样,好处是可以适用于任何一个类,而且实际上java对它进行了优化,比直接用index访问快一点(这一点没法考证,别人都这样说)。不过呢,有一点很好,就是用起来确实很好用,加上泛型就更好用啦。比如说这样一个例子
ArrayList< String > arr = new ArrayList< String >();
Iterator it = arr.iterator();
迭代的时候可以这样
while( it .hasNext() ){
//做一些处理,比如 System.out.print( it.next );}
配合上泛型,一个好处是it.next()可以不用类型转换。以前用的时候是Object,还要自己转,我感觉,Iterator和泛型简直就是绝配哈。更多相关内容 -
在Java中,流循环有什么优势?
2021-03-01 09:19:09有趣的是,面试问题询问了优势,而没有询问缺点,因为两者都有。流是一种更具声明性的风格。 或者更具表现力的风格。 在代码中声明您的意图可能被认为更好,而不是描述它是如何完成的:return people.filter( p ->...有趣的是,面试问题询问了优势,而没有询问缺点,因为两者都有。
流是一种更具声明性的风格。 或者更具表现力的风格。 在代码中声明您的意图可能被认为更好,而不是描述它是如何完成的:
return people
.filter( p -> p.age() < 19)
.collect(toList());
...非常清楚地说明了你要过滤列表中的匹配元素,而:
List filtered = new ArrayList<>();
for(Person p : people) {
if(p.age() < 19) {
filtered.add(p);
}
}
return filtered;
说“我正在做一个循环”。 循环的目的深埋在逻辑中。
流通常更简洁。 同样的例子说明了这一点。 Terser并不总是更好,但如果你能同时表现出简洁和表达,那就更好了。
流与功能有很强的亲和力。 Java 8引入了lambda和功能接口,它打开了一个强大技术的整个玩具箱。 Streams提供了将函数应用于对象序列的最方便和自然的方式。
Streams鼓励更少的可变性。 这与函数式编程方面有关 - 使用流编写的程序类型往往是那种不修改对象的程序。
Streams鼓励更松散的耦合。 您的流处理代码不需要知道流的来源或其最终的终止方法。
Streams可以简洁地表达相当复杂的行为。 例如:
stream.filter(myfilter).findFirst();
可能会先乍一看,好像它会过滤整个流,然后返回第一个元素。 但事实上for驱动整个操作,所以它在找到一个项目后有效停止。
Streams为未来的效率提升提供了空间。 有些人已经进行了基准测试,发现来自内存fors或数组的单线程流可能比等效循环慢。 这似乎是合理的,因为有更多的对象和开销在起作用。
但溪流规模。 除了Java对并行流操作的内置支持外,还有一些用于分布式map-reduce的库使用Streams作为API,因为该模型适合。
缺点是什么?
性能:for循环数组在堆和CPU使用方面都非常轻量级。 如果原始速度和内存节俭是优先级,则使用流更糟糕。
熟悉。世界上充满了经验丰富的程序程序员,来自许多语言背景,他们熟悉循环,流程是新颖的。 在某些环境中,您希望编写熟悉此类人员的代码。
认知开销。 由于它的声明性质,以及对正在发生的事情的抽象的增加,你可能需要建立一个新的心理模型,用于表示代码与执行的关系。 实际上,只有在出现问题时,或者如果您需要深入分析性能或细微错误时,您才需要这样做。 当它“正常工作”时,它才有效。
调试器正在改进,但即使是现在,当您在调试器中单步执行流代码时,它可能比等效循环更难工作,因为简单的循环非常接近传统调试器使用的变量和代码位置。
-
java中使用增强型的for循环有什么好处
2016-08-11 13:30:05从Java5.0开始,Java语言就有称为加强版的for循坏,它能够很容易地逐个运行数组或其他集合的元素。...1、String name--声明会带有数组单一元素的循环变量,数组元素的类型必须与循环变量的类型匹配,na-
从Java5.0开始,Java语言就有称为加强版的for循坏,它能够很容易地逐个运行数组或其他集合的元素。这是个很好的强化功能,因为这是for循环很常见的用途。我们会在讨论非数组的集合时再次看到加强版的for循环。
for (String name : nameArray) { }
1、String name--声明会带有数组单一元素的循环变量,数组元素的类型必须与循环变量的类型匹配,name在循环过程中会带有不同元素的值。
2、冒号(:)--代表“in”
3、nameArray--要被逐个运行的集合,这必须是对数组或其他集合的引用。上面这行程序以中文来说就是:“对nameArray中的每个元素执行一次”而编译器会这么认为:
1、创建名称为name的String变量.
2、将nameArray的第一个元素赋值给name。
3、执行重复的内容。
4、赋值给下一个元素name。
5、重复执行至所有元素都被运行为止。
-
-
-
- /*
- for (循环变量类型 循环变量名称 : 要被遍历的对象) 循环体
- 例子中,
- 1.arr就是为 要被遍历的对象,可以是数组,集合
- 2.循环变量类型就是这个arr数组的数据类型,即int
- 3.循环变量名称就是a,这个可以自己定义
- */
- //增强for循环
- public class ForArray
- {
- public static void main(String[] args)
- {
- int[] arr = {1,2,3,4,5,6,7};
-
- for(int a:arr)
- {
- System.out.print(a);
- }
- }
- }
加强for循环
J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象。本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类,并解释和这一机制的一些常见问题。
在Java程序中,要“逐一处理”——或者说,“遍历”——某一个数组或Collection中的元素的时候,一般会使用一个for循环来实现(当然,用其它种类的循环也不是不可以,只是不知道是因为for这个词的长度比较短,还是因为for这个词的含义和这种操作比较配,在这种时候for循环比其它循环常用得多)。
对于遍历数组,这个循环一般是采取这样的写法:
清单1:遍历数组的传统方式
int[] integers = {1, 2, 3, 4};
for (int j = 0; j < integers.length; j++) {
int i = integers[j];
System.out.println(i);
}
而对于遍历Collection对象,这个循环则通常是采用这样的形式:
清单2:遍历Collection对象的传统方式
String[] strings = {"A", "B", "C", "D"};
Collection stringList = java.util.Arrays.asList(strings);
for (Iterator itr = stringList.iterator(); itr.hasNext();) {
Object str = itr.next();
System.out.println(str);
}
而在Java语言的最新版本——J2SE 1.5中,引入了另一种形式的for循环。借助这种形式的for循环,现在可以用一种更简单地方式来进行遍历的工作。
1. 第二种for循环
不严格的说,Java的第二种for循环基本是这样的格式:
for (循环变量类型 循环变量名称 : 要被遍历的对象) 循环体
借助这种语法,遍历一个数组的操作就可以采取这样的写法:
清单3:遍历数组的简单方式
int[] integers = {1, 2, 3, 4};
for (int i : integers) {
System.out.println(i);
}
这里所用的for循环,会在编译期间被看成是这样的形式:
清单4:遍历数组的简单方式的等价代码
int[] integers = {1, 2, 3, 4};
for (int 变量名甲 = 0; 变量名甲 < integers.length; 变量名甲++) {
System.out.println(变量名甲);
}
这里的“变量名甲”是一个由编译器自动生成的不会造成混乱的名字。
而遍历一个Collection的操作也就可以采用这样的写法:
清单5:遍历Collection的简单方式
String[] strings = {"A", "B", "C", "D"};
Collection list = java.util.Arrays.asList(strings);
for (Object str : list) {
System.out.println(str);
}
这里所用的for循环,则会在编译期间被看成是这样的形式:清单6:遍历Collection的简单方式的等价代码
String[] strings = {"A", "B", "C", "D"};
Collection stringList = java.util.Arrays.asList(strings);
for (Iterator 变量名乙 = list.iterator(); 变量名乙.hasNext();) {
System.out.println(变量名乙.next());
}
这里的“变量名乙”也是一个由编译器自动生成的不会造成混乱的名字。
因为在编译期间,J2SE 1.5的编译器会把这种形式的for循环,看成是对应的传统形式,所以不必担心出现性能方面的问题。
----------------------------------------------------------
For-Each循环
For-Each循环也叫增强型的for循环,或者叫foreach循环。
For-Each循环是JDK5.0的新特性(其他新特性比如泛型、自动装箱等)。
For-Each循环的加入简化了集合的遍历。
其语法如下:
for(type element: array)
{
System.out.println(element);
}
例子
其基本使用可以直接看代码:
代码中首先对比了两种for循环;之后实现了用增强for循环遍历二维数组;最后采用三种方式遍历了一个List集合。
复制代码
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ForeachTest
{
public static void main(String[] args)
{
int[] arr = {1, 2, 3, 4, 5};
System.out.println("----------旧方式遍历------------");
//旧式方式
for(int i=0; i<arr.length; i++)
{
System.out.println(arr[i]);
}
System.out.println("---------新方式遍历-------------");
//新式写法,增强的for循环
for(int element:arr)
{
System.out.println(element);
}
System.out.println("---------遍历二维数组-------------");
//遍历二维数组
int[][] arr2 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} ;
for(int[] row : arr2)
{
for(int element : row)
{
System.out.println(element);
}
}
//以三种方式遍历集合List
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
System.out.println("----------方式1-----------");
//第一种方式,普通for循环
for(int i = 0; i < list.size(); i++)
{
System.out.println(list.get(i));
}
System.out.println("----------方式2-----------");
//第二种方式,使用迭代器
for(Iterator<String> iter = list.iterator(); iter.hasNext();)
{
System.out.println(iter.next());
}
System.out.println("----------方式3-----------");
//第三种方式,使用增强型的for循环
for(String str: list)
{
System.out.println(str);
}
}
}
复制代码
For-Each循环的缺点:丢掉了索引信息。
当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息。
----------------------------------------------------------
增强型的for循环 和普通for循环一样
增强型的for循环 优点主要体现在集合中,随便举个例子
比如对 set 的遍历
一般是迭代遍历:
Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
for循环遍历:
for (String str : set) {
System.out.println(str);
}
是不是简单些?
优点还体现在泛型 假如 set中存放的是Object
Set<Object> set = new HashSet<Object>();
for循环遍历:
for (Object obj: set) {
if(obj instanceof Integer){
int aa= (Integer)obj;
}else if(obj instanceof String){
String aa = (String)obj
}
........
}
如果你用Iterator遍历,那就晕了
map list 也一样
唯一的缺点就是 在遍历 集合过程中,不能对集合本身进行操作
for (String str : set) {
set.remove(str);//错误!
} -
-
在Java中,流比循环有什么优势?
2021-03-01 09:18:33达令说有趣的是,面试问题只问优点,而不问缺点,因为两者都有。流是一种更具声明性的样式。或更富有表现力的风格。它可以被认为是更好的声明你的代码的意图,而不是描述如何,它的完成:return people .filter( p -...达令说
有趣的是,面试问题只问优点,而不问缺点,因为两者都有。流是一种更具声明性的样式。或更富有表现力的风格。它可以被认为是更好的声明你的代码的意图,而不是描述如何,它的完成: return people .filter( p -> p.age() < 19) .collect(toList());...很清楚地说,您正在从列表中过滤匹配的元素,而: List filtered = new ArrayList<>(); for(Person p : people) { if(p.age() < 19) { filtered.add(p); } } return filtered;说“我正在循环”。循环的目的被深深地埋在了逻辑中。溪流通常更短。相同的示例显示了这一点。Terser并不总是更好,但是如果您可以同时简洁和富于表现力,那就更好了。流与功能具有很强的亲和力。Java 8引入了lambda和功能接口,从而打开了包含强大技术的整个玩具箱。流提供了将函数应用于对象序列的最方便自然的方法。流鼓励较少的可变性。这与功能编程方面有关-使用流编写的程序往往是不修改对象的程序。溪流鼓励松散的耦合。您的流处理代码不需要知道流的源或其最终的终止方法。流可以简洁地表达相当复杂的行为。例如: stream.filter(myfilter).findFirst();乍一看,好像它过滤了整个流,然后返回第一个元素。但是实际上findFirst()驱动了整个操作,因此在找到一项后它有效地停止了。流为将来提高效率提供了空间。一些人进行了基准测试,发现内存中List或数组中的单线程流可能比等效循环慢。这是合理的,因为有更多的对象和开销在玩。但是溪流规模。除了Java对并行流操作的内置支持之外,由于模型合适,因此有一些使用Streams作为API的分布式映射减少库。劣势?性能:for数组循环在堆和CPU使用率方面都非常轻巧。如果原始速度和内存节俭是优先考虑的事情,那么使用数据流会更糟。熟悉。世界上到处都是经验丰富的程序程序员,来自许多语言背景,他们熟悉循环并且流是新颖的。在某些环境中,您想编写这种人熟悉的代码。认知开销。由于它具有声明性,并且越来越多地从下面发生的事情中提取内容,因此您可能需要构建一个新的思维模型来了解代码与执行的关系。实际上,仅在出现问题或需要深入分析性能或细微的错误时才需要这样做。当它“起作用”时,它就起作用。调试器正在改进,但是即使在现在,当您逐步调试调试器中的流代码时,它也比等效循环更难工作,因为简单的循环非常接近传统调试器所使用的变量和代码位置。
-
循环移位指令有什么作用?
2021-07-22 01:22:07循环移位指令将字节、字或双字中的各位向右或向左循环移动N位后,再送给指令的输出单元。循环移位是环形的,即被移出来的位将返回到另一端空出来的位(见图4-18)。带进位的右、左循环移位指令各位的数据与进位位一起... -
浅谈C语言中循环结构程序设计
2021-05-18 15:14:38高茂婵 吕雪 彭星星 孙新杰摘要:现在人们对计算机中的算法的要求越来越高,顺序...在我们使用编程时一定要明确什么操作下需要反复执行,操作在什么情况下重复执行等等问题,它们分别对应循环体和循环条件。知道这些... -
零基础JavaScript入门教程(24)–为什么程序需要循环
2021-12-10 10:12:02循环在生活中无处不在,我们每天都要做起床、吃饭、睡觉这样的事情,日复一日的循环。 每个人都要生老病死,生生世世的循环。 程序,也是不断处理各种各样的循环。 -
Java中一个线程执行死循环有什么后果
2021-03-13 21:45:42假设有两个线程在并发运行,一个线程执行的代码中含有一个死循环如:while(true)....当该线程在执行while(true)中代码时,另一个线程会有机会执行吗?示例代码(代码来源于互联网)public class Service {Object object... -
循环的好处,和三种循环的区别
2019-12-08 22:19:21最常见的 三种循环各有各的好处和优势,但都有相似的地方,其中我们最常见的就是for循环,我们拿到最后说,先说说循环的作用和用法, 比如我们最经典的一些例子,打印100遍hello world; var a = 1 while... -
C语言循环命令运用
2021-05-19 03:20:26这样既可以满足个人的需要,又能满足其它不同的使用用途。C语言是高级语言的基础,学习计算机语言要从C语言入手,C是面向过程编程的,这样会把所有的功能包含在几个(通常是一个)代码模块中。便于以后可以通过不同的... -
C语言中for循环的使用
2021-05-19 05:09:36for循环的作用: 注意:要主要满足条件一和二后是先执行语句,后再执行条件三。简单重复的输出for(int i=0;i<10;i++){printf("对一句话简单重复输出输出10");printf("\n");}其基本结构:(如上)for(循环变量的... -
一个串口循环队列,可以制作协议收发,非常好用
2018-06-15 09:21:46利用485的数据传输,制作出一个循环队列,制作协议解析循环队列中数据 -
为什么要有事件循环机制(Event Loop)
2018-06-23 05:05:43事件循环机制(Event Loop)是全面了解javascript代码执行顺序绕不开的一个...这里我们不具体讲Event Loop(有很多文章说得已经足够好了),我们只是做个牵引——为什么需要Event loop和简单介绍。在知道事件循环机... -
gevent-loops:与 gevent 一起使用的改进循环类的集合
2021-07-13 19:30:35事件循环 这是一个自定义 gevent 循环类的集合,旨在覆盖gevent.core.loop 。 最初的动机是在 websocket 客户端与 Gunicorn 服务器断开连接时,防止将大而难看的...有什么好处吗? 是的。 执照 () 版权所有 2014 马 -
C语言中的循环语句及其应用
2021-05-18 09:28:37下面继续介绍C语言中的循环语句及其应用。3.for语句for语句在前面的程序实例中已使用过一次。这里作进一步介绍。一般形式:说明语句;for(初始化条件;条件表达式;自增量++)执行语句;运行过程如下:先求解初始化... -
Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?
2021-01-31 12:39:29AOP 动态代理对循环依赖的有没有什么影响? 本篇文章也是围绕上面的内容进行展开。 笔记也在不断整理,之前可能会有点杂乱。 循序渐进,看一看什么是循环依赖? 开始先简单回顾一下 Bean 的创建过程,当然小伙伴... -
利用循环输入输出数组(简便易学)利用循环设置函数
2021-12-07 13:19:44循环不在细讲,各有各的好处。 for循环有外循环和内循环。 while循环和for循环是入口条件循环,即条件成立才会进行循环。 do while循环是出口条件循环,即先进行一次循环。 摆图摆图 l 利用循环输入输出数组... -
不建议在for循环中使用"+"进行字符串拼接
2021-04-24 00:26:09为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接呢?接下来我们就来分析一下以上五种方式的底层原理,再来分析到底哪种更好。 2. 使用+拼接字符串的实现原理 把上面使用+的代码反编译后的内容... -
scala使用for循环
2021-06-19 12:10:43在开发中,经常需要使用到for循环对程序做处理,尤其是for循环,使用的地方很多,scala提供了多种方式用于操作for循环,下面列举几种常用的方式 方式1:to 这种方式最简单,只需要指定to的前后的数据范围即可 def ... -
课本该循环使用吗英语作文.docx
2021-10-14 18:03:46课本该循环使用吗英语作文.docx -
java里这句话是怎么起到遍历的作用的? Java循环遍历什么意思
2021-03-07 05:28:56这个叫什么玩意来着我忘记了,反正是for里面的一个方法,你可以把他看成int mm属于这个集合中,m++;这样子,刚才查了下是叫增强型for循环,弊端是无法初始化Arraylist对象,要找数中某个具体数到时候需要重新定义... -
三种循环语句的详解和使用(for,while,do-while)
2020-09-20 17:40:18对于刚接触编程的小可爱们,肯定会碰到这三种循环,书上写的有可能会过于专业化,会让我们感觉很难理解,在这里我就用最简洁明了的表达方式帮你理解并且学会使用这三种循环。 对于大佬们,读完你也许会新体会,新... -
使用增强for循环的好处?跟普通遍历相比
2018-02-07 09:09:22遍历有2种,一种是增强for循环,一种是利用下标遍历。 假设下标是数组,使用第二种方法是比较速度快的,因为增强for每次都要进行 it.hasNext()进行判断,而第二种方法不需要。 那么问题来了,什么时候使用增强for有... -
关于java:哪个循环具有更好的性能? 为什么?
2021-03-13 21:09:31}我不需要在循环外再次使用" s"。第一个选项可能更好,因为不会每次都初始化新的String。 但是,第二个方法将导致变量的范围仅限于循环本身。编辑:回应米尔豪斯的回答。 在循环中将String分配给常量是没有意义的吗... -
C语言中对于循环结构优化的一些入门级方法简介
2021-05-25 07:10:24代码移动将在循环里面多次计算,但是结果不会改变的计算,移到循环外面去。例子:优化前:void lower1(char *s){int i;for(i=0;iif(s[i]>='A'&&s[i]<='Z')s[i]-=('A'-'a');}优化后:void lower2(char ... -
ORACLE使用游标循环遍历
2021-06-04 15:00:20使用for循环遍历游标的好处:1.不用声明额外的变量,2.不用打开和关闭游标,3.写法简单。 CREATE OR REPLACE PROCEDURE P_AUTO_ACCOUNT(EXEC_DATE IN DATE) IS /** * 使用游标配合for多层循环遍历 */ BEGIN ... -
Python编写循环的两个建议 | 鹅厂实战(文末有福利)
2021-02-03 08:39:13循环是一种常用的程序控制结构。我们常说,机器相比人类的最大优点之一,就是机器可以不眠不休的重复做某件事情,但人却不行。而**“循环”**,则是实现让机器不断重复工作的关键概念。在循环语法方面,Python 表现... -
循环队列的优点是什么?如何判断它的空和满?
2019-12-16 21:03:59当变成循环队列之后,删除元素后的空间仍然可以利用,最大限度的利用空间。 判断方式: 1、采用计数器来判断,空时,计数器为0,满时,计数器为maxsize。 2、另设一个布尔变量以匹别队列的空和满。 3、少用一个... -
为什么不建议在for循环中使用"+"进行字符串拼接
2019-01-23 09:09:35原文:为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接 微信公众号:Hollis Fundebug经授权转载,版权归原作者所有。 字符串,是Java中最常用的一个数据类型了。关于字符串的知识,作者已经发表过...