`
syhan
  • 浏览: 58252 次
  • 性别: Icon_minigender_1
  • 来自: Southeast University
社区版块
存档分类
最新评论

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

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

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

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

HashSet:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, Serializable

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

此外,java.util包里还提供了其他有关Hash的Collection,但是不常用
IdentityHashMap:
public class IdentityHashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, 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<K,V>
extends HashMap<K,V>
implements Map<K,V>

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

LinkedHashSet:

public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, Serializable

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


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

相关推荐

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Java集合专题总结:HashMap和HashTable源码...本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的存储结构、构造方法、get和put方法的源码分析、Hash表的特点和缺点、HashTable和HashMap的区别等内容。

    Hashtable和HashMap的区别:

    ### Hashtable与HashMap的区别详解 #### 一、基本概念与历史背景 在Java编程语言中,`Hashtable` 和 `HashMap` 都是用来存储键值对的数据结构。这两种数据结构虽然相似,但是在实现细节上存在显著差异。 1. **...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    ArrayList和LinkedList虽然不是Set,但它们的父接口List属于Collection,而Collection接口有一个子接口Set,例如HashSet是Set接口的一个实现,它内部基于HashMap实现,保证元素唯一性。 7. WeakHashMap WeakHashMap...

    HashMap 概述 精讲 .md

    - **HashMap和HashSet的区别**:解释HashMap和HashSet之间的区别。 - **扩容机制**:HashMap是如何进行扩容的? - **长度限制**:解释为什么HashMap的长度通常是2的幂次方。 - **线程安全实现**:列举几种使HashMap...

    Java集合框架源码剖析:HashSet 和 HashMap

     之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。  HashMap实现了Map...

    java中级面试题(自己汇总)

    本文总结了Java中级面试题,涵盖了集合、HashMap、HashSet、HashTable、ConcurrentHashMap、红黑树、Java 8对HashMap的优化、LinkedHashMap、TreeMap、IdentityHashMap等知识点。 集合 * List和Set都是继承自...

    通过分析 JDK 源代码研究 Hash 存储机制

    在JDK中,HashMap类使用了`hash()`方法来计算键的哈希值,这个方法基于键对象的`hashCode()`方法,确保不同的键产生不同的哈希值,以减少冲突的可能性。 冲突是指两个不同的键经过哈希函数处理后得到相同的哈希值,...

    02-Java集合容器面试题-重点.docx

    HashMap的长度为什么是2的幂次方HashMap与HashTable有什么区别?如何决定使用HashMap还是TreeMap?HashMap和ConcurrentHashMap有什么区别?ConcurrentHashMap和Hashtable有什么区别?ConcurrentHashMap的底层实现...

    Java集合容器面试题

    HashSet与HashMap的区别是:HashSet 是无序的、不可重复的集合,HashMap 是键值对的集合。 Queue Queue 是一种先进先出的集合,提供了add、remove、peek等方法。 BlockingQueue是什么 BlockingQueue是什么?...

    Java集合框架面试题

    - ⑤、HashMap 需要重新计算 hash 值,而 Hashtable 直接使用对象的 hashCode。 6. HashMap、LinkedHashMap、TreeMap 的区别: - LinkedHashMap 保存了记录的插入顺序,遍历要比 HashMap 要慢。 - TreeMap 实现...

    Java 最常见的 208 道面试题:第二模块答案

    **HashMap 和 Hashtable 的区别**: - **线程安全性**:Hashtable 是线程安全的,而 HashMap 不是。在多线程环境中,若需要线程安全,可以选择 ConcurrentHashMap。 - **空值支持**:HashMap 允许键值为 null,而 ...

    Java-Hash-Table:Java Hash Table的实践与实现

    本主题将深入探讨Java中的哈希表,特别是`HashTable`类,以及相关的`HashMap`和`HashSet`。这三个数据结构都是基于哈希表原理实现的,但它们各有特点和适用场景。 首先,让我们了解哈希表的基本概念。哈希表利用...

    java 面经 java 面经 java 面经

    LinkedList的区别,主要答存储结构,增删改查效率Set会问到hashSet treeSet,以及Set和map的区别,list和set的区别Map会问到HashMap,TreeMap,HashTable的区别HashMap会问到底层数据结构,以及解决hash碰撞的方法...

    Java中的HashMap浅析

    在Java的集合框架中,HashSet,HashMap是用的比较多的一种,顺序结构的ArrayList、LinkedList这种也比较多,而像那几个线程同步的容器用的比较少,像Vector和HashTable,因为这两个线程同步的容器已经不被JDK推荐...

    阿里巴巴电话面试试题(含答案).doc

    - **哈希算法**:HashMap在检测key时会重新计算hash值,而Hashtable则直接使用key的原始hashCode。 - **初始容量**:HashMap的默认初始容量是16,加载因子是0.75;而Hashtable的默认初始容量是11,加载因子也是...

    2014年阿里巴巴java工程师电话面试题目

    - hash算法:Hashtable直接使用key的hashCode()返回的哈希码,而HashMap在计算哈希码时会使用自己的算法。 - 容量和负载因子:Hashtable默认的初始容量是11,负载因子为0.75;HashMap默认的初始容量是16,负载因子也...

    hash表和hashCode1

    这个散列码用于在基于散列的集合(如HashSet、HashMap、HashTable)中定位对象。当向这些集合中添加对象时,首先调用hashCode(),根据返回的散列码决定对象在内部存储的位置。如果已有相同散列码的对象,会调用...

    30重点面试题-Fu1

    2. HashMap 和 Hashtable 的差异: - 同步特性:HashMap不是线程安全的,而Hashtable是线程安全的。在多线程环境下,如果需要线程安全,可以选择使用Collections.synchronizedMap对HashMap进行包装。 - null处理:...

    java面试精选必备题集

    * HashMap和Hashtable的区别 + HashMap:基于哈希表,线程不安全 + Hashtable:基于哈希表,线程安全 * HashSet和HashMap的区别 + HashSet:基于哈希表,集合操作 + HashMap:基于哈希表,键值对操作 * HashMap...

    Java面试总结,Redis宕机数据丢失解决方案,看完这篇彻底明白了.docx

    * HashTable和HashMap的区别在于,HashTable是线程安全的,而HashMap不是 2. ConcurrentHashMap的实现和原理 * ConcurrentHashMap使用分段锁来实现线程安全, 每个分段锁对应一个链表,通过hash函数将键映射到对应...

Global site tag (gtag.js) - Google Analytics