1、HashMap jdk1.7和1.8中的区别
-
底层数据结构不一样,1.7中使用数组+链表,1.8使用数组+链表+红黑树。
数组默认大小为16,负载因子为0.75,如果HashMap的size大于16*0.75就要扩容了,扩容方式为创建一个新数组,大小为16乘以2,然后重新rehash操作;
1.8中当链表长度大于8(默认值)时采用红黑树,红黑树是一种自平衡二叉树,能够防止所有节点在同一侧(线性结构),从而提高查询性能(线性结构跟链表差不多,时间复制度O(n)),红黑树如何判断是左节点还是右节点,需要key实现Comparable接口; -
插入链表时不同,1.7中待插入节点总是插入链表的头部,1.8中则是插入链表的表尾。
1.7在多线程环境下扩容时会存在死循环情况,究其原因就是1.7中把节点插入到链表头部,如:链表A->B->C,第一次扩容时应该是C->B->A,如果在变成B->A时又有一个线程扩容,那么就可能出现A->B,这样就出现AB死循环了;
1.8则不会出现以上死循环情况,因为它总是插入链表表尾,顺序永远都是A->B->C; -
根据key的hashcode求数组下标时算法不一样,内部大量应用位操作(左移、右移、&等等),位操作更快,性能更好。
1.7更加复杂,因为它需要尽可能避免哈希冲突,哈希冲突多了链表就长了,链表的查询性能很差&#