HashMap源代码分析

1.HashMap简介

  • HashMap继承了AbstractMap类该类实现了Map接口,HashMap同时实现了Map接口。
  • HashMap是key,value结构的键值对,支持key和value都为null
  • HashMap和HashTable功能很相近,可以把它看做非线程安全的HashTable和允许key,value为空。

2.分析下HashMap的内部结构

hashmap结构图.png

HashMap有两个重要的参数:一个是加载因子,另一个是初始容量

//初始容量为16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
//默认加载因子是0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;

3.HashMap的构造函数

//设置初始容量和加载因子
public HashMap(int initialCapacity, float loadFactor)
//设置初始容量和默认加载因子
public HashMap(int initialCapacity)
//默认构造,使用默认容量和默认加载引起
public HashMap()
//使用已经存在的map创建新的map
public HashMap(Map<? extends K, ? extends V> m)

4.HashMap主要对外接口
4.1 get方法

public V get(Object key) {
        //如果key是null的话
        if (key == null)
            return getForNullKey();
        //key不为空调用getEntry方法
        Entry<K,V> entry = getEntry(key);
        return null == entry ? null : entry.getValue();
    }

private V getForNullKey() {
        //判断大小
        if (size == 0) {
            return null;
        }
        //null存在table[0]上,返回value的值
        for (Entry<K,V> e = table[0]; e != null; e = e.next) {
            if (e.key == null)
                return e.value;
        }
        return null;
    }

final Entry<K,V> getEntry(Object key) {
        //如果map的size为0,那么就直接返回null
        if (size == 0) {
            return null;
        }
        //计算hash值
        int hash = (key == null) ? 0 : hash(key);
        //获取到hash值对应的table中的链表
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            //遍历该链表,判断key是否相等
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

5.HashMap存储数据是无序的我们看下代码的例子

HashMap<String,Integer>  store = new HashMap<String,Integer>();
        store.put("22", 33);
        store.put("44", 44);
        store.put("55", 55);
        for(Map.Entry<String,Integer> ele :store.entrySet()) {
            System.out.println(ele.getKey() + "--" + ele.getValue());
        }

运行结果如下:

44--44
55--55
22--33
说明并不是按照我们存储的顺序存储的。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,288评论 0 16
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,516评论 0 3
  • HashMap 是 Java 面试必考的知识点,面试官从这个小知识点就可以了解我们对 Java 基础的掌握程度。网...
    野狗子嗷嗷嗷阅读 6,686评论 9 107
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,754评论 18 399
  • 失眠小姐决定去上海的那个黄昏,留了一张便条即匆匆离开,害怕与熟人打照面,害怕被询问去处。慌张的似个新手小偷。失眠小...
    闲人张阅读 476评论 1 6