1.假设让我们去设计HashMap如何去做?
源码预热 ---->源码猜疑------》源码分析 -------》总结思想
1. 源码预热:首先我们应该通过简单的程序来运用一下,熟悉一下HashMap怎样取用
2. 源码猜疑:就是用我们以前的知识进行合理的猜测。
3. 源码分析:通过上述的猜测,可以让我们继续把源码看下去。
4. 总结思想:通过看源码来分析,我们的不足的地方。
ArrayList ---》主要用到思想就是数组,因为数组查找比较快。
LinkedList---》主要用到思想就是链表。因为删除和插入比较方便。
HashMap用到思想就是数组+链表。
2. 我们知道HashMap的思想,接下来就是我们去设计?
HashMap思想:数组+链表
数组:
最大值 ,初始化值,临界值,索引下标,这是我们所能想到的。
链表:
使用单向链表
java语言进行定义:
数组 : Object[] object ;
链表: class Node<E>{
Node<E> next;
E value;
E key:
}
简单画出草图:
3. 接下来我们可以点击去看源码(这时候我们应该是带着疑问和兴趣去看的)
但是我们就用Map里面的put方法去看的,往近点,在往近点,发现我们这么多代码,此时我们应该是比较难过的,发现里面比较复杂,不要紧,我们只需要先认证我们前面猜想:
数组:
链表:
3. 证明我们的猜想和hashmap初步设计差不多,但是就差一个hash值没有设计出来?
我们带着这样的疑问来看hash值的作用?在看问题之前,我们先要想到一下,为什么在入桶之前必须是随机的?
想要知道这个问题,我们先假设两种特殊情况?
1. 使用数组按照顺序存放会带来什么问题?
2.每一次入桶位置都是相同的会产生问题?
从上面这几种情况可以看出:我们必须保证每一次入桶的顺序的是随机的。
4. 如果让我们设计如何产生入桶的顺序是随机?
首先我们可能想到Random这个函数,产生随机数,但是这样能够准确保证数组是随机的吗?(不一定),那么还有什么方式来产生随机数
这是我们就可以看一下HashMap是如何设计产生随机数的?
5. 走进源码看HashMap如何产生随机数来定位桶的位置?