`
听你清歌
  • 浏览: 47103 次
  • 性别: Icon_minigender_1
  • 来自: 永康
社区版块
存档分类
最新评论

Hashmap底层数据结构解析

阅读更多
Map接口
  Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。



Hashtable类
  Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
  

    Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:
    Hashtable numbers = new Hashtable();
    numbers.put(“one”, new Integer(1));
    numbers.put(“two”, new Integer(2));
    numbers.put(“three”, new Integer(3));
  要取出一个数,比如2,用相应的key:
    Integer n = (Integer)numbers.get(“two”);
    System.out.println(“two = ” + n);


1.    HashMap概述:
   HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

2.    HashMap的数据结构:
    HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。首先,HashMap类的属性中定义了Entry类型的数组。Entry类实现java.ultil.Map.Entry接口,同时每一对key和value是作为Entry类的属性被包装在Entry的类中。



HashMap的部分源码如下:

Java代码 
/**
* The table, resized as necessary. Length MUST Always be a power of two.
*/ 
 
transient Entry[] table; 
  
static class Entry<K,V> implements Map.Entry<K,V> { 
    final K key; 
    V value; 
    Entry<K,V> next; 
    final int hash; 
    …… 


    可以看出,HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。table数组的元素是Entry类型的。每个 Entry元素其实就是一个key-value对,并且它持有一个指向下一个 Entry元素的引用,这就说明table数组的每个Entry元素同时也作为某个Entry链表的首节点,指向了该链表的下一个Entry元素,这就是所谓的“链表散列”数据结构,即数组和链表的结合体。



3.    HashMap的存取实现:


   1) 添加元素:

当我们往HashMap中put元素的时候,先根据key的重新计算元素的hashCode,根据hashCode得到这个元素在table数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。

HashMap的部分源码如下:

Java代码 
public V put(K key, V value) { 
   // HashMap允许存放null键和null值。 
   // 当key为null时,调用putForNullKey方法,将value放置在数组第一个位置。 
   if (key == null) 
       return putForNullKey(value); 
   // 根据key的keyCode重新计算hash值。 
   int hash = hash(key.hashCode()); 
   // 搜索指定hash值在对应table中的索引。 
   int i = indexFor(hash, table.length); 
   // 如果 i 索引处的 Entry 不为 null,通过循环不断遍历 e 元素的下一个元素。 
   for (Entry<K,V> e = table[i]; e != null; e = e.next) { 
       Object k; 
      // 如果发现 i 索引处的链表的某个Entry的hash和新Entry的hash相等且两者的key相同,则新Entry覆盖旧Entry,返回。 
       if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { 
           V oldValue = e.value; 
           e.value = value; 
           e.recordAccess(this); 
           return oldValue; 
       } 
   } 
   // 如果i索引处的Entry为null,表明此处还没有Entry。 
   modCount++; 
   // 将key、value添加到i索引处。 
   addEntry(hash, key, value, i); 
   return null; 


2) 读取元素:

有了上面存储时的hash算法作为基础,理解起来这段代码就很容易了。从上面的源代码中可以看出:从HashMap中get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。

HashMap的部分源码如下:

Java代码 
public V get(Object key) { 
    if (key == null) 
        return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
        e != null; 
        e = e.next) { 
        Object k; 
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
            return e.value; 
    } 
    return null; 

 
  
 
   3) 归纳起来简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
分享到:
评论

相关推荐

    HashMap详解(通俗易懂)

    这个文档“ HashMap详解(通俗易懂)”很好的阐述了hashmap的底层数据结构示意,希望对学习java的人有帮助

    源码解析jdk8.0集合:HashMap的底层实现原理.pdf

    HashMap的底层实现依赖于数组、链表和红黑树三种数据结构。数组提供快速的定位能力,链表和红黑树解决了哈希冲突问题,同时也保证了在极端情况下HashMap的性能。 HashMap中几个关键字段的含义如下: - DEFAULT_...

    hashmap面试题_hashmap_

    二、HashMap底层原理 HashMap的内部实现基于数组+链表/红黑树的结构。数组中的每个元素都是一个Entry对象,每个Entry包含键值对和指向下一个Entry的引用。当冲突较多导致链表过长时,会自动转换为红黑树,以保证查找...

    Java面试全方位复习攻略,详解集合框架,hashmap底层原理,多线程,消息队列,radis,spring-boot ,Spring-cloud技术,等等

    HashMap底层原理:HashMap是集合框架中非常重要的一个类,它的底层基于数组加链表实现(Java 8中引入了红黑树来优化链表)。HashMap通过哈希算法将键映射到数组的某个位置来存储元素。当发生哈希冲突时,元素会以...

    源码解析jdk7.0集合(3):HashMap的底层实现原理.pdf

    - **Entry数组**:存储元素的核心数据结构。 - **size**:存储键值对的数量。 - **threshold**:扩容的临界值。 - **loadFactor**:负载因子。 - **modCount**:记录HashMap被修改的次数,用于快速失败机制。 当...

    HashMap与ConcurrentHashMap面试要点.pdf

    ##### HashMap底层数据结构 **JDK7与JDK8的差异:** - **JDK7的HashMap**底层是由数组+链表构成的。在JDK7中,链表采用头插法(head-insertion),即新插入的元素被放置到链表的头部,这样做在扩容时能更快速地...

    Java HashMap高难度面试题集锦解析Java HashMap面试题及答案解析-高难度

    Java HashMap 是一个非常重要的数据结构,它在面试中经常被问到,因为它涉及到许多底层实现细节和并发问题。以下是对给定的Java HashMap面试题的详细解析: 1. **HashMap的内部实现原理**: HashMap基于哈希表,...

    集合底层源码分析.doc

    《HashMap底层源码解析》 HashMap作为Java中最常用的集合类之一,它的实现原理与高效性能深受开发者喜爱。本文将深入探讨HashMap的概述、数据结构及其内部实现机制。 首先,HashMap是一个基于哈希表的Map接口的非...

    java中HashMap详解.pdf

    在Java编程语言中,HashMap是基于哈希表实现的数据结构,它是Map接口的一个具体实现,提供了高效的插入、删除和查找操作。HashMap不保证元素的顺序,允许null键和null值。HashMap的工作原理主要依赖于哈希算法,通过...

    Java数据结构和算法中文第二版.rar

    它们提供了方便的接口供开发者使用,但理解其底层数据结构和实现原理有助于写出更高效、更优化的代码。 此外,书中可能还会涵盖一些高级主题,如堆(用于优先队列和堆排序)、散列表(哈希函数的应用)以及贪心算法...

    Java数据结构和算法 (第二版)

    总的来说,《Java数据结构和算法(第二版)》是一本深入解析Java编程中数据结构和算法的书籍,旨在帮助读者巩固基础,提升编程思维,为实际开发工作打下坚实的基础。通过学习,你可以更好地理解如何选择合适的数据...

    基于Java的数据结构提取器.zip

    综上所述,"基于Java的数据结构提取器.zip"可能是一个能够解析和处理各种数据结构的工具,它利用了Java的集合框架、并发特性和各种数据结构的算法。这样的工具对于数据处理、分析和挖掘项目具有很高的实用价值。通过...

    数据结构和算法详细分析用C-python-java详解.rar

    C语言是底层编程语言,适合理解数据结构的底层实现,如指针操作、内存管理等。 4. **Python语言实现**: Python简洁易读,适合初学者,提供了丰富的库支持数据结构和算法实现,如内置的`heapq`模块实现堆操作,`...

    HashMap 源码分析

    在JDK1.8之前,HashMap的底层数据结构采用的是数组+链表的方式,这种方式称为“拉链法”来解决哈希冲突。拉链法的基本思想是将相同哈希值的元素存储在一个链表中,通过数组索引来定位链表的头部。然而,HashMap与...

    面试题之详解HashMap

    HashMap是Java编程中非常重要的数据结构之一,常用于面试中的技术考察。本文将详细解析HashMap的一些常见面试题,包括HashMap的长度为什么是2的幂次方、多线程操作下的死循环问题、底层实现以及扩容机制。 1. ...

    数据结构与算法java

    本文将深入探讨数据结构和算法在Java中的应用,并通过文件“数据结构与算法(JAVA语言版)”中的实例进行解析。 1. **数组**:数组是最基本的数据结构,它允许我们存储同类型的元素集合。在Java中,数组可以通过...

    【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    项目相关 项目介绍 使用建议 贡献指南 常见问题 ...HashMap 核心源码+底层数据结构分析 ConcurrentHashMap 核心源码+底层数据结构分析 LinkedHashMap 核心源码分析 CopyOnWriteArrayList 核心源码分析

    Java数据结构和算法(英文)

    - 参考书籍如《数据结构与算法分析(Java版)》能提供深入的理论和实例解析。 这个资料包中的"数据结构与算法分析(Java版).pdf"很可能是Mark Allen Weiss的经典著作,该书深入浅出地讲解了数据结构和算法,并以Java...

    你真的懂大厂面试题:HashMap吗?

    本文将深入解析HashMap的内部实现,包括其数据结构、put方法和get方法的工作原理。 HashMap在JDK 1.8版本中采用了混合数据结构,即数组+链表或数组+红黑树。这种设计旨在提高查找、插入和删除操作的效率。数组是...

Global site tag (gtag.js) - Google Analytics