Set集合

简介: Set集合

Set集合

总结于尚硅谷

Set集合的框架
|----Collection接口:单列集合,用来存储一个一个的对象

|----Set接口:存储无序的、不可重复的数据。–>高中讲的”集合“

|—HashSet:作为Set接口的主要实现类:线程不安全;可以存储null值

|—LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加顺序遍历。对于频繁的遍历操作,LinkedHashset的效率高于HashSet

|—TreeSet:可以按照添加对象的指定属性进行排序。


1.Set接口中没有额外定义新的方法,使用的都是Collection中声明的方法。

2.要求:向Set中添加的数据,器所在类一定要重写hashCode()和equals()

要求:重写的hashCode()和equals()尽可能保持一致性

Set:存储无序的、不可重复的数据
1.无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值来添加
2.不可重复性:保证添加的元素按照equals()判断时,不能返回true.即相同的元素只能添加一个
二、添加元素的过程:以HashSet为例:
    我们向HashSet中添加元素a,首先调用元素a所在类的HashCode()方法,计算元素a的哈希值,
    此哈希值接着通过某种算法计算出在HashSet底层数组的存放位置(即为:索引位置),
    判断数组此位置上是否已经有元素:
        如果此位置上没有元素,则元素a添加成功。---情况1
        如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的Hash值:
            如果hash值不相同,则元素a添加成功。---情况2
            如果hash值相同,进而调用元素a所在类的equals()方法:
                equals方法返回true,元素a添加失败
                equals方法返回false,则元素a添加成功.---情况3
     对于添加成功情况2和情况3而言:元素a与已经存在指定位置上的数据以链表的方式存储。
     jdk7:元素a放在数组中,指向原来的元素
     jdk8:原来的元素放在数组中,指向元素a
     总结:七上八下
     HashSet底层:数组+链表的结构




SetTest类

/**
 * Set接口的框架
 *
 *  |----Collection接口:单列集合,用来存储一个一个的对象
 *      |----Set接口:存储无序的、不可重复的数据。-->高中讲的”集合“
 *          |---HashSet:作为Set接口的主要实现类:线程不安全;可以存储null值
 *          |---LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加顺序遍历。对于频繁的遍历操作,LinkedHashset的效率高于HashSet
 *          |---TreeSet:可以按照添加对象的指定属性进行排序。
 *
 * 1.Set接口中没有额外定义新的方法,使用的都是Collection中声明的方法。
 *
 * 2.要求:向Set中添加的数据,器所在类一定要重写hashCode()和equals()
 *   要求:重写的hashCode()和equals()尽可能保持一致性
 */
public class SetTest {
    /*
    Set:存储无序的、不可重复的数据
    1.无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值来添加
    2.不可重复性:保证添加的元素按照equals()判断时,不能返回true.即相同的元素只能添加一个
    二、添加元素的过程:以HashSet为例:
        我们向HashSet中添加元素a,首先调用元素a所在类的HashCode()方法,计算元素a的哈希值,
        此哈希值接着通过某种算法计算出在HashSet底层数组的存放位置(即为:索引位置),
        判断数组此位置上是否已经有元素:
            如果此位置上没有元素,则元素a添加成功。---情况1
            如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的Hash值:
                如果hash值不相同,则元素a添加成功。---情况2
                如果hash值相同,进而调用元素a所在类的equals()方法:
                    equals方法返回true,元素a添加失败
                    equals方法返回false,则元素a添加成功.---情况3
         对于添加成功情况2和情况3而言:元素a与已经存在指定位置上的数据以链表的方式存储。
         jdk7:元素a放在数组中,指向原来的元素
         jdk8:原来的元素放在数组中,指向元素a
         总结:七上八下
         HashSet底层:数组+链表的结构
     */
package com.day0307_1;
import org.junit.jupiter.api.Test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
    @Test
    public void test1(){
        Set set=new HashSet();
        set.add(456);
        set.add(123);
        set.add(123);
        set.add("AA");
        set.add("CC");
        set.add(new User("Tom",12));
        set.add(new User("Tom",12));
        set.add(129);
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
    //LinkedHashSet的使用
    //LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个指针,记录此数据的前一个
    // 数据和后一个数据。
    //优点:对于频繁的遍历操作,LinkedHashset的效率高于HashSet
    @Test
    public void test2(){
        Set set=new LinkedHashSet();
        set.add(456);
        set.add(123);
        set.add(123);
        set.add("AA");
        set.add("CC");
        set.add(new User("Tom",12));
        set.add(new User("Tom",12));
        set.add(129);
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
相关文章
|
2月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
4月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
4月前
|
存储 JavaScript 前端开发
JavaScript进阶-Map与Set集合
【6月更文挑战第20天】JavaScript的ES6引入了`Map`和`Set`,它们是高效处理集合数据的工具。`Map`允许任何类型的键,提供唯一键值对;`Set`存储唯一值。使用`Map`时,注意键可以非字符串,用`has`检查键存在。`Set`常用于数组去重,如`[...new Set(array)]`。了解它们的高级应用,如结构转换和高效查询,能提升代码质量。别忘了`WeakMap`用于弱引用键,防止内存泄漏。实践使用以加深理解。
65 3
|
3天前
|
存储 NoSQL Redis
6)深度解密 Redis 的集合(Set)
6)深度解密 Redis 的集合(Set)
12 1
|
6天前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
5天前
|
存储 数据处理 Python
Python中的Set集合:高效数据处理的利器
Python中的Set集合:高效数据处理的利器
13 0
|
2月前
|
Java 程序员 C语言
赶快收藏!全网最佳Set集合详解:HashSet、TreeSet!
面试官:那TreeSet要怎么定制排序?TreeSet的自定义排序我们要利用Comparator接口,通过向TreeSet传入自定义排序规则的Comparator来实现。官方源码是这么解释的,南友们看一看。// 构造一个新的空树集,根据指定的比较器进行排序。// 插入到集合中的所有元素都必须能够通过指定的比较器相互比较: comparator. compare(e1, e2)不得对集合中的任何元素e1和e2抛出ClassCastException。
赶快收藏!全网最佳Set集合详解:HashSet、TreeSet!
|
2月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
2月前
|
索引 Python 容器
为什么Python中会有集合set类型?
为什么Python中会有集合set类型?
|
2月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。