zoukankan      html  css  js  c++  java
  • JDK1.7 中的HashMap源码分析

    一、源码地址:

    源码地址:http://docs.oracle.com/javase/7/docs/api/

    二、数据结构

    JDK1.7中采用数组+链表的形式,HashMap是一个Entry<K,V>[] table数组,JDK1.8采用数组+链表/红黑树实现,当链表长度超过阈值,将链表转为红黑树。

    Entry代码如下:

    /** Entry是单向链表。    
         * 它是 “HashMap链式存储法”对应的链表。    
         *它实现了Map.Entry 接口,即实现getKey(), getValue(), setValue(V value), equals(Object o), hashCode()这些函数  
        **/  
        static class Entry<K,V> implements Map.Entry<K,V> {    
            final K key;    
            V value;    
            // 指向下一个节点    
            Entry<K,V> next;    
            final int hash;    
       
            // 构造函数。    
            // 输入参数包括"哈希值(h)", "键(k)", "值(v)", "下一节点(n)"    
            Entry(int h, K k, V v, Entry<K,V> n) {    
                value = v;    
                next = n;    
                key = k;    
                hash = h;    
            }    
       
            public final K getKey() {    
                return key;    
            }    
       
            public final V getValue() {    
                return value;    
            }    
       
            public final V setValue(V newValue) {    
                V oldValue = value;    
                value = newValue;    
                return oldValue;    
            }    
       
            // 判断两个Entry是否相等    
            // 若两个Entry的“key”和“value”都相等,则返回true。    
            // 否则,返回false    
            public final boolean equals(Object o) {    
                if (!(o instanceof Map.Entry))    
                    return false;    
                Map.Entry e = (Map.Entry)o;    
                Object k1 = getKey();    
                Object k2 = e.getKey();    
                if (k1 == k2 || (k1 != null && k1.equals(k2))) {    
                    Object v1 = getValue();    
                    Object v2 = e.getValue();    
                    if (v1 == v2 || (v1 != null && v1.equals(v2)))    
                        return true;    
                }    
                return false;    
            }    
       
            // 实现hashCode()    
            public final int hashCode() {    
                return (key==null   ? 0 : key.hashCode()) ^    
                       (value==null ? 0 : value.hashCode());    
            }    
       
            public final String toString() {    
                return getKey() + "=" + getValue();    
            }    
       
            // 当向HashMap中添加元素时,绘调用recordAccess()。    
            // 这里不做任何处理    
            void recordAccess(HashMap<K,V> m) {    
            }    
       
            // 当从HashMap中删除元素时,绘调用recordRemoval()。    
            // 这里不做任何处理    
            void recordRemoval(HashMap<K,V> m) {    
            }    
        }
    

    三、

  • 相关阅读:
    C#:基于WMI查询USB设备信息 及 Android设备厂商VID列表
    C#中 @ 的3种用途
    有关于 使用 命名管道 进行网络 进程间通信 的资料收集
    MySql LAST_INSERT_ID 【插入多条数据时】
    两个“不合理继承 ”的判定标识
    MYSQL 函数 字符串到整数
    Spring MVC 对于@ModelAttribute 、@SessionAttributes 的详细处理流程
    重构,拥有多个构造函数(重载)的类
    vue二级联动select
    gulp.dest用法详解
  • 原文地址:https://www.cnblogs.com/tonyluis/p/5697138.html
Copyright © 2011-2022 走看看