Java容器浅入深出之HashMap

这两天一直在看HashMap,这个Map感觉很优雅啊。本来是看List,看完之后接着看Set的,发现Set实现的底层大都是利用的Map,只好扭过头看Map。

底层原理

HashSet底层就是一个HashMap,这个HashSet保存数据,只保存key。value是一个通用的无效对象(不会被访问的对象,好像是空对象吧。。。没注意)

TreeSet底层就。。。和二叉树的目前真是不会, 太费脑子了。。。暂且会用即可

Map里面我感觉主要有两中实现:

  • 一种就是HashMap(HashTable和他差不多)
  • 一种就是TreeMap(表示这个Map的底层真的看不明白。。。只知道是二叉树实现的,但是二叉树本来就不太了解,所以就悲剧了。。。)

HashMap的底层啊,我感觉就是数组和链表的双重保存,但是这个数组的访问,它不是想ArrayList一样,野蛮的遍历一遍。而是将存入的新mapping保存为一个Entry,Entry.hash就是key.hashCode()。

然后HashMap使用一个indexOf静态方法,将指定key的哈希值和table.length“&”一下。得到新的Entry应该保存的index,然后将这个新的Entry保存到table[index]中。当然了, 不同对象的哈希值可能是一样的,于是如果同一个table[index]如果元素超出一个的话,就采用链表的方式保存。因此,一个HashMap的table[]中,不是说每一个index上都有元素,也不是说每一个index上都只有一个元素,而是随意分布的。可能table[index]上为空,而table[index+1]上却是一串Entry链表。

个人感觉这个HashMap太精辟了。即利用了LinkedList的链表添加元素快捷又避免了LinkedList那样的链表过长导致的索引浪费资源,又利用了ArrayList的数组操作方便又避免了ArrayList那样的结构变化频繁导致的重构资源浪费(个人感觉HashMap的重构频率远远低于ArrayList)

差不多了, 好几天了,一直琢磨Collection的代码, 从明天开始要开始实战了。做项目,实践自己的理论知识!
计划大二结束前,完成自己学习计划的第二阶段,大三主攻第三阶段,争取将来进入社会是以一个有独特编程思想和构架能力的设计师,而不是一个到处泛滥的码字员。