Set接口

java.util.Set 接口和 java.util.List接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。与 List 接口不 同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。Set 集合有多个子类,这里我们介绍其中的 java.util.HashSet、 java.util.LinkedHashSet 这两个集合 :Set 集合取出元素的方式可以采用:迭代器、增强 for 。1.1 HashSet集合介绍
java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的 ( 即存取顺序 不一致) 。 java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持,由于我们暂时还未学习,先做了 解。 HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与 equals 方法。1.2HashSet集合存储数据的结构(哈希表)
什么是哈希表呢?在 JDK1.8 之前,哈希表底层采用数组 + 链表实现,即使用链表处理冲突,同一 hash 值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即 hash 值相等的元素较多时,通过 key 值依次查找的效率较低。而 JDK1.8 中,哈 希表存储采用数组+ 链表 + 红黑树实现,当链表长度超过阈值( 8 )时,将链表转换为红黑树,这样大大减少了查找时间。哈希表是由数组 + 链表 + 红黑树( JDK1.8 增加了红黑树部分)实现的 总而言之, JDK1.8 引入红黑树大程度优化了 HashMap 的性能,那么对于我们来讲保证 HashSet 集合元素的唯一,其实就是根据对象的 hashCode 和 equals 方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写 hashCode 和 equals 方法建立属于当前对象的比较方式。 1.3HashSet存储自定义类型元素
给 HashSet 中存放自定义类型元素时,需要重写对象中的 hashCode 和 equals 方法,建立自己的比较方式,才能保证 HashSet 集合中的对象唯一 1.4LinkedHashSet
我们知道 HashSet 保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?在 HashSet 下面有一个子类 java.util.LinkedHashSet ,它是链表和哈希表组合的一个数据存储结构。

import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; public class Test222 {public static void main(String[] args) { Set set = new LinkedHashSet(); set.add("bbb"); set.add("aaa"); set.add("abc"); set.add("bbc"); Iterator it = set.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } }

【Set接口】输出
Set接口
文章图片


    推荐阅读