Java集合框架深度学习笔记 - HashMap和Collections

22.11 图(Map)

Map是一种依照键值存储元素的容器。
在Map中,键值可以是任意类型的对象。Map中不能有重复的键值
每个键值对应一个值,一个键值和它的对应值构成一个条目,
真正在map中存储的是这个条目。

图有三种:散列图HashMap,链式散列图和树形图。

Map接口提供了查询,更新和获取集合的值和集合的键值的方法。
更新方法(update methods),包括clear, put, putAll, remove
查询方法(query method),containsKey, containsValue, isEmpty和size

containsKey(Object key):检查map中是否包含指定键值的映射
containsValue(Object value):检查map中是否包含指定值的映射

可以使用方法keySet()来获取一个包含map中键值的规则集,
也可以使用方法values()获得一个包含map中值的集合。

方法entrySet()返回一个实现Map.Entry<K,V>接口的对象集合,
这里的Entry是Map接口的一个内部接口,
该集合中的每个对象都是底层图中的一个特定的键/值对。

AbstractMap类是一个便利类,实现了Map接口中除了entrySet()方法以外的所有方法
SortedMap接口扩展了Map接口,并保持映射以键值升序的顺序排列。
它还有附加的方法firstKey()和lastKey(),以返回最低键值和最高键值。
headMap(toKey)返回值小于toKey的那部分map,
而tailMap(fromKey)返回键值大于等于fromKey那部分Map。

LinkedHashMap类用链表来实现扩展HashMap类,它支持图中条目的排序。
条目的排序键值的排序的区别在于
键值的排序是指键值本身值的排序,这个是SortedMap的特质
条目的排序是指条目插入的顺序(insertion order),
以及访问的顺序(access order)等等,跟条目本身的值没有关系。
无参数构造是以插入顺序来创建LinkedHashMap对象的。
如果要按访问顺序,则要调用另一个构造函数设置accsessOrder
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
true:access-order;false:insertion-order

TreeMap在遍历排好顺序的键值时是很高效的。
键值可以使用Comparable接口和Comparator接口来排序。

如果使用TreeMap的无参构造函数创建一个TreeMap对象。
假定元素的类实现了Comparable接口,则可以使用Comparable接口中的
方法compareTo来对图内的元素进行比较。

要使用比较器,必须使用构造方法TreeMap(Comparatorcomparator)来创造有序图。

  • 如果更新map时不需要保持图中的元素顺序,就使用HashMap
  • 如果需要保持图中元素的插入顺序或访问顺序,就用LinkedHashMap
  • 如果需要使用图按照键值排序,就使用TreeMap

22.12 单元素和不可变的集合和图

单元素就是单例singleton

Collections类:

  • 包含了线性表和集合的静态方法。
  • 包含了用于创建单元素的规则集,线性表和图的方法,以及用于创建不可变规则集。 singleton :Set singletonList :List singletonMap :Map

Collections类中定义了3个常量: EMPTY_SET,EMPTY_LIST,EMPTY_MAP singleton :仅含一个条目的不可变规则集Set singletonList :仅含一个条目的不可变线性表List singletonMap :仅含一个单一映射的不可变图Map

Collections类中定义了6个用于创建只读集合的静态方法: unmodifiableCollection(Collection c) 只读集合可保护集合中的数据以防止被修改,同时对只读操作提供了更好的性能。