映射(map) 用来存放键 / 值对。如果提供了键, 就能够查找到值。
1 基本映射操作
Java 类库为映射提供了两个通用的实现: HashMap 和 TreeMap 。这两个类都实现了 Map 接口。
散列映射对键进行散列, 树映射用键的整体顺序对元素进行排序, 并将其组织成搜索树。
键必须是唯一的。不能对同一个键存放两个值。 put 将返回用这个键参数存储的上一个值。
remove 方法用于从映射中删除给定键对应的元素。 size 方法用于返回映射中的元素数。
2 更新映射项
counts.put (word, counts.get(word)+ 1)
第一次看到 word 时。在这种情况下,get 会返回 null
简单的补救:
- getOrDefault 方法:提供默认值
counts,put(word, counts.getOrDefault(word, 0)+ 1);
- putlfAbsent 方法:只有当键原先存在时才会放入一个值。
counts.putlfAbsent (word, 0);
counts.put (word, counts.get(word)+ 1); // Now we know that get will succeed
- merge 方法:如果键原先不存在,将把 word 与 1 关联,否则使用 Integer::sum 函数组合原值和 1
counts.merge(word, 1, Integer::sum)
3 映射视图
集合框架不认为映射本身是一个集合。不过, 可以得到映射的视图——实现了Collection 接口或某个子接口的对象。
有 3 种视图: 键集、 值集合(不是一个集) 以及键 / 值对集。
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K, V> entrySet()
如果在键集视图上调用迭代器的 remove 方法, 实际上会从映射中删除这个键和与它关联的值。
如果试图调用 add 方法, 它会抛出一个 UnsupportedOperationException。
4 弱散列映射
WeakHashMap 使用弱引用保存键
5 链接散列集与映射
LinkedHashSet 和 LinkedHashMap 类用来记住插人元素项的顺序。
链接散列映射将用访问顺序, 而不是插入顺序, 对映射条目进行迭代。
6 枚举集与映射
EmimSet 是一个枚举类型元素集的高效实现。 由于枚举类型只有有限个实例, 所以 EnumSet 内部用位序列实现。如果对应的值在集中, 则相应的位被置为 1。
enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY };
EnumSet<Weekday> always = EnumSet.allOf(Weekday.class);
EnumSet<Weekday> never = EnumSet.noneOf(Weekday.class);
EnumSet<Weekday> workday = EnumSet.range(Weekday.MONDAY, Weekday.FRIDAY);
EnumSet<Weekday> mwf = EnumSet.of(Weekday.MONDAY, Weekday.WEDNESDAY, Weekday.FRIDAY);
EnumMap 是一个键类型为枚举类型的映射。它可以直接且高效地用一个值数组实现。
EnumMap<Weekday, Employee〉 personlnCharge = new EnumMapo(Weekday.class);
7 标识散列映射
IdentityHashMap 类散列值用 System.identityHashCode 方法计算, 这是 Object.hashCode 方法根据对象的内存地址来计算散列码时所使用的方式。
在对两个对象进行比较时, IdentityHashMap 类使用 ==, 而不使用 equals。
不同的键对象, 即使内容相同, 也被视为是不同的对象。 在实现对象遍历算法 (如对象串行化)时, 这个类非常有用, 可以用来跟踪每个对象的遍历状况。