业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地!

我将会持续更新java基础知识,欢迎关注。

 

往期章节:

map接口的实现类大致有 HashMap、LinkedHahMap、TreeMap、HashTable 四类。

 

 

Map

从这个名字上我们可以知道是“地图、映射”的意思。

map集合使用键(key)值(value)来保存数据,其中值(value)可以重复,但键(key)必须是唯一,也可以为空,但最多只能有一个key为空。

HashMap

 对于hashMap,我们需要从名字中的hash入手,去分析他,hash,我们经常叫做哈希表又或者叫做散列函数。

在 JDK 中,Object 的 hashcode 方法是本地方法,也就是用 c 语言或 c++ 实现的,该方法直接返回对象的 内存地址。

先看一张图

 如上图中的结构过程整个形成过程大致如下:

1,假如我们先插入一个键值对,然后进行hash后,存放在了数组的1号位置;

2,然后我们再插入一个键值对 ,经过hash后,存在了4号位置,;

3,再然后我们又插入了一个键值对,这个时候很不幸,与1号位置冲突,然后这个时候会在1号位置之后追加一个链表,让1号位置的Entry中的next指向这次最新追加的这一个键值对,以此类推;

从上图中我们大概可以了解到,整个的HashMap的数据结构就是 数组+链表(在jdk1.8中确切的说是Node对象,只不过Node实现了Entry接口),我们先看看Node 类的代码:

从上面的代码我们可以看出主要有4个属性,key  value、 hash、以及再包含一个自身的类对象Node~ 这部分其实和我们上一节讲过的LinkedList的数据结构很像

当我们在代码中我们会调用put方法,源码如下:

复制代码
 1     /** 2      * Associates the specified value with the specified key in this map.  3      * If the map previously contained a mapping for the key, the old  4      * value is replaced.  5      *  6      * @param key key with which the specified value is to be associated  7      * @param value value to be associated with the specified key  8      * @return the previous value associated with <tt>key</tt>, or  9      *         <tt>null</tt> if there was no mapping for <tt>key</tt>. 10      *         (A <tt>null</tt> return can also indicate that the map 11      *         previously associated <tt>null</tt> with <tt>key</tt>.) 12      */13     public V put(K key, V value) { 14         return putVal(hash(key), key, value, false, true); 15     }
复制代码

从注释中我们可以了解大意:“关联一个指定的值和键在这个map 如果map显然已经包含了这个键的映射,那么旧值就会被替代”

在这个代码中继续调用putval方法,我们继续看源码:

复制代码
 1   /** 2      * Implements Map.put and related methods