地图
外观
< Java 编程
导航 聚合 主题: ) |
除了 java.util.Collection
接口,Java JDK 还有 java.util.Map
接口。它有时也被称为关联数组或字典。地图定义了键值映射。Map 接口的实现不包含对象集合。相反,它们包含键->值映射集合。可以将其视为一个数组,其中索引不需要是整数。
代码部分 5.17:地图的使用。
import java.util.Map;
import java.util.Hashtable;
...
Map map = new Hashtable();
...
map.put(key, value);
|
如果你需要在一个 Map 中将相关对象放在一起,其中你可以
- 通过键对象访问元素
- 将一个对象映射到另一个
图 5.6:地图接口。
|
- java.util.Map<K,V>
- 将键映射到值。地图不能包含重复的键;每个键最多可以映射到一个值。Map 接口提供了三个集合视图,允许将地图的内容视为键集、值集合或键值映射集。键通常是不可变对象。但是,值对象可以是可变对象。
- java.util.SortedMap<K,V>
- 与 Map 接口相同,另外地图中的键已排序。
在上面的示例中,相同的操作使用两个不同的地图实现完成
|
|
我们看到只有 TreeMap
对键进行了排序。注意泛型。Map 接口很棘手。get()
和 remove()
方法不是泛型的。这意味着你必须注意键的类型
|
|
remove()
调用没有做任何事情,因为 "2"
是一个 String
,而不是一个 Integer
,因此没有找到并删除任何键值对。
Map 接口有以下实现
图 5.7:地图类图。
|
- java.util.TreeMap<E>
- 保证地图将按升序键排序,根据键类的自然顺序排序,非同步。
- java.util.Hashtable<E>
- 同步,null 不能用作键
- java.util.HashMap<E>
- 大致相当于 Hashtable,除了它是非同步的并且允许 null
- java.util.concurrent.ConcurrentHashMap
- 与 Hashtable 相同,另外检索操作(包括 get)通常不会阻塞,因此可能与更新操作(包括 put 和 remove)重叠。
- java.util.WeakHashMap<E>
- WeakHashMap 中的条目将在其键不再正常使用时自动删除。非同步。
- java.util.LinkedHashMap<E>
- 此链表定义了迭代顺序,通常是键首次插入地图的顺序(首次插入顺序)。注意,如果将键重新插入地图,插入顺序不会受到影响。
- java.util.IdentityHashMap
- 此类使用哈希表实现 Map 接口,在比较键(和值)时使用引用相等代替对象相等。换句话说,在 IdentityHashMap 中,两个键 k1 和 k2 被认为相等,当且仅当
if (k1==k2)
。(在正常的 Map 实现(如 HashMap)中,两个键 k1 和 k2 被认为相等,当且仅当if (k1==null ? k2==null : k1.equals(k2))
。)非同步。 - java.util.EnumMap
- EnumMap 中的所有键必须来自创建地图时显式或隐式指定的单个枚举类型。EnumMap 在内部表示为数组。这种表示非常紧凑且高效。非同步。
下表列出了所有同步的地图类
同步 | 非同步 |
---|---|
java.util.TreeMap | |
java.util.Hashtable java.util.concurrent.ConcurrentHashMap |
java.util.HashMap |
java.util.LinkedHashMap | |
java.util.IdentityHashMap | |
java.util.EnumMap |