Why Looping through ArrayList is same as a regular array?
方法1
1 2 3 4 5 6 7 | ArrayList<String> list = new ArrayList<String>(); for (String s : list) { write.append(s); write.append(' '); } |
如何以这种方式循环
如果我想遍历
方法2
1 2 3 4 5 | for (int i = 0; i < list.size(); i++) { write.append(list.get(i)); write.append(" "); } |
我只是不明白如何使用方法1.欢迎任何解释。
这些被称为每个循环,并且可以应用于数组和集合。格式:
1 2 3 | for ([type] [var-name] : [array or iterable value]) { ... } |
要使用for-each循环,您只需要满足以下两个条件之一:
我们这样做的最大原因是因为
例如,
1 2 |
我也可以使用
1 2 3 4 5 |
我没有办法使用索引迭代它而不先将其复制到其他东西,如数组或
使用for-each循环的另一个重要原因是它编译为使用列表中的
1 2 3 4 |
但这不会:
1 2 3 4 | List<String> strs = ... ; for (int i = 0; i < strs.length(); i++) { strs.remove(str); } |
这对多线程应用程序很有用,因为你应该在访问它之前锁定列表,因为大多数
任何实现
对于数组和集合,简化的for循环看起来是相同的,但在引擎盖下,它使用数组的索引和集合的迭代器。
有一个名为
第一个被称为增强型,或"为每个"。它被认为是
这些类型的循环之间存在两个明显的差异:
-
增强的for语句为您索引值,将其作为声明的一部分存储在临时变量中。因此,您不必执行
val[i] 或value.get(i) 之类的操作 - 这会自动发生。 -
您无法在增强的for语句中指定增量;您要么迭代集合中的所有元素,要么通过
break 语句提前终止。
可以使用标准数组迭代的原因在JLS中定义,特别是§14.14.2 - 因为数组没有实现
...Otherwise, the Expression necessarily has an array type, T[].
Let
L1 ... Lm be the (possibly empty) sequence of labels immediately preceding the enhanced for statement.The enhanced for statement is equivalent to a basic for statement of the form:
1
2
3
4
5
6 T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
VariableModifiers(opt) TargetType Identifier = #a[#i];
Statement
}#a and #i are automatically generated identifiers that are distinct from any other identifiers (automatically generated or otherwise) that are in scope at the point where the enhanced for statement occurs.
这是for-each语法:http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html
编译器会将方法1中的代码转换为:
1 2 3 4 5 6 | for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) { String s = iterator.next(); write.append(s); write.append(' '); } |