数组:

数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;

链表:

链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。

HashMap:

HashMap 的数据结构是综合了数组和链表的结构来实现对数据的存储。

哈希表

那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。

哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表的数组” ,如图:

        

从上图我们可以发现哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。 那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得数组的存储位置索引,也就是元素的key的哈希值对数组长度取模得到。比如上 述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的 位置。

  HashMap其实也是一个线性的数组实现的,所以可以理解为其存储数据的容器就是一个线性数组。这可能让我们很不解,一个线性的数组怎么实现按键值对来存取数据呢?这里HashMap有做一些处理。

  首先HashMap里面实现一个静态内部类Entry,其重要的属性有 key , value, next,从属性key,value我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,我们上面说到HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。

    /**
     * The table, resized as necessary. Length MUST Always be a power of two.
     */

transient Entry[] table;

HashMap的存取实现

既然是线性数组,为什么能随机存取?这里HashMap用了一个小算法,大致是这样实现:

// 存储时:
int hash
= key.hashCode(); // 这个hashCode方法这里不详述,只要理解每个key的hash是一个固定的int值
int index
= hash % Entry[].length;
Entry[index] = value;

// 取值时:
int hash
= key.hashCode();
int index
= hash % Entry[].length;
return Entry[index];

1)put

 
疑问:如果两个key通过hash%Entry[].length得到的index相同,会不会有覆盖的危险?

  这里HashMap里面用到链式数据结构的一个概念。上面我们提到过Entry类里面有一个next属性,作用是指向下一个Entry。打个比 方, 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?HashMap会这样做:B.next = A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起。所以疑问不用担心。也就是说数组中存储的是最后插入的元素。到这里为止,HashMap的大致实现,我们应该已经清楚了。

 public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value); //null总是放在数组的第一个链表中
        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;
            //如果key在链表中已存在,则替换为新value
            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;

}

void addEntry(int hash, K key, V value, int bucketIndex) {
    Entry<K,V> e = table[bucketIndex];
    table[bucketIndex] = new Entry<K,V>(hash, key, value, e); //参数e, 是Entry.next
    //如果size超过threshold,则扩充table大小。再散列
    if (size++ >= threshold)
            resize(2 * table.length);
}

  当然HashMap里面也包含一些优化方面的实现,这里也说一下。比如:Entry[]的长度一定后,随着map里面数据的越来越长,这样同一 个index的链就会很长,会不会影响性能?HashMap里面设置一个因子,随着map的size越来越大,Entry[]会以一定的规则加长长度。

2)get

 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)null key的存取

null key总是存放在Entry[]数组的第一个元素。

   private V putForNullKey(V value) {
        for (Entry<K,V> e = table[0]; e != null; e = e.next) {
            if (e.key == null) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;
        addEntry(0, null, value, 0);
        return null;
    }
 
    private V getForNullKey() {
        for (Entry<K,V> e = table[0]; e != null; e = e.next) {
            if (e.key == null)
                return e.value;
        }
        return null;

}

 
 
 
 

4)确定数组index:hashcode % table.length取模

HashMap存取时,都需要计算当前key应该对应Entry[]数组哪个元素,即计算数组下标;算法如下:

   /**
     * Returns index for hash code h.
     */
    static int indexFor(int h, int length) {
        return h & (length-1);
    }
 
按位取并,作用上相当于取模mod或者取余%。
这意味着数组下标相同,并不表示hashCode相同。
 

5)table初始大小

 
  public HashMap(int initialCapacity, float loadFactor) {
        .....         // Find a power of 2 >= initialCapacity
        int capacity = 1;
        while (capacity < initialCapacity)
            capacity <<= 1;
        this.loadFactor = loadFactor;
        threshold = (int)(capacity * loadFactor);
        table = new Entry[capacity];
        init();
    }
 

注意table初始大小并不是构造函数中的initialCapacity!!

而是 >= initialCapacity的2的n次幂!!!!

————为什么这么设计呢?——

3. 解决hash冲突的办法

  1. 开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
  2. 再哈希法
  3. 链地址法
  4. 建立一个公共溢出区

Java中hashmap的解决办法就是采用的链地址法。

4. 再散列rehash过程

当哈希表的容量超过默认容量时,必须调整table的大小。当容量已经达到最大可能值时,那么该方法就将容量调整到Integer.MAX_VALUE返回,这时,需要创建一张新表,将原表的映射到新表中。

   /**
     * Rehashes the contents of this map into a new array with a
     * larger capacity.  This method is called automatically when the
     * number of keys in this map reaches its threshold.
     *
     * If current capacity is MAXIMUM_CAPACITY, this method does not
     * resize the map, but sets threshold to Integer.MAX_VALUE.
     * This has the effect of preventing future calls.
     *
     * @param newCapacity the new capacity, MUST be a power of two;
     *        must be greater than current capacity unless current
     *        capacity is MAXIMUM_CAPACITY (in which case value
     *        is irrelevant).
     */
    void resize(int newCapacity) {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }
        Entry[] newTable = new Entry[newCapacity];
        transfer(newTable);
        table = newTable;
        threshold = (int)(newCapacity * loadFactor);

}

    /**
     * Transfers all entries from current table to newTable.
     */
    void transfer(Entry[] newTable) {
        Entry[] src = table;
        int newCapacity = newTable.length;
        for (int j = 0; j < src.length; j++) {
            Entry<K,V> e = src[j];
            if (e != null) {
                src[j] = null;
                do {
                    Entry<K,V> next = e.next;
                    //重新计算index
                    int i = indexFor(e.hash, newCapacity);
                    e.next = newTable[i];
                    newTable[i] = e;
                    e = next;
                } while (e != null);
            }
        }

}

