文档

Java™教程
教程: 集合
课程: 接口
首页 > 集合 > 接口

问题和练习的答案:

问题

  1. 问题:在本课程的开头,你了解到核心集合接口被组织成两个不同的继承树。有一个特殊的接口被认为不是真正的Collection,因此它位于自己的树的顶部。这个接口的名称是什么?
    答案:Map

  2. 问题:集合框架中的每个接口都用<E>语法声明,这告诉你它是泛型的。当你声明一个Collection实例时,指定它将包含的对象的类型有什么优势?
    答案:指定类型允许编译器在编译时验证你放入集合中的对象的类型是否正确,从而减少运行时错误。

  3. 问题:哪个接口表示不允许重复元素的集合?
    答案:Set

  4. 问题:哪个接口形成了集合层次结构的根?
    答案:Collection

  5. 问题:哪个接口表示一个有序的集合,可能包含重复元素?
    答案:List

  6. 问题:哪个接口表示在处理之前保存元素的集合?
    答案:Queue

  7. 问题:哪个接口表示将键映射到值的类型?
    答案:Map

  8. 问题:哪个接口表示双端队列?
    答案:Deque

  9. 问题:列举三种不同的遍历List元素的方法。
    答案:你可以使用流、增强的for语句或迭代器来遍历List

  10. 问题:真还是假:聚合操作是修改底层集合的变异操作。
    答案:假。聚合操作不会改变底层集合。实际上,在调用其聚合操作时,你必须小心不要修改集合。这样做可能导致并发问题,因为在将来的某个时候,流可能会被改变为并行流。

练习题

  1. 练习:编写一个程序,以随机顺序打印其参数。不要复制参数数组。演示如何使用流和传统的增强for语句打印出元素。
    答案:
    import java.util.*;
    
    public class Ran {
    
        public static void main(String[] args) {
            
            // 获取并洗牌参数列表
            List<String> argList = Arrays.asList(args);
            Collections.shuffle(argList);
    
            // 使用JDK 8流打印出元素
            argList.stream()
            .forEach(e->System.out.format("%s ",e));
    
            // 使用增强for循环打印出元素
            for (String arg: argList) {
                System.out.format("%s ", arg);
            }
    
            System.out.println();
        }
    }
    
  2. 练习:参考FindDups示例,修改使用SortedSet而不是Set。指定一个Comparator,以在排序和识别集合元素时忽略大小写。
    答案:
    import java.util.*;
    
    public class FindDups {
    
        static final Comparator<String> IGNORE_CASE_ORDER
                = new Comparator<String>() {
            public int compare(String s1, String s2) {
                return s1.compareToIgnoreCase(s2);
            }
        };
    
        public static void main(String[] args) {
            
            SortedSet<String> s = new TreeSet<String>(IGNORE_CASE_ORDER);
            for (String a : args) {
                s.add(a);
            }
            System.out.println(s.size() + "个不同的单词:" + s);
        }
    }
    
  3. 练习:编写一个方法,接受一个List<String>并对每个元素应用String.trim
    答案:
    增强的for语句不允许你修改List。使用Iterator类的实例允许你删除元素,但不能替换现有元素或添加新元素。这就只剩下ListIterator了:
    import java.util.*;
    
    public class ListTrim {
        static void listTrim(List<String> strings) {
            for (ListIterator<String> lit = strings.listIterator(); lit.hasNext(); ) {
                lit.set(lit.next().trim());
            }
        }
    
        public static void main(String[] args) {
            List<String> l = Arrays.asList(" 红色 ", " 白色 ", " 蓝色 ");
            listTrim(l);
            for (String s : l) {
                System.out.format("\"%s\"%n", s);
            }
        }
    }
    
  4. 练习:考虑四个核心接口,SetListQueueMap。对于下面的四个任务,指定最适合的四个核心接口,并解释如何使用它们来实现任务。
    答案:
    • 奇幻玩具公司(WTI)需要记录所有员工的姓名。每个月,将从这些记录中随机选择一名员工获得一个免费玩具。
      使用List。通过选择一个介于0size()-1之间的数字来随机选择一个员工。
    • WTI决定每个新产品都以一个员工的名字命名,但只使用名字的第一个字母,并且每个名字只使用一次。准备一个唯一的名字列表。
      使用Set。实现这个接口的集合不允许重复输入相同的元素。
    • WTI决定只想使用最受欢迎的名字来命名玩具。计算每个名字的员工数量。
      使用Map,其中键是名字,每个值是具有该名字的员工数量。
    • WTI购买了当地橄榄球队的赛季门票,由员工共享。为这项受欢迎的运动创建一个等待列表。
      使用Queue。使用add()将员工添加到等待列表中,使用remove()将员工移除。

上一页: 接口:问题和练习