`
arctg30
  • 浏览: 17253 次
  • 来自: ...
社区版块
存档分类
最新评论

HashMap

阅读更多

HashMap的数据结构

HashMap的底层数据结构为数组+链表,数组的元素类型为Entry,Entry本身是一个链表结构。在HashMap中可以看到如下的实例变量:
                   transient Entry[] table;

该变量即定义了HashMap的数据存储。


HashMap的数据容量

HashMap有一个经常被忽略的构造函数:

                  public HashMap(int initialCapacity, float loadFactor)

参数initialCapacity定义数组table的长度,为2^initialCapacity;参数loadFactor定义装载因子,当HashMap.size()>=table.length*loadFactor时,table就会重构。initialCapacity的默认值为16,loadFactor的默认值为0.75,loadFactor越大,越节约内存,数组重组的概率越小,但hash冲突越高。


HashMap的重构

重构发生在HashMap.size()>=table.length*loadFactor时,得做两件事情:

      1、构建新数组,长度为原长度的2倍;

      2、对原数组中的元素重新逐个hash并存储到新数组中。


HashMap的hash算法

HashMap对key进行hash,然后将hash值和数组长度进行&运算,从而定位出数组table的下标i,在table[i]上存储的是链表Entry,遍历该链表,通过比较来判断该key是否存在。具体如下:

       1、计算key的hashcode,int h=key.hashCode();

       2、计算key在HashMap中的hashcode,int hm=hash(h);

           static int hash(int h) {
                 h ^= (h >>> 20) ^ (h >>> 12);
                 return h ^ (h >>> 7) ^ (h >>> 4);
            }

       3、计算key的数组下标,int i=indexFor(hm);

           static int indexFor(int h, int length) {
                 return h & (length-1);
           }

       4、遍历链表table[i]判断key的存在性

            int hash = hash(key.hashCode());
            for (Entry<K,V> e = table[i]; e != null; e = e.next) {
                if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {

                        //找到,存在

                 }

            }


总结:

要用好HashMap必须尽量避免数组重构和尽量减小hash冲突,但二者又是相互矛盾的,使用时得综合考虑,找到一个平衡点(loadFactor).

分享到:
评论

相关推荐

    HashMap之resize()方法源码解读.docx

    HashMap之resize()方法源码解读 HashMap的resize()方法是HashMap中最核心的方法之一,该方法负责扩容HashMap的容量,以便存储更多的键值对。下面我们将对HashMap的resize()方法进行源码解读,了解其扩容机制和原理...

    hashmap面试题_hashmap_

    《HashMap面试题详解》 HashMap作为Java集合框架中的重要成员,是面试中常见的知识点,尤其在数据结构与算法、并发编程以及JVM内存管理等领域,HashMap的深入理解至关重要。本篇将围绕HashMap的相关面试题,从基础...

    关于如何解决HashMap线程安全问题的介绍

    在Java编程中,HashMap是一个非常常用的集合类,用于存储键值对数据。然而,它存在一个重要的特性,那就是线程不安全。理解这个问题并找到解决方案是每个Java开发者必须掌握的知识。 HashMap线程不安全的原因主要...

    JNI处理hashmap,string等对象的操作

    在这个主题中,我们将深入探讨如何使用JNI处理HashMap、String等对象。 首先,让我们来理解JNI的基本结构。JNI接口提供了大量的函数,让本地方法(C/C++代码)能够创建、访问和修改Java对象。要使用JNI,你需要定义...

    HashMap的数据结构

    HashMap是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,主要用于存储键值对(Key-Value)数据。HashMap在内部实现上基于哈希表,也称为散列表,它提供了一种快速查找、插入和删除数据的方法,...

    Java HashMap类详解

    Java HashMap 类详解 本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点。 1. HashMap 和 HashSet 的关系 HashMap 和 HashSet 是 Java Collection Framework ...

    HashMap类.rar

    HashMap类在Java编程语言中是集合框架的一部分,它是一个基于哈希表的Map接口实现。HashMap提供了快速的插入、删除和查找操作,平均时间复杂度为O(1)。在这个压缩包“HashMap类.rar”中,包含的是易语言版本的...

    Javascript实现和操作HashMap

    在JavaScript中,HashMap是一种数据结构,它存储键值对,并且通过键来快速查找值。虽然JavaScript原生的`Map`对象提供了类似的功能,但在某些场景下,开发者可能需要自定义HashMap来满足特定的需求,例如优化性能...

    HASHMAP排序功能描述

    HashMap是Java编程语言中常用的集合类之一,它属于哈希表数据结构,提供key-value的存储方式,并且具有快速查询的特性。然而,HashMap本身并不保证元素的顺序,特别是当涉及到遍历或输出HashMap的内容时,顺序可能会...

    简单的key value hashmap

    哈希映射(HashMap)是Java编程语言中一个非常重要的数据结构,它在《简单的key value hashmap》中被提及,通常用于存储键值对(key-value pairs)。HashMap是Java集合框架的一部分,它提供了高效的查找、插入和删除...

    马士兵老师HashMap学习笔记

    《马士兵老师HashMap学习笔记详解》 HashMap是Java编程语言中常用的一种数据结构,它提供了键值对(key-value pair)的存储功能,是基于哈希表实现的。马士兵老师的HashMap学习笔记深入剖析了这一核心组件的工作...

    全手写HashMap精简版Demo 可直接允许查看效果

    HashMap是Java编程中常用的一种数据结构,用于存储键值对,提供快速的存取操作。在Java中,HashMap是基于哈希表实现的,它的核心原理是哈希函数和链表(或红黑树)来解决冲突。在这个“全手写HashMap精简版Demo”中...

    易语言HashMap类

    易语言HashMap类是一种在易语言编程环境中实现的高效数据结构,它主要用于存储键值对(key-value pairs),提供快速的数据存取。HashMap类基于哈希表(Hash Table)原理,通过计算键的散列值来确定数据在内存中的...

    深入arraylist,linkedlist,hashmap,hashset源码(2012/3/18)

    在Java编程语言中,ArrayList、LinkedList、HashMap和HashSet是四个非常重要的集合类,它们分别代表了不同类型的数据结构。这篇文章将深入探讨这些类的源码,以帮助我们更好地理解和运用它们。 首先,ArrayList是一...

    HashMap死循环原因分析.docx

    HashMap死循环原因分析 HashMap是Java中常用的数据结构,但是它在多线程环境下可能会出现死循环的问题,使CPU占用率达到100%。这种情况是如何产生的呢?下面我们将从源码中一步一步地分析这种情况是如何产生的。 ...

    用hashmap实现词典查询

    7. **性能监控与调整**:在实际应用中,需要监控HashMap的负载因子(已存储元素数量与HashMap容量的比值),当负载因子过高时,HashMap会自动扩容,但这会带来一定的性能开销。可以通过适当调整初始容量和负载因子...

    自定义map实现java的hashmap

    在Java编程中,HashMap是一个非常重要的数据结构,它实现了Map接口,提供了键值对的存储功能,具有快速存取和高效查找的特点。HashMap基于哈希表(也称为散列表)原理,通过键对象的哈希码来定位元素,进而实现O(1)...

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...

    基于JavaScript的HashMap实现

    在JavaScript中,HashMap是一种常用的键值对存储结构,它提供了快速的插入、删除和查找操作。JavaScript本身并不直接支持HashMap,但我们可以利用对象(Object)的特性来模拟HashMap的实现。这篇博客“基于...

    java HashMap原理分析

    Java HashMap原理分析 Java HashMap是一种基于哈希表的数据结构,它的存储原理是通过将Key-Value对存储在一个数组中,每个数组元素是一个链表,链表中的每个元素是一个Entry对象,Entry对象包含了Key、Value和指向...

Global site tag (gtag.js) - Google Analytics