双列集合——HashMap,LinkedHashMap,TreeMap基本介绍
HashMap
不需要学习额外的新的方法,直接使用map接口里的方法就可以了。
只要学习一下hashmap本身的一些特点就可以了。
特点
hash表底层:
数组+链表,jdk8时为了提高性能又在里面加上了红黑树。
当创建了一个hashmap对象的时候,底层首先还是会创建一个长度为16,默认加载因子为0.75的数组,再利用put方法就可以添加数据了。
put方法底层首先会创建一个entry对象,entry对象里面记录的就是要添加的键和值,然后利用键计算出键的hash值,只要键的hash值就可以了,再计算出在数组中应存入的索引,如果该位置值为null, 直接就添加进去了。
如果位置不为null,调用equals方法比较键的属性值。如果键的数据一样,就会覆盖原有的entry对象;如果不一样,就会添加新的entry对象:
jdk8以前,新元素会添加到数组中,原先的挂在下面形成一条链表。
jdk8以后,新的直接挂在下面形成一条链表:
并且为了提高性能,链表的长度超过8且数组长度>=64时,链表自动转成红黑树:
总结
hashmap练习一:存储自定义对象
hashmap练习二:利用map集合进行统计
LinkedHashMap
辈分比较低,他爹是hashmap。
所以同样不需要额外学习方法,直接用map接口里的就可以。
特点
同样都是由键决定的,跟值没有任何关系。
实现:
四个元素怎么存到hash表中,又怎么保证存和取的顺序的:
添加元素时候和他爹一样,同样会调用hashcode方法,计算出键的hash值,再计算出在数组中应存入的位置,如果说该位置是有元素的,就使用equals方法去比较键是否相同,如果该位置是没有元素的,就直接添加进去。同时在底层多了一条双向链表,链表头节点就是刚刚添加的第一个元素。
添加第二个元素:
当把第二个元素按照上面添加成功后,第一个元素内会记录第二个元素的地址值,第二个元素也会记录第一个元素的地址值,这样就形成了双向链表。
添加第三个元素:
通过上面流程,计算出应该存入索引是3,但是这里已经有元素了,就会通过equals方法比较键的属性值是否相同,相同就覆盖,不相同:在jdk8以后就会挂在下面,与此同时,第二个元素和第三个元素直接还要再互相记录地址值,现在在双向链表中就已经把这三个元素按照添加的顺序连在一起了。
添加第四个元素:
第三个元素和第四个元素之间也会互相记录一次地址值。四个元素添加完,双向链表的头节点就是添加的第一个元素,尾节点就是添加的最后一个元素。
遍历的时候就是从双向链表的头节点开始一个节点一个节点往后遍历。这样得到的数据就和添加的顺序一致了。
代码演示
发现键是唯一的,和他爹hashmap一样。
换顺序,并且覆盖:
输出的和添加的顺序一样,并且key一样的时候覆盖了。
TreeMap
也没有额外的方法要学,只要知道他本身特点和底层原理就可以了。
特点
排序规则:都写的时候以第二个为准。
代码演示需求一
升序演示
升序原因:Integer源码
这里已经指定了排序的规则:这个规则就是升序排列
x是this,y是红黑树中已经存在的元素:
这段代码此时:
降序演示
第一种方式不能用了,就要用第二种方式,在括号中传入比较器对象
鼠标点下小括号trl+p:
运行结果:
现在是升序:
想要降序:
代码演示需求二
代码演示需求三
HashTable和Properties两个集合
里面有和io相关的方法,等io学完再学