映射

Wu Jun 2020-01-01 13:43:49
Categories: > > Tags:

映射(map) 用来存放键 / 值对。如果提供了键, 就能够查找到值。

1 基本映射操作

Java 类库为映射提供了两个通用的实现: HashMap 和 TreeMap 。这两个类都实现了 Map 接口。

散列映射对键进行散列, 树映射用键的整体顺序对元素进行排序, 并将其组织成搜索树。

键必须是唯一的。不能对同一个键存放两个值。 put 将返回用这个键参数存储的上一个值。

remove 方法用于从映射中删除给定键对应的元素。 size 方法用于返回映射中的元素数。

2 更新映射项

counts.put (word, counts.get(word)+ 1)

第一次看到 word 时。在这种情况下,get 会返回 null
简单的补救:

counts,put(word, counts.getOrDefault(word, 0)+ 1);
counts.putlfAbsent (word, 0);
counts.put (word, counts.get(word)+ 1); // Now we know that get will succeed
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。

不同的键对象, 即使内容相同, 也被视为是不同的对象。 在实现对象遍历算法 (如对象串行化)时, 这个类非常有用, 可以用来跟踪每个对象的遍历状况。