HashMap,Hashtable,HashSet等等Hash Collection之间的区别

昨天博奥杰面试的时候,pm问了我一个问题,HashMap与Hashtable之间有什么区别?我虽然以前看过java doc,里面的确提到过二者的区别,但是我当时实在想不起来了,只好老老实实和pm说我以前看过java api里面说二者的区别只有一点点,但是我记不得了,然后又balabala的说了一点以前看effective java的关于hash的,还有什么对象的hashcode云云。

回来后赶紧查java api:
HashMap:
public class HashMap
extends AbstractMapimplements Map, Cloneable, Serializable
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

其实Hashtable的迭代是Enumberation,而HashMap则是Iterator

HashSet:
public class HashSet
extends AbstractSetimplements Set, Cloneable, Serializable

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。……注意,此实现不是同步的。

此外,java.util包里还提供了其他有关Hash的Collection,但是不常用
IdentityHashMap:
public class IdentityHashMap
extends AbstractMapimplements Map, Serializable, Cloneable

此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1k2 相等(在正常 Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1k2 相等:(k1==null ? k2==null : e1.equals(e2)))。

此类不是 通用 Map 实现!此类实现 Map 接口时,它有意违反 Map 的常规协定,该协定在比较对象时强制使用 equals 方法。此类设计仅用于其中需要引用相等性语义的罕见情况。

此类的典型用法是拓扑保留对象图形转换,如序列化或深层复制。要执行这样的转换,程序必须维护用于跟踪所有已处理对象引用的“节点表”。节点表一定不等于不同对象,即使它们偶然相等也如此。此类的另一种典型用法是维护代理对象。例如,调试设施可能希望为正在调试程序中的每个对象维护代理对象。

LinkedHashMap:

public class LinkedHashMap
extends HashMapimplements Map

Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入 键,则插入顺序不受影响。(如果在调用 m.put(k, v)m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中。)

LinkedHashSet:

public class LinkedHashSet
extends HashSetimplements Set, Cloneable, Serializable

具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在集合中重新插入的 元素的影响。(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到集合 s 中。)


顺带再复习下Set、List、Map之间的区别:
Set集合是不包含重复元素的,List则可以包含重复元素,Map是键-值的映射关系

你可能感兴趣的:(java)