JAVA基础第五章-集合框架Map篇
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地!
我将会持续更新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