普通for循环,while循环以及增强for循环的用途和区别:
while与for循环的区别: 1. while适合不知道执行次数的循环 2. for循环可以在内部初始化数值,适合已知次数的循环 相同的意思分别用while循环和for循环进行表示:
//for循环 for(int i = 0; i < n; i++){ //执行操作 } //while int i = 0; while(i < n){ //执行操作 i++; }可以看出用for循环结构更加清晰,意思更加明了
首先测试一下普通for循环和增强for循环的遍历速度
/** * 测试循环遍历的速率 * @author shui * */ public class MainText { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList(); for(int i = 0; i < 50000; i++){ list.add(12); } long start = System.currentTimeMillis(); for(int i = 0; i < 50000; i++){ list.get(i); } long end = System.currentTimeMillis(); System.out.println("普通for循环使用了:" + (end - start) + "毫秒"); start = System.currentTimeMillis(); for(Integer i:list){ } end = System.currentTimeMillis(); System.out.println("增强for循环使用了:" + (end - start) + "毫秒"); } }识别结果:
# 增强for和 itrator的比较
首先,将增强for循环在XJad中进行反编译:
//编译前 for(Integer i:list){ } //编译后 for (Iterator iterator = list.iterator(); iterator.hasNext();) integer = (Integer)iterator.next();可以看到增强for循环实质上是由itrator实现的,那么两者有什么差别
//for循环删除集合元素 for(int i =0;i < list.size(); i++){ if(list.get(i).equals(2)){ list.remove(i); } } System.out.println("普通for:" + list); //itrator Iterator<Integer> it = list.iterator(); while(it.hasNext()){ Integer temp = it.next(); if(temp.equals(2)){ it.remove(); } } System.out.println("iterator:" + list.toString());输出结果:
可以看到普通for循环没有完全删除2,iterator删除了所有2,原因是什么呢:
list底层是数组,删除一个元素后下标左移,发生错误
iterator的remove()方法有一步:expectedModCount = modCount
用增强for删除的结果:
`java “//foreach删除集合元素 for(Integer i:list){ if(i.equals(2)){ list.remove(i); } } System.out.println(“forEach:” + list);
```java Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at com.shui.main.MainText.main(MainText.java:22)分析:list底层有一个modcount标记,每次进行修改前会加1,再次删除是使用 if (modCount != expectedModCount) 进行判断是否相等,相等才可以操作。不能进行删除,但是可以修改
小节:
增强for循环结构清晰书写方便,但是不适用于集合的删除操作,可以用于做修改操作iterator的remove()可以准确删除集合元素,但是不适合进行修改操作