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接口_第1张图片

 

你可能感兴趣的:(Set接口)