java_进阶:set 接口

1、set 接口
Set 是 Collection 的子接口。
Set 中的元素是不能重复的、无序的,这里的“无序”是指向 Set 中输入的元素,与从 Set 中输出元素的顺序是不一致的。
Set 接口主要有两个实现类 HashSet 和 TreeSet。

2、Set 接口继承自 Collection 接口的主要方法(list 接口也可用)

boolean add(Object obj)
向集合中添加一个 obj 元素,并且 obj 不能和集合中现有数据元素重复,添加成功后返回 true。如果添加的是重复元素,则添加操作无效,并返回 false。

void clear()
移除此集合中的所有数据元素,即将集合清空。

boolean contains(Object obj)
判断此集合中是否包含 obj,如果包含,则返回 true。

boolean isEmpty()

判断集合是否为空,为空则返回 true。

Iterator iterator()

返回一个 Iterator 对象,可用它来遍历集合中的数据元素。

boolean remove(Object obj)

如果此集合中包含 obj,则将其删除,并返回 true。

int size()

返回集合中真实存放数据元素的个数,注意与数组、字符串获取长度的方法的区别。

Object[] toArray()

返回一个数组,该数组包含集合中的所有数据元素。

3、set 集合的实现类

3.1 HashSet
HashSet的初始容量为16 增长机制1.75 0.75称为增长因子
1、HashSet的特点:

  • 底层数据结构是哈希表
  • 对集合的迭代顺序不做任何保证,也就是说保存的顺序和获取的顺序是不一致的
  • 没有带索引的方法,只能使用增强for和迭代器进行遍历
  • 不能包含重复元素
  • 可以存储null 但是只能存一个
  • 此实现不同步

2、HahsSet集合保证元素唯一性
在这里插入图片描述
唯一性原理:

1 根据对象的哈希值计算存储位置:
​ 如果当前位置没有元素则直接存入 如果当前位置有元素存在 则进入第二步

2 当前元素和计算所得位置的所有元素进行哈希值的比较
​ 如果哈希值不同,则直接存储
​ 如果哈希值相同,则进入第三步

3 通过equals方法比较两个元素的内容
​ 如果内容不同,则将元素进行存储
​ 如果元素内容相同 则认为元素重复 不存储

在以后的使用中,要对于存入hashSet集合中对象,都必须重写hashCode和equals方法 保证元素的唯一性

为什么要重写hashCode()和 equals() 两个方法?

hashCode()和 equals() 两个方法最初都是在 Object 类中定义的.
Object 中定义的 equals()方法默认比较的是对象的内存地址;hashCode()方法的前面有 native 修饰符,表示会通过操作系统底层提供的算法来计算 hash 值。显然,这两个方法的默认实现,与我们“关注对象内容”的侧重点不一致,因此需要重写。

3、哈希表

哈希表也属于数据结构的一种

jdk8之前,底层采用的是数组+ 链表的实现。就可以认为是一个元素为链表的数组

jdk8以后 底层 是采用数组 + 链表+ 红黑树 相较于jdk8以前在实现上有所优化 采用红黑树进行优化 当链表的长度超过一定值 就会将链表转换为红黑树。

4、LinkedHashSet
特点:

  • 是Set接口的哈希表和链表的实现,元素是有序的;
    • 采用双向链表保证了元素是有序的,也就是说元素的存储顺序和迭代顺序是一致的
    • 采用哈希表保证元素的唯一性

3.2 TreeSet
1、特点

  • 基于TreeMap实现
  • 可以对其中的元素进行排序。排序方式:自然排序 定制排序
    TreeSet类在实现了Set接口的同时,也实现了SortedSet接口,是一个具有排序功能的Set接口类。
    TreeSet集合中的元素默认是按照自然升序排列,并且TreeSet集合中的对象需要实现Comparable接口。
    Comparable 接口用于比较集合中各个元素的大小,常用于排序操作。
  • 此实现不同步

2、比较器

内部比较器: Comparable 接口

JDK提供了Comparable和Comparator两个接口,都可以用于定义集合元素的排
序规则。
对于存入TreeSet中的对象 必须实现Comparable接口。
如果程序员想定义自己的排序方式,一种简单的方法就是让加入TreeSet集合中的对象所属的类实现Comparable接口,通过实现compareTo(0bject o)方法(返回正数、0、负数,分别代表 小于、等于、大于),达到排序的目的。

Comparable接口实现了在TreeSet集合中的自定义排序。这种方法是通过集合元素重写compareTo(Object o)方法定义排序规则的。因为是在类内部实现比较,所以也通常将Comparable称为内部比较器。

外部比较器: Comparator接口
Comparator可以理解为一个专用的比较器,当集合中的对象不支持自比较或者自比较的功能不能满足程序员的需求时,就可以写一个实现Comparator接口的比较器来完成两个对象之间的比较,从而实现按比较器规则进行排序的功能。

例如要比较的对象是JDK中内置的某个类,而这个类又没有实现Comparable接口,因此我们是无法直接修改JDK内置类的源码的,因此就不能通过重写compareTo(Object o)方法来定义排序规则了,而应该使用Comparator接口实现比较器功能。

1 自然排序
Comparable接口对实现它的每个类的对象强加一个整体排序。 这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法

自然排序:将需要保存到TreeSet集合中的类实现Comparable接口,并重写compareTo()方法。

重写方法的时候,一定要注意排序规则。在排序的时候,最好定义主要条件和次要条件

2 定制排序

intcompare(T o1, T o2) 比较其两个参数的顺序。

在定制排序中,需要用到TreeSet的构造方法

TreeSet(Comparator<? super E> comparator) 构造一个新的,空的树集,根据指定的比较器进行排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值