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) {    
            }    
        }
    

    三、

  • 相关阅读:
    delphi 常用的将窗口置前的函数
    delphi中Message消息的使用方法
    批处理 删除文件
    CDR话单主要字段介绍
    集成学习算法总结----Boosting和Bagging
    Benchmark简介
    脚本中export不起作用的原因分析
    RAID详解[RAID0/RAID1/RAID10/RAID5]
    基于DPI(深度报文解析)的应用识别
    DPI (Deep Packet Inspection) 深度包检测技术
  • 原文地址:https://www.cnblogs.com/tonyluis/p/5697138.html
Copyright © 2011-2022 走看看