Java集合类的数据结构(2)

另外值得一说的就是HashMap在不知道初始长度进行初始化时,JDK1.6前默认长度为16,JDK1.6后默认长度为0。基本在JDK1.6中,需要初始化底层容器的集合都做出了这种优化。不会提前构造底层容器造成开销,会等到使用时才进行底层的初始化。

而HashMap默认长度设置为16,并且每次扩容都是2倍。这是为了方便底层的哈希数组进行取模时的运算,可以把取模的除法运算改写成位移运算,提升性能。

并且在JDK1.8中,HashMap关于取模运算还做了另一个优化。在JDK1.8之前,每次哈希数组扩容时,链表里的数据都会再次进行哈希运算。而在JDK1.8后,不需要再进行运算了,只需要在每个桶中选择一半数据往后移动oldLength位就行(oldLength是集合在扩容前的容量)。

1.2.2 TreeMap

而另一个常用的Map——TreeMap,底层就是用JAVA写了一个红黑树,感觉没什么好说的。有兴趣的可以回去翻翻数据结构的书。

1.2.3 LinkedHashMap

HashMap的每个Node还会以插入顺序相互关联成为双向链表。

1.3 Set

Set主要是SortedSet和HashSet。打开源码一看,分别new了一个TreeMap和HashMap,然后把数据存在了Key里。嗯,这就是Set的底层实现了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a9e5e60064fb2bb4e1a94ef33839f7ed.html