Java集合篇(二)

Set的典型实现:HashSet是无序、不重复的集合。
1.HashSet:
  • 无序、不重复
  • 不是线程安全的
  • 值可以为null
  • 其底层其实是一个数组,存在的意义是加快查询速度。我们知道在一般的数组中,元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的关系,因此,在数组中查找特定的值时,需要把查找值和一系列的元素进行比较,此时的查询效率依赖于查找过程中比较的次数。而 HashSet 集合底层数组的索引和值有一个确定的关系:index=hash(value),那么只需要调用这个公式,就能快速的找到元素或者索引。
  • 对于 HashSet: 如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同
    • 向HashSet集合中存入一个元素时,HashSet会先调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置
    • 如果 hashCode 值不同,直接把该元素存储到 hashCode() 指定的位置
    • 如果 hashCode 值相同,那么会继续判断该元素和集合对象的 equals() 作比较
    • hashCode 相同,equals 为 true,则视为同一个对象,不保存在 hashSet()中
    • hashCode 相同,equals 为 false,则存储在之前对象同槽位的链表上,这非常麻烦,我们应该约束这种情况,即保证:如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。
    • 每一个存储到 哈希 表中的对象,都得提供 hashCode() 和 equals() 方法的实现,用来判断是否是同一个对象,对于 HashSet 集合,我们要保证如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同
 
2.LinkedHashSet:
  • 不可重复、有序
  • 底层采用链表和哈希算法,链表保证元素的添加顺序、哈希保证唯一性
 
3.TreeSet
  • 不可重复、有序
  • 不能为null
  • 底层使用红黑数算法、擅长范围查询
  • 必须放入同类型的对象、默认会进行排序
 
这3种Set的相同点:
  • 不允许重复
  • 不安全
不同点:
  • HashSet:不保证元素的添加顺序,底层采用 哈希表算法,查询效率高。判断两个元素是否相等,equals() 方法返回 true,hashCode() 值相等。即要求存入 HashSet 中的元素要覆盖 equals() 方法和 hashCode()方法
  • LinkedHashSet:HashSet 的子类,底层采用了 哈希表算法以及 链表算法,既保证了元素的添加顺序,也保证了查询效率。但是整体性能要低于 HashSet
  • TreeSet:不保证元素的添加顺序,但是会对集合中的元素进行排序。底层采用 红-黑 树算法(树结构比较适合范围查询)
 
 

猜你喜欢

转载自www.cnblogs.com/wzdnwyyu/p/11142685.html