Map HashSet & HashMap (JAVA8)
概述
HashSet和HashMap,二者在Java里都有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashSet里面有一个HashMap(适配器模式)。
HashMap实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素;不保证元素顺序,根据需要该容器可能会对元素重新哈希,元素的顺序也会被重新打散,因此不同时间迭代同一个HashMap的顺序可能会不同。根据对冲突的处理方式不同,哈希表有两种实现方式,一种开放地址方式(Open addressing),另一种是冲突链表方式(Separate chaining with linked lists)。在JDK8中,是由 数组+链表+红黑树 组成。
在查找数据的时候,根据 hash 值我们能够快速定位到数组的具体下标,之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度,为 O(n)。在 Java8 中,当链表中的元素达到了 8 个时,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。