J-18 集合对象

SET接口

SET接口
HashSet类
LinkedHashSet类
TreeSet类

SET接口

一、Set接口概述

一个不包含重复元素的 collection。无序唯一

二、Set案例

存储字符串并遍历
存储自定义对象并遍历

HashSet类

一、HashSet类概述

底层数据结构是哈希表。
不保证 set 的迭代顺序,特别是它不保证该顺序恒久不变。

二、HashSet如何保证元素唯一性

  • 底层数据结构是哈希表(元素是链表的数组),哈希表依赖于哈希值存储
  • 通过查看add方法的源码,add功能底层依赖两个方法:
    int hashCode()
    boolean equals(Object obj)
    步骤:
    ① 比较哈希值;
    ② 若相同,比较地址值或equals();
    ③ 不同就添加到集合中。

三、注意:

HashSet集合,底层是哈希表结构。而哈希表结构底层依赖hashCode()和equals()方法。
如果你认为对象的成员变量相同即为同一个对象的话,应该重写这两个方法。
如何重写?系统生成。

LinkedHashSet类

LinkedHashSet类概述

底层数据结构由哈希表和链表组成。
元素有序唯一;
链表保证元素有序(存储和取出一致);
哈希表保证元素唯一

TreeSet类

一、TreeSet类概述

底层数据结构是红黑二叉树结构(一种自平衡的二叉树)。
使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

  • TreeSet特点:排序、唯一。

  • 能够对元素按照某种规则进行排序。

  • 排序方式:
    ① 自然排序 Comparable
    比较依赖于compareTo()方法,这个方法定义在Comparable里面。
    ② 比较器排序 Comparator

二、TreeSet是如何保证元素的排序和唯一性的

底层数据结构是红黑树(红黑树是一种自平衡的二叉树)

  • 存储方法:
    第一个元素存储时作为根节点存储,
    从第二个元素开始从根节点开始比较:
    ① 大 -- 右孩子
    ② 小 -- 左孩子
    ③ 相等 -- 不存储(保证唯一性)

  • 取出方法:
    从根节点开始,按照左中右的原则依次取出元素。

三、注意

使用TreeSet进行元素排序,需要实现Comparable接口,实现方式根据排序条件。

原文地址:https://www.cnblogs.com/android-lyz/p/5108661.html