单列Set集合

Set集合

概述

Set继承自Collection接口,主要有两个常用的实现类HashSet类和TreeSet类

        它没有固定的大小限制,可以动态地添加和删除元素。并且Set集合中的元素都是唯一的,不会有重复的元素,即使是null值也只能有一个。另外Set集合是无序的,不能记住元素的添加顺序,因为没有索引值,所以Set集合中的对象不会按特定的方式排序,它只是简单地把对象放到集合中。

        从特性上来看,Set相当于是一个只存储key、不存储value的Map。我们可以把Set想象成是一个”特殊的Map“,这个Map只有key却没有value,所以我们可以用Set去除重复的元素。另外由于放入Set的元素和Map的key类似,需要正确地实现equals()和hashCode()方法,否则该元素就无法正确地放入Set。

特征

与其他集合不同,Set集合具有自己的一些特性:

  • Set集合中的元素都是唯一的,不允许有重复值,且最多只允许包含一个null元素;

  • Set集合中的元素没有顺序,我们无法通过索引来访问元素,但TreeSet是有序的;

  • Set集合没有固定的大小限制,可以动态地添加和删除元素;

  • Set集合提供了高效的元素查找和判断方法。

常用API方法

        Set集合给我们提供了一系列常用的方法,用于添加、删除、查找、遍历和获取集合元素等操作,下面是Set集合中常用方法的实现过程。

boolean add(E e)向集合中添加元素e
boolean remove(Object o)从集合中删除元素o
int size()返回集合中元素的数量
boolean contains(Object o)判断集合中是否包含元素o
boolean isEmpty()判断集合是否为空

Set对象创建方式

下面是一个使用HashSet创建Set集合的例子:

Set<String> set = new HashSet<String>();
set.add("Hello");
set.add("World");
set.add("Java");

// 使用迭代器遍历Set集合
Iterator<String> it = set.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

// 使用foreach循环遍历Set集合
for (String str : set) {
    System.out.println(str);
}

哈希值【理解】

简介

  是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

获取哈希值

  Object类中的public int hashCode():返回对象的哈希码值

       

哈希值的特点

  • 同一个对象多次调用hashCode()方法返回的哈希值是相同的
  • 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同
  • 在小部分情况下,不同属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞) 

哈希表结构【理解】

JDK1.8以前

数组 + 链表

JDK1.8以后

节点个数少于等于8个

数组 + 链表

节点个数多于8个(链表长度超过8,而且数组长度大于等于64,链表自动转换成红黑树)

数组 + 红黑树

如果集合中存储的是自定义对象,必须要重写hashCode和equlas方法

HashSet集合 

简介

        在Java的集合框架中,HashSet是一种非常常用的集合类型,它实现了Set接口,并继承了AbstractSet抽象类。HashSet集合的底层实现是一个哈希表,它使用哈希算法来存储和管理集合中的元素。HashSet集合中的元素没有顺序,且不允许重复。

如果我们想使用HashSet集合,一般要使用如下两个构造方法创建出HashSet对象:

  • HashSet():构造一个新的空的Set集合对象;

  • HashSet(Collection<? extends E> c):构造一个包含指定Collection集合元素的新Set集合。"< >"中的extends,表示这个Collection中的元素必须继承自HashSet的父类,该部分限定了Collection元素的类型。

 特征

HashSet作为Set集合的具体子类,具有以下特点(Set特点它都有):

  • HashSet的底层是基于HashMap来实现的;

  • 无序,不会记录插入元素的顺序,所以不能保证元素的排列顺序,获取顺序可能与添加顺序不同;

  • HashSet不是线程安全的,默认线程不同步,如果有多个线程同时访问或修改同一个HashSet,必须通过代码来保证同步操作。

HashSet去重原理 

