循环遍历ArrayList 的四种方式:
- for-index
- for-each
- while
- Iterator 迭代器
Demo如下:
public class LoopExample {
public static void main(String[] args) {
ArrayList<Integer> arrlist = new ArrayList<Integer>();
arrlist.add(14);
arrlist.add(7);
arrlist.add(39);
arrlist.add(40);
/* For Loop for iterating ArrayList */
System.out.println("For Loop");
for (int counter = 0; counter < arrlist.size(); counter++) {
System.out.println(arrlist.get(counter));
}
/* Advanced For Loop*/
System.out.println("Advanced For Loop");
for (Integer num : arrlist) {
System.out.println(num);
}
/* While Loop for iterating ArrayList*/
System.out.println("While Loop");
int count = 0;
while (arrlist.size() > count) {
System.out.println(arrlist.get(count));
count++;
}
/*Looping Array List using Iterator*/
System.out.println("Iterator");
Iterator iter = arrlist.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
}
循环遍历LinkedList的四种方式:
- for-index
- for-each
- while
- Iterator 迭代器
Demo代码如下:
public class LinkedListExample {
public static void main(String args[]) {
/*LinkedList declaration*/
LinkedList<String> linkedlist=new LinkedList<String>();
linkedlist.add("Apple");
linkedlist.add("Orange");
linkedlist.add("Mango");
/*for loop*/
System.out.println("**For loop**");
for(int num=0; num<linkedlist.size(); num++)
{
System.out.println(linkedlist.get(num));
}
/*Advanced for loop*/
System.out.println("**Advanced For loop**");
for(String str: linkedlist)
{
System.out.println(str);
}
/*Using Iterator*/
System.out.println("**Iterator**");
Iterator i = linkedlist.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
/* Using While Loop*/
System.out.println("**While Loop**");
int num = 0;
while (linkedlist.size() > num) {
System.out.println(linkedlist.get(num));
num++;
}
}
}
深入分析 Iterate 模式
for each这种写法其实是一个语法糖,其实
for(Box box:boxList) 等同于 for(Iterator var1 = boxList.iterator(); var1.hasNext();var1.next())
可以看到这种模式会去额外生成一个 Iterator 对象,所以相较于 Index 模式而言,它会额外使用一些内存(Android平台,分配过多临时对象,会导致内存不足进行GC,影响APP流畅度)。
Iterate 迭代过程中,会调用Iterator 的 next(),增加很多检查,会带来一定开销(检查遍历中是否有人修改)
public E next() {
checkForComodification(); // 检查是否在遍历过程中有人修改了列表
int i = cursor;
if (i >= size) // 检查下标是否合法
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length) // 检查下标是否合法
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i]; // 返回对象
}
深入分析 Index模式
for(int index = 0; index < boxList.size();index++)
; // do something
这种方式其实并不够理想,因为每次循环时,都会去调用 List.size(),相对而言,保存 len 的方法更快,尤其在 Effective Java 中的范例:
for(int index = 0,n = expensiveComputation(); index < n;index++)
; // do something
如果一个方法耗时较多且结果不会改变,那么可以用一个临时变量充当缓存。
for-each和for-index 哪个快?(就是for(num:nums)和for(int i=0;i<n;i++))
for-each 是通过内部的迭代器进行遍历的,类似于索引;
for-index 是通过 index 计算偏移量的方式遍历。
1 若实现了RandomAccess接口,那么使用for-index是优于for-each的
2 对 ArrayList 这样的连续结构来说,for-each 和 for-index 的效率应该不相上下;而对 LinkedList 这样的链式列表,for-each 的索引优势就体现出来了。
什么时候没法用for-each代替for-index
需要往迭代器中插入元素或者删除元素时。(这会破坏迭代器结构,迭代器遍历模式会检查是否修改)