本文最后更新于6 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
- 版本差异
- HashMap1.7:
- 采用头插法,可能会导致链表循环(尾节点意外指向头节点或意外操作[插入已有元素],或无 环检测)
- HashMap1.8:
- 采用尾插法,数据结构相比之前的数组+链表,多了一个红黑树
- HashMap1.7:
- 线程安全
- 如果在插入数据时多个线程命中了同一个槽,可能会有数据覆盖的情况发生
- 解决方案:
- 直接就加锁,但是会牺牲性能
- 使用hashTable,其实就是加了synchronized锁(悲观锁),性能更高
- 使用concurrentHashMap,本质是减少了锁的粒度,减少线程竞争来保证高效
HashSet:无序唯一的元素集合
- 高性能:
- 数据结构:哈希表,键值对形式性能高效
- hashcode():向HashSet添加对象时,会调用该对象的hashcode()方法,返回哈希码。
- 哈希码:HashSet会计算桶的索引,快速索引
- 元素存储:将元素存储到哈希码索引对应的位置
- [Tips]哈希冲突:哈希码互相相同
- {解决方案}:在桶内部存储链表或树,发生冲突后会将新元素添加到该桶的树或者链表中
- [Tips]哈希冲突:哈希码互相相同
- 元素存储:将元素存储到哈希码索引对应的位置