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());
        }
    }
}
相关文章
|
25天前
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
36 5
|
26天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
36 6
|
26天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
32 2
|
28天前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
27 3
|
11天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
11天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
11天前
|
Java 开发者
|
26天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
26 4
|
28天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
25 5
|
29天前
|
Java 开发者
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
31 6

热门文章

最新文章