问题

1.问题:在本课开始时,您了解了核心集合接口被组织为两个不同的继承树。特别地,一个接口不被认为是真正的Collection,因此位于其树的顶部。该接口的名称是什么?
回答:Map
2.问题:Collections框架中的每个接口都使用<E>语法声明,该语法告诉您它是泛型的。声明Collection实例时,指定实例将包含的对象类型,有什么好处?
答:指定类型可以使编译器在编译时验证您放入集合中的对象类型是否正确,从而减少了运行时的错误。
3.问题:哪个接口代表不允许重复元素的集合?
回答:Set
4.问题:什么接口构成集合层次结构的根?
回答:Collection
5.问题:哪个接口代表可能包含重复元素的有序集合?
回答:List
6.问题:哪个接口代表在处理之前保存元素的集合?
回答:Queue
7.问题:哪个接口代表将键映射到值的类型?
回答:Map
8.问题:哪个接口代表双端队列?
回答:Deque
9.问题:列举三种不同的方法来迭代List的元素。
答:您可以使用流,增强型for语句或迭代器遍历List
10.问题:对或错:聚合操作是修改基础集合的变异操作。
答:错。聚合操作不会使基础集合发生变异。实际上,在调用集合的聚合操作时,必须小心不要突变。如果将来在某个时候将流更改为并行流,这样做可能会导致并发问题。

练习

1.练习:编写一个以随机顺序打印其参数的程序。不要复制参数数组。演示如何使用流和传统的for语句增强版来打印元素。
回答:

  1. import java.util.*;
  2. public class Ran {
  3. public static void main(String[] args) {
  4. // Get and shuffle the list of arguments
  5. List<String> argList = Arrays.asList(args);
  6. Collections.shuffle(argList);
  7. // Print out the elements using JDK 8 Streams
  8. argList.stream()
  9. .forEach(e->System.out.format("%s ",e));
  10. // Print out the elements using for-each
  11. for (String arg: argList) {
  12. System.out.format("%s ", arg);
  13. }
  14. System.out.println();
  15. }
  16. }

2.练习:以 FindDups示例为例,并将其修改为使用一个SortedSet而不是一个Set。指定一个Comparator,以便在排序和标识集合元素时忽略大小写。
回答:

  1. import java.util.*;
  2. public class FindDups {
  3. public static void main(String[] args) {
  4. Set<String> s = new HashSet<String>();
  5. for (String a : args)
  6. s.add(a);
  7. System.out.println(s.size() + " distinct words: " + s);
  8. }
  9. }

3.练习:编写一个采用List<String>并对每个元素的应用 String.trim方法。
答:
增强的for语句不允许您修改List。使用Iterator类的实例可以删除元素,但不能替换现有元素或添加新元素。剩下ListIterator

  1. import java.util.*;
  2. public class ListTrim {
  3. static void listTrim(List<String> strings) {
  4. for (ListIterator<String> lit = strings.listIterator(); lit.hasNext(); ) {
  5. lit.set(lit.next().trim());
  6. }
  7. }
  8. public static void main(String[] args) {
  9. List<String> l = Arrays.asList(" red ", " white ", " blue ");
  10. listTrim(l);
  11. for (String s : l) {
  12. System.out.format("\"%s\"%n", s);
  13. }
  14. }
  15. }

4.练习:考虑四个核心接口,SetListQueue,和Map。对于以下四个分配中的每个分配,指定四个核心接口中的哪个最适合,并说明如何使用它来实现分配。答案:

  • Whimsical Toys Inc(WTI)需要记录其所有员工的姓名。每个月,将从这些记录中随机选择一名员工,以获取免费玩具。
    使用List。在0size()-1之间选择一个数字,选择一名随机雇员。
  • WTI决定将每个新产品都以一名员工命名——但只会使用名字,每个名称只能使用一次。准备唯一的名字列表。
    使用Set。实现此接口的集合不允许多次输入同一元素。
  • WTI决定只希望使用最受欢迎的玩具名称。计算每个名字的雇员人数。
    使用Map,其中键是名字,并且每个值都是具有该名字的员工人数的计数。
  • WTI为当地的长曲棍球队获取季票,由员工共享。为此受欢迎的运动创建一个等待列表。
    使用Queue。调用add()以将员工添加到等待列表中,并使用remove()将其删除。