ArrayList 允许你使用数字从对象序列中选择元素,因此它在数字与对象之间建立了关联。
如果要使用其他条件来从序列中选择对象,应该怎么做呢?“栈”是一个例子。它的选择
条件是“最后一个加入栈中的东西”。由“从序列中进行选择”这种思想发展出了 map 这
种强大的工具,也称作字典,或关联数组(曾在前面的章节中见过的
AssociativeArray.java 就是一个简单的例子)。从概念上讲,它看起来就像是 ArrayList,
只是不再用数字下标查找对象,而是以另一个对象来进行查找。这是一种至关重要的编程
技术。
Map 接口即是此概念在 Java 中的体现。方法 put(Object key, Object value)添加一个
“值”(value)(想要的东西)和与“值”相关联的“键”(key)(使用它来查找)。
方法 get(Object key)返回与给定“键”相关联的“值”。可以用 containsKey()和
containsValue()测试 Map 中是否包含某个“键”或“值”。
标准的 Java 类库中包含了几种不同的 Map:HashMap,TreeMap,LinkedHashMap,
WeakHashMap,IdentityHashMap。它们都有同样的基本接口 Map,但是行为、效率、
排序策略、保存对象的生命周期和判定“键”等价的策略等各不相同。
执行效率是Map的一个大问题。看看get()要做哪些事,就会明白为什么在ArrayList中搜
索“键”是相当慢的。而这正是HashMap提高速度的地方。HashMap使用了特殊的值,
称作“散列码”(hash code),来取代对“键”的缓慢搜索。“散列码”是“相对唯一”
用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都
能产生散列码,因为hashCode()是定义在基类Object中的方法。HashMap就是使用对象
如果要使用其他条件来从序列中选择对象,应该怎么做呢?“栈”是一个例子。它的选择
条件是“最后一个加入栈中的东西”。由“从序列中进行选择”这种思想发展出了 map 这
种强大的工具,也称作字典,或关联数组(曾在前面的章节中见过的
AssociativeArray.java 就是一个简单的例子)。从概念上讲,它看起来就像是 ArrayList,
只是不再用数字下标查找对象,而是以另一个对象来进行查找。这是一种至关重要的编程
技术。
Map 接口即是此概念在 Java 中的体现。方法 put(Object key, Object value)添加一个
“值”(value)(想要的东西)和与“值”相关联的“键”(key)(使用它来查找)。
方法 get(Object key)返回与给定“键”相关联的“值”。可以用 containsKey()和
containsValue()测试 Map 中是否包含某个“键”或“值”。
标准的 Java 类库中包含了几种不同的 Map:HashMap,TreeMap,LinkedHashMap,
WeakHashMap,IdentityHashMap。它们都有同样的基本接口 Map,但是行为、效率、
排序策略、保存对象的生命周期和判定“键”等价的策略等各不相同。
执行效率是Map的一个大问题。看看get()要做哪些事,就会明白为什么在ArrayList中搜
索“键”是相当慢的。而这正是HashMap提高速度的地方。HashMap使用了特殊的值,
称作“散列码”(hash code),来取代对“键”的缓慢搜索。“散列码”是“相对唯一”
用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都
能产生散列码,因为hashCode()是定义在基类Object中的方法。HashMap就是使用对象
的hashCode()进行快速查询的。此方法能够显著提高性能。