Java HashSet学习笔记

owo

底层原理

  • 创建默认长度 ,默认加载因子为 的数组 ,当数组中存放超过 个元素,数组扩容,长度为原来2倍
  • 根据元素的哈希值和数组的长度计算出应存入的位置
  • 判断当前位置是否为 ,若 则直接存入
  • 如果不为 ,调用equals方法依次比较此位置上所有元素属性值,若有一个相同,则不存入,否则放在这个元素链尾(新元素挂在老元素下面)
  • 若数组长度大于 ,有一个位置元素链长度大于 ,则此元素链转为红黑树

版本差异

JDK8以前

  • 数组+链表
  • 新元素存入数组,老元素挂在新元素下面

JDK8以后

  • 数组+链表+红黑树
  • 新元素存入数组,直接挂在老元素下面
  • 链表长度超过8,数组长度大于等于64时,链表转为红黑树

注意事项

  • hashCode默认用地址,不同的对象就算属性值相同也不一定哈希相同
  • 若集合中存储的是自定义对象,必须重写hashCodeequals方法
img_show