关于java的HashMap
2016-01-29 12:45
281 查看
直入主题。点击如入HashMap的源码,我们能看到
map也是用数组实现的,只不过数组类型是
,而Entry也实现了Map,而我们实际上总是说的map key对应的其实是Entry的key。
接下来我们来看Entry的属性,我们能看到我们最熟悉的key、value、hash,但是next是什么呢?我们这里先保持下疑问。
接下来我们来看我们最常用的put方法,!
我们可以看出答题可以分四部分。第一,根据hashcode获得hash值;第二,根据hash值获得对应数组的index;第三,遍历对应数组的元素(在这里我们就可以看到Entry.next的作用了,看来Entry保存的是一个链,相同的hash值就可以保存在这个链里),如果找到key对应的值,然后将其替换,返回原来的值;第四,如果没有找到相同的key,就添加一个新的Entry。
接下来我们看addEntry这个方法,
从这个方法里能看出,e记原来的数组元素引用,然后new一个新的Entry将其赋值为数组元素引用,然后可以看出e也是有传入新Entry对象的,这样就可以说通了,e是赋予next的,这样原来的链不会丢失(可以通过第一个元素的next获得),每次添加进一个新都会成为新的header,这模式就是链表的结构了。后面我们还会hashmap根据自己策略进行扩容。
所以总体的来说,hash就是数组和链表的实现。
map也是用数组实现的,只不过数组类型是
,而Entry也实现了Map,而我们实际上总是说的map key对应的其实是Entry的key。
接下来我们来看Entry的属性,我们能看到我们最熟悉的key、value、hash,但是next是什么呢?我们这里先保持下疑问。
接下来我们来看我们最常用的put方法,!
我们可以看出答题可以分四部分。第一,根据hashcode获得hash值;第二,根据hash值获得对应数组的index;第三,遍历对应数组的元素(在这里我们就可以看到Entry.next的作用了,看来Entry保存的是一个链,相同的hash值就可以保存在这个链里),如果找到key对应的值,然后将其替换,返回原来的值;第四,如果没有找到相同的key,就添加一个新的Entry。
接下来我们看addEntry这个方法,
从这个方法里能看出,e记原来的数组元素引用,然后new一个新的Entry将其赋值为数组元素引用,然后可以看出e也是有传入新Entry对象的,这样就可以说通了,e是赋予next的,这样原来的链不会丢失(可以通过第一个元素的next获得),每次添加进一个新都会成为新的header,这模式就是链表的结构了。后面我们还会hashmap根据自己策略进行扩容。
所以总体的来说,hash就是数组和链表的实现。
相关文章推荐
- SpringMVC+BUI实现文件上传(附详解,源码下载)
- SpringMVC+BUI实现文件上传(附详解,源码下载)
- SpringMVC+BUI实现文件上传(附详解,源码下载)
- SpringMVC+BUI实现文件上传(附详解,源码下载)
- java web中的Exception in thread ContainerBackgroundProcessor[StandardEngine[Catalina]]
- 网上图书商城项目学习笔记-014购物车模块页面javascrip
- Java强引用、 软引用、 弱引用、虚引用
- Java NIO 基础
- Eclipse 安装FindBugs插件
- Java语法总结--Java集合类
- 用Java写俄罗斯方块
- java常用功能
- Spring中 @Autowired标签与 @Resource标签 的区别
- javaweb项目结构了解
- 基于Spring MVC的Web应用开发(12) - Form
- java String字符串转成json数组并且遍历
- 基于Spring MVC的Web应用开发(11) - Views
- java中的Stack使用
- java获取某个文件夹下的所有文件、删除文件
- 基于Spring MVC的Web应用开发(10) - Validation