`
LXL_yes777
  • 浏览: 11267 次
文章分类
社区版块
存档分类
最新评论

HashMap浅析

 
阅读更多

        HashMap浅析

在分析HashMap之前,我想先大致讲一下集合框架的几个接口及其分类。

JAVA里面有一个类集的概念。所谓的类集就是一个动态的对象数组,最重要的是类集框架本身不受对象数组长度的限制。在整个JAVA类集中最常用的类集接口及他们的关系如下如所示:

 
             

 

 

 

       

                      

 

HashMap

1.HashMap的数据结构

    在知道HashMap是什么之前,我们先来看一下HashMap它的底层数据结构,如图所示,HashMap是一个数组和链表相结合,横向是一个数组,纵向是一个链表。

当我们先建一个HashMap的时候,就会初始化一个这样的数组。

 

 
 

 

 

在存放key—value键值对时,先将键值对封装成Entry对象,再把Entry这个对象存入数组中。一个Entry对象有四个属性:keyvaluehash, next。而next类似于指针一样,指向下一个元素的引用。

当我们HashMap中存放(put)元素A时,先根据keyhash值得到A元素在数组中的下标位置,如果这个位置上没有其他元素,便可将A元素直接存入此位置;如果这个位置上已经存放了其他元素B,那么在此位置上的元素将以链表的形式存储,将新加入的元素A放在链头,最先加入的元素B放在链尾,即将A的属性next指向元素B

同样的,从HashMap表中取出(get)某一个元素时,也要首先计算keyhash值得到此元素在数组中的存储位置,然后通过keyequals()方法在链表中找出相应的元素。写到这里我们知道,数组存储位置上,链表的长度越短,查询的速度越快,效率也就越高,所以怎么样让链表尽可能的长度短一点,这就需要有一个好的Hash函数了。

 

我们看到,在eclipse中,他的hash值是通过keyhashcode进行某种运算得到的;

代码如下:

 

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

 

   

在存放或获取时,获取的数组的下标位置由以下方法得到,

 int i = indexFor(hash, table.length);

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

 

 

 

 

 

在存放某一个元素时,方法如下: 

 public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

 

 

 

        如此一来,HashMap底层的数据结构就大致缕清楚了,亲们,你懂了吗........

  • 大小: 5.4 KB
  • 大小: 5.1 KB
  • 大小: 5.4 KB
  • 大小: 14.3 KB
  • 大小: 14.3 KB
  • 大小: 5.4 KB
  • 大小: 5.1 KB
分享到:
评论
1 楼 luliangy 2013-01-14  
学弟先把博客标题写对了撒~

相关推荐

    Java中的HashMap浅析

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

    hashmap 实例

    hashmap实例 hashmap实例hashmap实例hashmap实例

    HashMap部分源码分析

    HashMap数据结构,HashMap的构造方法,HashMap的put,HashMap的get

    hashmap面试题_hashmap_

    hashmap相关的面试题

    HashMap介绍和使用

    HashMap介绍和使用

    HashMap原理.docx

    HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改HashMap是非synchronized,所以HashMap很快...

    HashMap存放.doc

    HashMap存放.doc

    hashmap实现原理

    hashmap的底层及源码解析,很适合大家的学习,不要积分。

    HashMap排序

    hashMap排序,hashmap使用还是比较频繁。这时自己写的一个实现hashmap排序的例子

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

    HashMap为什么是线程不安全的?如何解决HashMap的线程不安全问题?

    Javascript实现和操作HashMap

    Javascript实现和操作HashMap,压缩包里面有hashmap定义和操作的例子

    HashMap.js

    模拟java中的HashMap类js类对象,可以与js的Array类对象配合使用

    Hashmap详解

    Hashmap详解

    HashMap详解(通俗易懂)

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

    HashMap类.rar

    HashMap类.rar

    Java SE程序 HashMap类

    Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序...

    HASHMAP缓存.txt

    HASHMAP缓存.txt HASHMAP缓存.txt

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别.docx

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别。HashMap、HashTable和HashSet是Java中常用的数据结构,它们的底层实现原理以及区别如下:HashMap底层实现原理: HashMap基于哈希表(HashTable)...

    HashMap和HashTable的区别和不同

    记得刚毕业那会准备面试,看过不少面试题,里面有个说出HashMap和HashTable不同的题目,我那会面试的时候也遇到不少次这个问题,还隐约记得当时的回答是这样的: HashTable是比较旧的版本;HashTable是线程安全的,...

    C语言实现hashMap

    C语言实现hashMap,包含创建hashMap、插入hashMap、查找hashMap、删除hashMap,已经若干经典的hash函数。文章链接:https://blog.csdn.net/sxf1061700625/article/details/109594495

Global site tag (gtag.js) - Google Analytics