Collection、Iterator接口、foreach循环

时间:2021-07-20 17:53:39

Collection接口时List、Set和Queue接口的父接口,该接口里定义的方法既可以用于操作Set集合,也可以用于操作List
和Queue集合

下面程序示范了如何操作Collection集合里的元素

[java] view plaincopy
  1. package package1;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collection;  
  5. import java.util.HashSet;  
  6.   
  7. public class TestCollection {  
  8.   
  9.     public static void main(String[] args) {  
  10.         Collection c = new ArrayList();  
  11.         //添加元素  
  12.         c.add("张三");  
  13.         //虽然集合里不能放基本类型的值,但Java支持自动装箱  
  14.         c.add(6);  
  15.         System.out.println("c集合的元素个数为:" + c.size());  
  16.         //删除集合中指定的元素  
  17.         c.remove(6);  
  18.         System.out.println("c集合的元素个数为:" + c.size());  
  19.         //判断是否包含指定的字符串  
  20.         System.out.println("c集合的元素中是否包含张三字符串:" + c.contains("张三"));  
  21.         c.add("我爱Java");  
  22.         System.out.println("c集合的元素个数为:" + c.size());  
  23.           
  24.           
  25.         Collection books = new HashSet();  
  26.         books.add("Java实战");  
  27.         books.add("Java编程思想");  
  28.         System.out.println("c集合是否完全包含包含books集合?" + c.containsAll(books));  
  29.         //用c集合减去books集合里的元素  
  30.         c.removeAll(books);  
  31.         System.out.println("c集合的元素为:" + c);  
  32.         //删除c集合里所有的元素  
  33.         c.clear();  
  34.         System.out.println("c集合的元素为:" + c);  
  35.         books.retainAll(c);  
  36.         System.out.println("books集合的元素为:" + books);           
  37.     }  
  38. }  

上面程序中创建了两个Collection对象,一个是c集合,一个是books集合,其中c集合是ArrayList,而books集合是
HashSet,虽然他们使用的实现类不同。当把他们当成Collection来使用时,使用add、remove、clear方法来操作集合元素
时没有任何区别。
当使用System.out的println方法来输出集合对象时,将输出[ele1,ele2...]的形式,这显然是因为Collection的实现
类重写了toString()方法,所有Collection集合实现类都重写了toString()方法,该方法可以一次性的输出集合中的所有元素。


使用Iterator接口遍历集合元素

Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样;Collection系列集合、Map
系列集合主要用于盛装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象
也成为迭代器。
Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程
接口,Iterator接口里定义了如下方法:
boolean hasNext():如果被迭代的集合还没有被遍历,则返回true。
Object next():返回集合里下一元素。
void remove():删除集合里上一次next方法返回的元素。
下面程序示范了通过Iterator来遍历集合的元素:

[java] view plaincopy
  1. package package1;  
  2.   
  3. import java.util.Collection;  
  4. import java.util.HashSet;  
  5. import java.util.Iterator;  
  6.   
  7. public class TestIterator {  
  8.     public static void main(String[] args) {  
  9.         Collection books = new HashSet();  
  10.         books.add("我爱Java");  
  11.         books.add("Hello World");  
  12.         books.add("我爱Android");  
  13.           
  14.         //获取books集合对应的迭代器  
  15.         Iterator it = books.iterator();       
  16.         while(it.hasNext()){  
  17.             String book = (String) it.next();  
  18.             System.out.println(book);  
  19.             if(book.equals("我爱Java")){  
  20.                 it.remove();  
  21.             }  
  22.             book = "测试字符串";           
  23.         }  
  24.         System.out.println(books);  
  25.     }  
  26. }  

从上面的代码中可以看出:Iterator仅用于遍历集合,Iterator本身并不提供盛装对象的能力。如果需要创建Iterator
对象,则必须有一个被迭代的集合。
上面的代码 book = "测试字符串"; 对迭代变量book进行赋值,但当我们再次输出books集合时,看到集合里的元素
没有任何改变。这样可以得出一个结论:当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了
迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何改变。 
当使用Iterator来迭代访问Collection集合元素时,Collection集合元素不能被改变,只有通过Iterator的remove
方法来删除上一次next方法返回的集合元素才可以。否则将引发一场。如果把上面程序的代码 it.remove();改为

books.remove(book); 运行时引发异常。

同时注意一下,上面程序的集合是set类型,改为list试试并没有报ConcurrentModificationException异常

使用foreach循环遍历集合元素

除了可以使用Iterator迭代访问Collection集合里的元素之外,使用JDK1.5提供的foreach循环来迭代访问集合元素
更加快捷,。如下程序示范了使用foreach循环来迭代访问集合里的元素。

[java] view plaincopy
  1. package package1;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collection;  
  5. import java.util.HashSet;  
  6. import java.util.List;  
  7.   
  8. public class TestForeach {  
  9.   
  10.     public static void main(String[] args) {  
  11.         Collection books = new HashSet();  
  12.         books.add(new String("张三"));  
  13.         books.add(new String("李四"));  
  14.         books.add(new String("王五"));  
  15.           
  16.         for(Object obj : books){  
  17.             //注意此处的book变量也不是集合元素本身  
  18.             String book = (String)obj;  
  19.             System.out.println(book);  
  20.             if(book.equals("李四")){  
  21.                 //下面代码将会引发ConcurrentModificationException异常  
  22. //              books.remove(book);  
  23.             }  
  24.         }         
  25.         System.out.println(books);  
  26.           
  27.           
  28.         List<String> mList = new ArrayList<String>();  
  29.         mList.add("a");  
  30.         mList.add("b");  
  31.         for(String a : mList){  
  32.             System.out.println(a);  
  33.         }  
  34.           
  35.           
  36.     }  
  37. }  

上面程序使用foreach循环来迭代访问Collection集合的元素更加简洁,这正是JDK1.5的foreach循环带来的优势。
与Iterator迭代访问集合元素类似的是,foreach循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值
赋给迭代变量,因此在foreach循环中修改迭代变量的值没有任何意义。