Java集合概述集Collection 和 Iterator 接口用法详解

以下内容部分来自 疯狂Java讲义/李刚 ,博客仅用于个人笔记及帮助他人用途,无任何商业目的,如有侵权,请联系作者删除。

Java集合概述

为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java 提供了集合类,集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于 java.util 包下,后来为了处理多线程环境下的并发安全问题,Java5 还在 java.util.concurrent 包下提供了一些多线程支持集合类。
集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯认为集合里保存的是对象)。
Java 的集合类主要由两个接口派生而出:Collection 和 Map,Collection 和 Map 集合框架的根接口,这两个接口又包含了一些子类接口实现类。下图为 Collection 接口、子接口及其实现类的继承树:
Collection 接口、子接口及其实现类的继承树

上图显示了 Collection 体系里的集合,其中粗线圈出的 Set 和 List接口是 Collection 接口派生的两个子接口,它们分别代表了无序集合和有序集合;Queue 是 Java 提供的队列实现,有点类似于 List。

下图是Map体系的继承树,所有的Map实现类用于保存具有映射关系的数据(也就是前面介绍的关联数组)。

下图显示了Map接口的众多实现类,这些实现类在功能、用法上存在一定的差异,但它们都有一个功能特征:Map 保存的每项数据都是key-value对,也就是由 key 和 value 两个值组成。就像前面介绍的成绩单:语文-79,数学-80,每项成绩都由两个值组成,即科目名和成绩。对于一张成绩表而言,科目通常不会重复,而成绩是可重复的,通常习惯根据科目来查阅成绩,而不会根据成绩来查阅科目。
Map与此类似,Map里的key是不可重复的,key用于标识集合里的每项数据,如果需要查阅 Map 中的数据时,总是根据Map的key来获取。
根据这两张图中粗线标识的 4 个接口,我们可以把 Java 的所有集合分成三大类,其中Set集合类似于一个罐子,把一个对象添加到 Set 集合时,Set集合无法记住添加这个元素的顺序,所以Set里的元素不能重复(否则系统无法准确识别这个元素);List集合非常像一个数组,它可以记住每次添加元素的顺序,只是List的长度可变。Map集合也像一个罐子,只是它里面的每项数据都由两个值组成,下图显示了这三种集合的示意图。
Map接口的众多实现类

从上图可以看出,如果访问List 集合中的元素,可以直接根据元素的索引来访问,如果访问 Map 集合中的元素,可以根据每项元素的 key 来访问 value ;如果访问 Set 集合中的元素,则只能根据元素本身来访问(这也是 Set 集合里元素不允许重复的原因)。
对于 Set 、List、Queue 和 Map四种集合,最常用的实现类在上面两张图中以灰色区域覆盖,分别是HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList 和 HashMap、TreeMap等实现类。

Collection 和 Iterator 接口

Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可以用于操作 List 和 Queue集合。Collection 接口里定义了如下操作元素的方法。

1. boolean add(Object o):该方法用于向集合里添加一个元素。如果集合对象被添加操作改变了,则返回 true。

2. addAll(Collection c):该方法把集合 c 里的所有元素添加到指定集合里.如果集合对象被添加操作改变了,则返回true。

3. void clear():清除集合里的所有元素,将集合长度变为0。

4. boolean  contains(Object o):返回集合里是否包含指定元素。

5. boolean  containsAll(Object o):返回集合里是否包含集合c里的所有元素。

6. boolean isEmpty():返回集合是否为空。当集合长度为 0 时返回血true,否则返回false。

7. Iterator  iterator():返回一个 Iterator  对象,用于遍历集合里的元素。

8. boolean  remove(Object o):删除集合中的指定元素 o,当集合中包含了一个或多个元素 o 时,这些元素将被删除,该方法将返回true。

9. Boolean removeAll(Collection c):从集合中删除集合 c 里包含的所有元素(相当于用调用该方法的集合减集合 c,如果删除了一个或一个以上的元素,则该方法返回true。

10. Boolean retainAll((Collection c):从集合中删除集合 c 里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集),如果该操作改变了调用该方法的集合,则该方法返回true。

11. Int size():该方法返回集合里元素的个数

12. Object[]  toArray():该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素。

下面程序演示了如何通过上面的方法来操作Collection 集合里的元素:

    import java.util.Collection;
    import java.util.ArrayList;
    import java.util.HashSet;
    public class CollectionTest{
      public static void main(String[] args) {
          Collection c = new ArrayList();
          c.add("孙悟空");
          //虽然Java 集合不能放基本类型,但是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("Test");
          System.out.println("c 集合的元素:"+c);

          Collection books = new HashSet();
          books.add("Test");
          books.add("疯狂Java讲义");
          System.out.println("c 集合里是否完全包含 books 集合?:"+c.containsAll(books));

          c.removeAll(books);
          System.out.println("c 的集合元素:"+c);

          c.clear();
          System.out.println("c 的集合元素:"+c);

          books.retainAll(c);
          System.out.println("books 的集合元素:"+books);

      }
    }

运行结果:
运行结果

使用 Iterator 接口遍历集合元素

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

    import java.util.Collection;
    import java.util.Iterator;
    import java.util.ArrayList;
    import java.util.HashSet;
    public class IteratorTest{
      public static void main(String[] args) {
        Collection books = new HashSet();
        books.add("Test01");
        books.add("Test02");
        books.add("Test03");
        Iterator it = books.iterator();
        while(it.hasNext()){
          String book=(String)it.next();
          System.out.println(book);
          book="测试字符串";
        }
        System.out.println(books);
      }
    }

上面代码对迭代变量book进行赋值,但当再次输出books集合时,我们看到集合里的元素没有任何改变。这就可以得到一个结论:当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代 变量的值对集合元素本身没有任何影响。

使用 foreach 循环遍历集合元素

除了可以使用 Iterator 接口迭代器访问 Collection 集合里的元素之外,使用 Java5 提供的 foreach 循环迭代访问集合更加便捷,如下:

    import java.util.Collection;
    import java.util.Iterator;
    import java.util.ArrayList;
    import java.util.HashSet;
    public class ForeachTest{
      public static void main(String[] args) {
        Collection books = new HashSet();
        books.add(new String("Test01"));
        books.add(new String("Test02"));
        books.add(new String("Test03"));
        for(Object obj : books){
          String book = (String)obj;
          System.out.println(book);
        }
        System.out.println(books);
      }
    }

与使用 Iterator 接口迭代访问集合元素类似的是,foreach 循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值赋给迭代变量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值