Collection子接口之二: Set接口

Set 接口简述

1、Set接口是Collection的子接口, set接口没有提供额外的方法
2、Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败。
3、Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals() 方法

Set实现类之一: HashSet

1、HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
2、HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。
HashSet 具有以下特点:

  • 不能保证元素的排列顺序
  • HashSet 不是线程安全的
  • 集合元素可以是 null
    3、HashSet 集合判断两个元素相等的标准: 两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
    4、对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Objectobj)方法,以实现对象相等规则。即: “相等的对象必须具有相等的散列码

向HashSet中添加元素的过程:

1、 当向 HashSet 集合中存入一个元素时, HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值, 然后根据 hashCode 值, 通过某种散列函数决定该对象在 HashSet 底层数组中的存储位置。 (这个散列函数会与底层数组的长度相计算得到在数组中的下标, 并且这种散列函数计算还尽可能保证能均匀存储元素, 越是散列分布,该散列函数设计的越好)

2、 如果两个元素的hashCode()值相等, 会再继续调用equals方法, 如果equals方法结果为true, 添加失败; 如果为false, 那么会保存该元素, 但是该数组的位置已经有元素了,那么会通过链表的方式继续链接。
如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等, hashSet 将会把它们存储在不同的位置,但依然可以添加成功。

在这里插入图片描述
底层也是数组, 初始容量为16, 当如果使用率超过0.75(16*0.75=12)就会扩大容量为原来的2倍。 (16扩容为32, 依次为64,128…等)

重写 hashCode() 方法的基本原则

1、 在程序运行时,同一个对象多次调用 hashCode() 方法应该返回相同的值。
2、当两个对象的 equals() 方法比较返回 true 时,这两个对象的 hashCode()方法的返回值也应相等。
3、对象中用作 equals() 方法比较的 Field,都应该用来计算hashCode 值。

重写 equals() 方法的基本原则

1、当一个类有自己特有的“逻辑相等”概念,当改写equals()的时候,总是要改写hashCode(),根据一个类的equals方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode()方法,它们仅仅是两个对象。
2、 因此,违反了“相等的对象必须具有相等的散列码”。
3、结论:复写equals方法的时候一般都需要同时复写hashCode方法。 通常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。

Set实现类之二: LinkedHashSet

1、LinkedHashSet 是 HashSet 的子类
2、LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
3、LinkedHashSet插入性能略低于 HashSet, 但在迭代访问 Set里的全部元素时有很好的性能。
4、LinkedHashSet 不允许集合元素重复。
在这里插入图片描述

Set实现类之三: TreeSet

1、TreeSet 是 SortedSet 接口的实现类, TreeSet 可以确保集合元素处于排序状态。
2、TreeSet底层使用红黑树结构存储数据
3、新增的方法如下: (了解)
Comparator comparator()
Object first()
Object last()
Object lower(Object e)
Object higher(Object e)
SortedSet subSet(fromElement, toElement)
SortedSet headSet(toElement)
SortedSet tailSet(fromElement)
4、TreeSet 两种排序方法: 自然排序和定制排序。默认情况下, TreeSet 采用自然排序。

TreeSet和后面要讲的TreeMap采用红黑树的存储结构
特点:有序,查询速度比List快

原创文章 18 获赞 8 访问量 1356

猜你喜欢

转载自blog.csdn.net/xiangjunyes/article/details/105903099