跳转到内容

地图

75% developed
来自维基教科书,开放世界中的开放书籍

导航 聚合 主题: v  d  e )


除了 java.util.Collection 接口,Java JDK 还有 java.util.Map 接口。它有时也被称为关联数组字典。地图定义了键值映射。Map 接口的实现不包含对象集合。相反,它们包含键->值映射集合。可以将其视为一个数组,其中索引不需要是整数。

Example 代码部分 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 接口相同,另外地图中的键已排序。

在上面的示例中,相同的操作使用两个不同的地图实现完成

Computer code 代码清单 5.4:MapImplementations.java
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * Compare the map implementations.
 *
 * @author xxx
 */
public class MapImplementations {

  /**
   * Compare the map implementations.
   * @param args The execution parameters.
   */
  public static void main(String[] args) {
    processMap(new LinkedHashMap<String, Integer>());

    processMap(new TreeMap<String, Integer>());
  }

  /**
   * Use a map:
   * 1. Fill the map with key-> value.
   * 2. Print all the keys.
   *
   * @param map The used map.
   */
  public static void processMap(Map<String, Integer> map) {
    System.out.println("Process the map");
    map.put("3", new Integer(3));
    map.put("2", new Integer(2));
    map.put("1", new Integer(1));

    for (String key : map.keySet()) {
      System.out.println(key);
    }
  }
}
Standard input or output 代码清单 5.4 的控制台
Process the map
3
2
1
Process the map
1
2
3

我们看到只有 TreeMap 对键进行了排序。注意泛型。Map 接口很棘手。get()remove() 方法不是泛型的。这意味着你必须注意键的类型

Example 代码部分 5.18:棘手的泛型。
Map<Integer, String> map = new TreeMap<Integer, String>();

map.put(new Integer(1), "Watch");
map.put(new Integer(2), "out");
map.put(new Integer(3), "!");

map.remove("2");

for (String value : map.values()) {
  System.out.println(value);
}
Standard input or output 代码部分 5.18 的控制台
Watch
out
!

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


Clipboard

待办事项
添加一些与 变量 中相同的练习


华夏公益教科书