java 增强for循环 和可变参数

JDK5中定义了一种新的语法----增强for循环,以简化遍历操作。增强for循环只能用在数组或实现Iterable接口的集合上.

for(元素的数据类型  变量 : 数组或者集合) {
        对变量进行操作                        //该变量就是集合或者数组中的元素
    }

三种遍历方式的比较

  • 普通for循环,对索引进行自增,通过索引获取元素值,可以删除元素,但删除后要让索引做自减运算
  • 迭代器,通过迭代器对象(真实集合的一个映射),来遍历每个元素,可以通过迭代器自身的remove方法删除元素,如果在迭代器使用过程中使用集合的方法来删除或者增加元素,会出现并发修改异常
  • 增强for循环,不能删除元素

迭代器:

        Iterator是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出

 增强for循环的实际使用的是迭代器的普通for循环(List集合的代码),如下

for(Iterator it=list.iterator();it.hasNext();){

    System.out.println(it.next());
}
	

既然增强for循环使用了迭代器遍历,那么具有了一些迭代器的性质,在遍历的过程中不允许修改集合中的值

三种遍历方式的示例

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ForTest {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");

		for (int i = 0; i < list.size(); i++) {
			// 集合自身方法删除元素的时候,后面的元素向前移动一位,其size()会变小,
			// 删除完以后,索引要减小一位,因为此时被删除元素的下一位元素已经移动到了被删除元素的位置
			if (list.get(i).equals("c")) {
				list.remove(i);
				i--;
			}
		}

		// 迭代器本事是对集合的映射,在使用迭代器过程中,只能用迭代器的方法操作,
		// 迭代器这个映射会改变,然后更新到集合中.不能使用集合自身的方法删除元素
		Iterator<String> it = list.iterator();
		while (it.hasNext()) {
			if (it.next().equals("b")) {
				it.remove();// 迭代器的方法
			}
		}

		for (String s : list) {
			if (s.equals("d")) {
				// list.remove(s);//报错,并发性修改异常,增强for循环底层使用iterator模式的普通for循环
			}
		}

		System.out.println(list);
	}
}
out:
[a,d]

参考:http://www.monkey1024.com/javase/561

猜你喜欢

转载自blog.csdn.net/sinat_41132860/article/details/84193358
今日推荐