13.1 集合接口
1. 使用迭代器Iterator进行访问时,元素被访问的顺序取决于集合类型。如果对ArrayList进行迭代,会从索引0开始,每迭代一次,索引值加1;如果是HashSet,那每个元素将会按照某种随机的次序出现。 (P558)
13.2 具体的接口
1.在Java程序设计语言中,所有链表实际上都是双向链接的(doubly linked)---即每个结点还存放着指向前驱节点的引用。 (P562)
2. 为避免集合发生并发修改的异常,请遵循下述简单规则:可以根据需要给容器附加许多的迭代器,但是这些迭代顺只能读取列表。另外,再单独附加一个既能读又能写的迭代器。----即读写分离。(P566)
3. Map中键可以为null,但是值不能为null。 (P584)
4.IdentityHashMap(标识散列映射表)
在对两个对象进行比较时,IdentityHashMap类使用==,而不是使用equals。也就是说,不同的键对象,即使内容相同,也被视为不同对象。在实现对象遍历算法(如对象序列化)时,这个类非常有用,可以用来跟踪每个对象有遍历情况。 (P588)
13.3 集合框架
1.视图与包装器
keySet方法返回一个实现Set接口的类对象,这个类的方法对原映射表进行操作,这种集合称为视图.(P592)
(1). 轻量级集包装器
Arrays.asList方法,将数组返回为一个可修改但不可更改大小的List
(2) 不可修改视图
Collections的unmodifiable系统方法,返回不可修改、且不可更改大小的集合接口
(3) 子范围(subList)、同步视图(synchronized)、被检验视图(checkedList)等等
(4)通常,视图具有一些局限性,即可能只可以读、无法改变大小、只支持删除而不支持插入等。如果进行不恰当的操作,受限制的视图就会抛出一个UnspportedOperationException。
2.集合与数组的互换
(1)、数组到集合
String[] values = ...;
HashSet(String) staff = new HashSet<String>(Arrays.asList(values));
(2)、集合到数组
staff.toArray(new String[staff.size()]);
在这种情况下,没有创建任何数组;也避免了直接使用toArray方法返回Object的现象。
13.4 算法
1. 如果想按照降序对列表进行排序,可以使用一种非常方便的静态方法Collections.reverseOrder()。 (P601)
e.g:Collections.sort(staff,Collections, reverseOrder())
2、一些常用的简单算法
shuffle(List):随机打乱集合的顺序;
copy(List):将一个列表中的元素复制到另一个列表中;
fill(List<T>, T):用一个常量值填充容器;
reverse(List):逆置列表中的元素。
disjoint(Collection, Collection):判断两个集合有没有共同的元素。