Set集合(学习Java第18天)(HashSet集合、LinkedHashSet集合、TreeSet集合)

目录

一.Set接口概述

二.HashSet集合

 三.HashSet集合存储数据的结构(哈希表)

四.HashSet存储自定义类型元素

五.LinkedHashSet集合

六.TreeSet集合


一.Set接口概述

  • Set接口:也称Set集合,但凡是实现了Set接口的类都叫做Set集合
  • 特点:元素无索引,元素存取无序,元素不可重复(唯一)
  • 实现类:
    • HashSet集合:元素无索引,元素存取无序,元素不可重复(唯一)
    • LinkedHashSet集合:元素无索引,元素存取有序,元素不可重复(唯一)
    • TreeSet集合:元素无索引,元素存取无序,元素不可重复(唯一),元素可排序
  • 注意:
    • Set集合并没有特有的功能,都是使用Collection父接口中的方法
    • Set集合元素无索引,所以遍历方式只能是:迭代器,增强for循环

二.HashSet集合

java.util.HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不能保证不一致)

public class Demo01 {

    public static void main(String[] args) {

        HashSet<String> set=new HashSet<String>();

        set.add("nba");
        set.add("cba");
        set.add("bac");
        set.add("abc");

        set.add("abc");

        System.out.println(set);//[cba, abc, bac, nba]

    }

}

 三.HashSet集合存储数据的结构(哈希表)

HashSet集合保证元素唯一的原理:
            HashSet集合存储数据的结构:哈希表结构
            哈希表结构:
                jdk8以前: 数组+链表
                jdk8以后:
                    链表元素个数没有超过8个: 数组+链表
                    链表元素个数超过8个: 数组+链表+红黑树
           保证元素唯一的原理: 主要依赖元素的hashCode()和equals()方法
                1.当集合要存储某个元素,就会调用该元素的hashCode()方法计算该元素的哈希值
                2.判断该哈希值对应的位置上,是否有相同哈希值的元素
                3.如果该位置上没有相同哈希值的元素,那么就直接存储
                4.如果该位置上有相同哈希值的元素,那么就产生了哈希冲突
                5.如果产生了哈希冲突,就会调用该元素的equals()方法与该位置上所有的元素一一进行比较:
                  如果比较完后,该位置上任意一个元素与该元素相等,那么就不存储
                  如果比较完后,该位置上没有一个元素与该元素相等,那么就存储

 回顾:

                1.hashCode()和equals()是属于Object类的,所以所有的对象都有这2个方法
                2.Object类中的hashCode()方法主要是根据对象的地址值来计算哈希值               3.Object类中的equals()方法是比较2个对象的地址值是否相同
  • 哈希表底层结构

在JDK1.8之前,哈希表底层采用数组+链表实现,即使用数组处理冲突,同一hash值的链表都存储在一个数组里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。

四.HashSet存储自定义类型元素

给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一.

五.LinkedHashSet集合

在HashSet下面有一个子类java.util.LinkedHashSet,它是链表和哈希表组合的一个数据存储结构

六.TreeSet集合

  • TreeSet集合是Set接口的一个实现类,底层依赖于TreeMap,是一种基于红黑树的实现,其特点为:
    • 元素唯一
    • 元素没有索引
    • 使用元素的自然顺序对元素进行排序,或者根据创建 TreeSet 时提供的Comparator比较器,进行排序,具体取决于使用的构造方法:

public TreeSet():根据其元素的自然排序进行排序 public TreeSet(Comparator<E> comparator): 根据指定的比较器进行排序

public TreeSet():根据其元素的自然排序进行排序
public TreeSet(Comparator<E> comparator): 根据指定的比较器进行排序

 TreeSet:集合中的元素无索引,元素不能重复(唯一),可以对集合中的元素进行排序

            构造方法:
                public TreeSet():   根据其元素的默认排序规则进行排序
                  默认排序规则: 集合元素所属的类
                  要求集合元素所属的类必须实现Comparable接口,重写compareTo方法,在compareTo方法中书写排序规则
                public TreeSet(Comparator<E> comparator):    根据指定的比较器进行排序
                  通过参数Comparator比较器接口,来指定排序规则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值