HashSet是一种基于HashMap实现的数据结构,其去重原理基于HashMap的键值唯一性。

        具体来说,当我们向HashSet中添加元素时,HashSet首先会将该元素作为HashMap的键,并以null值作为HashMap的值去调用HashMap的put方法。若元素已经存在于HashSet中,则HashMap的put方法会返回该元素之前对应的值,即一个非空的Object对象;否则,HashMap的put方法会返回null。

        当HashMap的put方法返回非null值时,HashSet会判断该元素是否已存在于HashSet中,若是,则无需再次添加;否则,HashSet会将该元素添加到HashSet中。

        由此可见,HashSet的去重原理取决于HashMap的键值唯一性。若添加的元素已经存在于HashSet中,则HashMap的put方法会返回非null值,使得HashSet能够判断该元素已经存在于HashSet中并不需要再次添加。

 HashSet基本用法

 public class HashSetDemo {
            public static void main(String[] args) {
                //创建集合对象
                HashSet<String> set = new HashSet<String>();
                //添加元素
                set.add("hello");
                set.add("world");
                set.add("java");
                //不包含重复元素的集合
                set.add("world");

                //遍历
                for(String s : set) {
                    System.out.println(s);
                }
            }
        }

注:HashSet集合存储自定义类型元素,要想实现元素的唯一,要求必须重写hashCode方法和equals方法 

LinkedHashSet集合(简要概括)

底层原理:

  1. 有序、、不重复、无索引
  2. 这里的有序指的是保证存储和取出的元素顺序一致
  3. 原理:底层数据结构依然是哈希表,每个元素又额外多了一个双链表的机制记录存储顺序

 

总结:如果要求去重且存取有序,才使用LinkedHashSet

TreeSet集合

 简介

        TreeSet是一种很常用的集合类型,它实现了Set和SortedSet接口,并且继承自AbstractSet抽象类。TreeSet集合中的元素也是唯一的,不允许重复。TreeSet集合的底层基于红黑树,可以使用自然排序或指定的比较器对集合中的元素进行排序。该类具有如下特点:

  • TreeSet集合中的元素是唯一的,不允许重复。

  • TreeSet集合中的元素是有序的,因为实现了SortedSet接口,具有字典顺序,可以通过迭代器按照升序或降序遍历。

  • TreeSet集合没有固定的大小限制,可以动态地添加和删除元素。

  • TreeSet集合提供了高效的元素查找和判断功能。

        另外,SortedSet接口是Set接口的子接口,能够对集合进行自然排序,因此TreeSet类默认情况下就是自然排序(升序)的。但TreeSet只能对实现了Comparable接口的类对象进行排序,所以我们使用TreeSet集合存储对象时,该对象必须要实现Comparable接口。这是因为Comparable接口中有一个compareTo(Object o)方法,可以比较两个对象的大小。例如,a.compareTo(b),如果 a 和 b 相等,则该方法会返回 0;如果 a 大于 b,则该方法返回大于 0 的正值;如果 a 小于 b,则该方法返回小于 0 的负值。 

常用方法

除了Set类中通用的方法之外,TreeSet类还有如下几个特有的方法:

E first()

返回集合中的第一个元素

E last()返回集合中的最后一个元素。
E poolFirst()获取并移出该集合中的第一个元素
E poolLast()获取并移出该集合中的最后一个元素

去重原理 

当TreeSet集合在保存对象元素时,集合对象必须实现Comparable接口,并重写compareTo方法,该方法有如下两个作用:

  • 排序: 返回值大于0表示升序,返回值小于0表示降序;

  • 去重(返回值为0):TreeSet认为返回0,表示两个对象是相同的对象。

总结

  • Set用于存储不重复的元素集合;

  • 放入HashSet的元素,与作为HashMap的key要求相同;

  • 放入TreeSet的元素,与作为TreeMap的Key要求相同;

  • 利用Set可以去除重复元素;

  • 遍历SortedSet时,可以按照元素的排序顺序进行遍历,我们也可以自定义排序算法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值