有一个集合和一个循环foreach:
List<String> someList = new ArrayList<String>();
//add "monkey", "donkey", "skeleton key" to someList
for(String item : someList)
System.out.println(item);
循环是什么样的for,相当于foreach上面的循环?循环foreach在内部是如何工作的?循环for和 和有什么不一样foreach?
循环
foreach是语法糖。从表面上看,首先,它不同于for没有明确的计数器。两者之间唯一的实际区别是,在索引对象的情况下,您无权访问索引。该循环
foreach允许您迭代两种类型的对象:T[] //массивы любого типаIterable循环
for处理对象Iterable问题中的代码
等于下面的代码
此代码适用于任何实现.
Iterable该方法
foreach不能在循环中使用remove(index)。相反,您应该使用iterator.remove(). 例子:如果您在
for不使用迭代器的情况下编写,那么这里是一个示例实现foreach:循环
foreach和for使用数组基本等价
foreach缺点for- 性能访问集合时,
foreach它明显快于for. 然而,当访问数组时——至少使用基元数组和包装器——通过索引(即使用for)访问会更快。由于创建
foreach了大量Iterator.Java 8 引入了整体性能更好的流。(尽管此信息与问题没有直接关系,但它可能很有用)
使用集合:
使用数组:
用于
foreach. _UPD:JDK9 的性能测量
(不要认真评估它,因为在我看来我没有正确测量所有内容)
为了衡量性能,我使用了这个问题的代码:
该方法如何工作
getTime()- 在 for 循环中,带有被测代码的方法运行count一次。发射开始前,记下时间,在所有发射后,从最终时间中减去初始时间——得到发射count时间的测试方法的次数。之后,时间除以计数——得到测试方法一次启动的平均时间。如果测试方法运行时间计数 < 10 秒,则计数增加并重新开始测量。在循环中的测试方法中
for,foreach我使用了:переменная = list.get(i)/array[i]forfor和переменная = i;для foreach.在 lambda 中,我使用了
Arrays.stream(array).map(l -> l+1).collect(Collectors.toList());andlist.stream().map(l -> l+1).collect(Collectors.toList()),即 更改集合的元素并创建一个新集合,因此 lambda 需要更长的时间来执行。该表显示,在 lambda 中执行集合和数组所用的时间大致相同。数组代码的执行时间比集合快大约 1.5 倍。每个人的循环执行时间都是
for一样foreach的。forPS 集合的示例代码foreach(n 只是一个变量):和