Set接口

JavaSet接口详解:HashSet、TreeSet与遍历方法,

Set接口的介绍

Set接口基本介绍

  • 无序(添加和取出的顺序不一致),没有索引
  • 不允许重复元素,所以最多包含一个null
  • JDK API中Set接口的实现类:主要有HashSet;TreeSet
    在这里插入图片描述

Set接口的常用方法

和List 接口一样,Set接口也是Collection的子接口,因此,常用方法和Collection接口一样

Set接口的遍历方式

同Collection一致,因为Set是Collection的子接口

  • 迭代器
  • 增强for
  • 不能使用索引的方式

Set接口的常用方法举例

public class SetMethod {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        //1. 以 Set 接口的实现类 HashSet 来讲解 Set 接口的方法
        //2. set 接口的实现类的对象(Set 接口对象), 不能存放重复的元素, 可以添加一个 null
        //3. set 接口对象存放数据是无序(即添加的顺序和取出的顺序不一致)
        //4. 注意:取出的顺序的顺序虽然不是添加的顺序,但是他是固定的.
        HashSet set = new HashSet();
        set.add("john");
        set.add("lucy");
        set.add("john");//重复
        set.add("jack");
        set.add("hsp");
        set.add("mary");
        set.add(null);//
        set.add(null);//再次添加 null
//        for (int i = 0; i < 10; i++) {
//            System.out.println(set);
//        }
        //遍历
        //1,使用迭代器
        System.out.println("======使用迭代器=====");
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object object = iterator.next();
            System.out.println(object);
        }
        //2,使用增强for循环
        System.out.println("======使用增强for循环=====");
        for (Object o:set){
            System.out.println(o);
        }
        //3,不能用普通for ,因为set对象不能调用get方法。不能通过索引来获取
    }

}

结果
在这里插入图片描述

Set接口实现类-HashSet

HashSet 的全面说明

  • HashSet 实现了Set接口
  • HashSet实际上是HashMap,源码
    在这里插入图片描述
  • 可以存放null值,但是只能有一个null
  • HashSet不保证元素是有序的,取决于hash后,再确定索引的结果(即:不保证存放元素的顺序和取出的顺序一致)
  • 不能有重复元素/对象
public class HashSet_ {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add(null);
        hashSet.add(null);
        System.out.println("hashSet="+hashSet);
    }
}

结果
在这里插入图片描述

案例说明

public class HashSet01 {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        HashSet set = new HashSet();
        /**
         * 说明:
         * 1,在执行add方法后,会返回一个boolean值
         * 2,如果添加成功,返回true,否则返回false
         */
        System.out.println(set.add("john"));//T
        System.out.println(set.add("lucy"));//T
        System.out.println(set.add("john"));//F
        System.out.println(set.add("jack"));//T
        System.out.println(set.add("Rose"));//T

        //3,调用remove方法,直接删除对象
        set.remove("john");
        System.out.println("set="+set);//Rose, lucy, jack
        set = new HashSet();
        System.out.println(set);//空

        //4,Hashset 不能添加相同的元素/数据
        set.add("lucy");//添加成功T
        set.add("lucy");//加入不了F
        set.add(new Dog("tom"));
        set.add(new Dog("tom"));//不同的对象
        System.out.println(set);
    }
}
class Dog{
    private String name;

    public Dog(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                '}';
    }
}

结果
在这里插入图片描述

Set接口实现类-LinkedHashSet

LinkedHashSet的全面说明

  • LinkedHashSet 是HashSet的子类
  • LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组+双向链表
  • LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是一插入顺序保存的
  • LinkedHashSet不允许添加重复元素
### Set 接口的特点 `Set` 接口Java 集合框架的重要组成部分,它继承自 `Collection` 接口,并定义了一个不允许包含重复元素的集合。其核心特性包括: - **元素唯一性**:`Set` 中不允许存在重复的元素,确保每个元素在集合中唯一[^4]。 - **无序性**:大多数 `Set` 实现(如 `HashSet`)不保证元素的存储顺序与插入顺序一致,但某些实现(如 `LinkedHashSet`)会维护插入顺序[^4]。 - **高效查找**:由于 `Set` 通常基于哈希表或红黑树实现,因此提供了高效的查找、插入和删除操作,平均时间复杂度为 O(1) 或 O(log n)[^2]。 - **null 元素支持**:`Set` 允许插入一个 `null` 元素,但不允许重复插入多个 `null`。 以下是一个使用 `HashSet` 的简单示例: ```java import java.util.HashSet; import java.util.Set; public class SetDemo { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); set.add("Cherry"); set.add("Apple"); // 重复元素不会被添加 System.out.println(set); } } ``` --- ### Set 接口与 List 接口的区别 | 特性 | Set 接口 | List 接口 | |--------------------|--------------------------------------|---------------------------------------| | **元素唯一性** | 元素不可重复 | 允许重复元素 | | **顺序性** | 默认无序(某些实现维护插入顺序) | 有序,插入和取出顺序一致 | | **索引访问** | 不支持通过索引访问元素 | 支持通过索引访问和修改元素 | | **null 元素数量** | 只允许一个 null 元素 | 允许多个 null 元素 | | **常用实现类** | `HashSet`、`LinkedHashSet`、`TreeSet` | `ArrayList`、`LinkedList`、`Vector` | | **查找效率** | 通常比 List 更快 | 查找效率较低,尤其是链表实现 | 例如,`HashSet` 基于哈希表实现,查找效率高,而 `ArrayList` 基于数组实现,适合随机访问,但在中间插入或删除效率较低。 --- ### 使用场景对比 - **Set 接口适用场景**:适用于需要确保元素唯一性、快速查找和去重的场景。例如,存储用户集合、检查重复数据等。 - **List 接口适用场景**:适用于需要维护元素顺序、允许重复元素、支持索引访问的场景。例如,记录日志、保存有序数据等。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值