码迷,mamicode.com
首页 > 其他好文 > 详细

hashMap解读

时间:2017-05-25 19:52:29      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:快速   引用   实现   机制   ble   .com   log   根据   return   

  当初来公司时候,被问了一个问题,叫重写一个hashMap怎么写。数据结构捉鸡。。。所以,现在决定补上这东西。

  好啦,首先,先写点东西。

  HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类。虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 HashMap 来实现的。 
  通过 HashMap、HashSet 的源代码分析其 Hash 存储机制
  实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,这样可以保证能快速存、取集合元素;对于 HashMap 而言,系统 key-value 当成一个整体进行处理,系统总是根据 Hash 算法来计算 key-value 的存储位置,这样可以保证能快速存、取 Map 的 key-value 对。
  在介绍集合存储之前需要指出一点:虽然集合号称存储的是 Java 对象,但实际上并不会真正将 Java 对象放入 Set 集合中,只是在 Set 集合中保留这些对象的引用而言。也就是说:Java 集合实际上是多个引用变量所组成的集合,这些引用变量指向实际的 Java 对象。 

一、从put分析table结构:

public V put(K key, V value) {
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);
        }
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);
        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;
    }

那我们发现,数据都是存放在table里,table是什么?table是一个Entry<K,V>[],键值对数组。存放方法如下:

技术分享

技术分享

也就是说,用Entry,存放key、value、nextEntry,三个核心数据,就可以用table数组来实现hashMap。

二、大小、负载因子

 待续。。。

hashMap解读

标签:快速   引用   实现   机制   ble   .com   log   根据   return   

原文地址:http://www.cnblogs.com/niidy/p/6905458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!