Collection接口时List、Set和Queue接口的父接口,该接口里定义的方法既可以用于操作Set集合,也可以用于操作List
和Queue集合
下面程序示范了如何操作Collection集合里的元素
- package package1;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.HashSet;
- public class TestCollection {
- public static void main(String[] args) {
- Collection c = new ArrayList();
- //添加元素
- c.add("张三");
- //虽然集合里不能放基本类型的值,但Java支持自动装箱
- c.add(6);
- System.out.println("c集合的元素个数为:" + c.size());
- //删除集合中指定的元素
- c.remove(6);
- System.out.println("c集合的元素个数为:" + c.size());
- //判断是否包含指定的字符串
- System.out.println("c集合的元素中是否包含张三字符串:" + c.contains("张三"));
- c.add("我爱Java");
- System.out.println("c集合的元素个数为:" + c.size());
- Collection books = new HashSet();
- books.add("Java实战");
- books.add("Java编程思想");
- System.out.println("c集合是否完全包含包含books集合?" + c.containsAll(books));
- //用c集合减去books集合里的元素
- c.removeAll(books);
- System.out.println("c集合的元素为:" + c);
- //删除c集合里所有的元素
- c.clear();
- System.out.println("c集合的元素为:" + c);
- books.retainAll(c);
- System.out.println("books集合的元素为:" + books);
- }
- }
上面程序中创建了两个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来遍历集合的元素:
- package package1;
- import java.util.Collection;
- import java.util.HashSet;
- import java.util.Iterator;
- public class TestIterator {
- public static void main(String[] args) {
- Collection books = new HashSet();
- books.add("我爱Java");
- books.add("Hello World");
- books.add("我爱Android");
- //获取books集合对应的迭代器
- Iterator it = books.iterator();
- while(it.hasNext()){
- String book = (String) it.next();
- System.out.println(book);
- if(book.equals("我爱Java")){
- it.remove();
- }
- book = "测试字符串";
- }
- System.out.println(books);
- }
- }
从上面的代码中可以看出: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循环来迭代访问集合里的元素。
- package package1;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.HashSet;
- import java.util.List;
- public class TestForeach {
- public static void main(String[] args) {
- Collection books = new HashSet();
- books.add(new String("张三"));
- books.add(new String("李四"));
- books.add(new String("王五"));
- for(Object obj : books){
- //注意此处的book变量也不是集合元素本身
- String book = (String)obj;
- System.out.println(book);
- if(book.equals("李四")){
- //下面代码将会引发ConcurrentModificationException异常
- // books.remove(book);
- }
- }
- System.out.println(books);
- List<String> mList = new ArrayList<String>();
- mList.add("a");
- mList.add("b");
- for(String a : mList){
- System.out.println(a);
- }
- }
- }
上面程序使用foreach循环来迭代访问Collection集合的元素更加简洁,这正是JDK1.5的foreach循环带来的优势。
与Iterator迭代访问集合元素类似的是,foreach循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值
赋给迭代变量,因此在foreach循环中修改迭代变量的值没有任何意义。