5. HashMap 与Hashtable 的区别

5.1   类的实现不同

public class Hashtable extends Dictionary implements Map, Cloneable, Serializable 

public class HashMap  extends AbstractMap implements Map, Cloneable, Serializable   

Hashtable 继承自 Dictiionary;  而 HashMap继承自AbstractMap

5.2  类方法的put实现比较如下

aaarticlea/png;base64,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" alt="" />

因此可以得出如下结论:

                  HashMap                Hashtable

父类                  AbstractMap          Dictiionary

是否同步            否                            是

k,v可否null     是                            否

补充:
Hashtable 有一个 contains方法,容易引起误会,所以在HashMap里面已经去掉了;  当然,2个类都用containsKey和containsValue方法。

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,

主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

支持原创!

本文引用如下博客:

1. http://blog.csdn.net/vking_wang

2. http://blog.csdn.net/shohokuf/article/details/3932967

哈希,哈希表,哈希Map的更多相关文章

  1. 查找->动态查找表->哈希表

    文字描述 哈希表定义 在前面讨论的各种查找算法中,都是建立在“比较”的基础上.记录的关键字和记录在结构中的相对位置不存在确定的关系,查找的效率依赖于查找过程中所进行的比较次数.而理想的情况是希望不经过 ...

  2. redis哈希缓存数据表

    redis哈希缓存数据表 REDIS HASH可以用来缓存数据表的数据,以后可以从REDIS内存数据库中读取数据. 从内存中取数,无疑是很快的. var FRedis: IRedisClient; F ...

  3. Java集合(九)哈希冲突及解决哈希冲突的4种方式

    Java集合(九)哈希冲突及解决哈希冲突的4种方式 一.哈希冲突 (一).产生的原因 哈希是通过对数据进行再压缩,提高效率的一种解决方法.但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致 ...

  4. 哈希表(Hash Map)

    今天第一次做Leetcode用到了散列表,之前学的数据结构的内容都忘了,正好趁热打铁补一补. 摘自其他博客的一个整合. 一.哈希表简介 数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈 ...

  5. 算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

    今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...

  6. hash表/哈希表

    https://blog.csdn.net/duan19920101/article/details/51579136 简单理解就是一个通过映射直接查找的表(散列表),用哈希函数将数据按照其存储特点进 ...

  7. Memcached 笔记与总结(5)Memcached 的普通哈希分布和一致性哈希分布

    普通 Hash 分布算法的 PHP 实现 首先假设有 2 台服务器:127.0.0.1:11211 和 192.168.186.129:11211 当存储的 key 经过对 2 (2 台服务器)取模运 ...

  8. 查找表set和map 349, 350

    两类查找问题: 1)查找有无: - 某个元素是否存在,通常使用set(集合) 2)查找对应关系(键值对应) - 某个元素出现了几次,map(字典) set和map都不允许里面的键值重复. 常见操作: ...

  9. hadoop 多表join:Map side join及Reduce side join范例

    最近在准备抽取数据的工作.有一个id集合200多M,要从另一个500GB的数据集合中抽取出所有id集合中包含的数据集.id数据集合中每一个行就是一个id的字符串(Reduce side join要在每 ...

  10. POJ3087 Shuffle'm Up —— 打表找规律 / map判重

    题目链接:http://poj.org/problem?id=3087 Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

随机推荐

  1. MVC - HtmlHelper类

    传统的Html元素不能和服务端数据进行绑定 HtmlHelper类提供了一系列的方法来生成Html元素 并可以实现与数据绑定在一起 然后生成Html Html.BeginForm(actionName ...

  2. web服务器决定支持多少人同时在线的因素

    经常遇到一些做WEB用户咨询服务器支持在线人数问题,在此做个简单介绍.非技术性讨论,如有疏漏或错误,敬请原谅和指导.以普通单路服务器为例,CPU处理多个进程,并非是同一时刻处理的,(可以精确到1/10 ...

  3. byte数组与对象之间的相互转换

    在进行网络通信时可能需要传输对象,如果用NIO的话,只能用Bytebuffer和channel直接 通过ByteArray*Stream和Object*Stream可以将byte数组和对象进行相互的转 ...

  4. oracle学习----特殊的连接方式

    1.笛卡儿积 merge join cartesion SQL> select ename,dname from emp,dept; 已选择56行. 执行计划------------------ ...

  5. Bootstrap教程

    Bootstrap 教程 Bootstrap 教程

  6. postgresql行转列并拼接字符串

    有这样一张表: ; id |   kw   ----+--------  1 | big  1 | hello  2 | oracle  2 | small  2 | apple  3 | shit( ...

  7. Android测试分析3

    一个基本的测试用例-- 如果是在eclipse中开发,那么需要在AndroidManifest.xml中加入如下两段代码:    <uses-library android:name=" ...

  8. nyoj349 poj1094 Sorting It All Out(拓扑排序)

    nyoj349   http://acm.nyist.net/JudgeOnline/problem.php?pid=349poj1094   http://poj.org/problem?id=10 ...

  9. jasper2

    package jasper; import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;impo ...

  10. javascript document对象 第21节

    <html> <head> <title>DOM对象</title> <style type="text/css"> t ...