七十三、深入解析Java Set接口:特性、方法及应用示例

createh54个月前 (02-01)技术教程21

Set接口是一个非常重要的集合类型,属于Java Collections Framework的一部分。作为Collection接口的直接子接口,Set主要用来存储无序的、不可重复的数据元素。

特性概览

特性

描述

无序性

Set集合中的元素不保证任何特定的顺序,这意味着添加元素的顺序与遍历时的顺序可能不同。

唯一性

每个元素在Set中必须是唯一的,即不能有重复的元素。这是通过比较元素的equals()方法和hashCode()方法来确保的。

无索引访问

由于强调元素的唯一性和集合的无序性,Set接口不提供按索引访问元素的方法,如get()或通过索引设置元素。

主要实现类

描述

HashSet

基于哈希表实现,提供快速的插入、删除和查找操作。元素无序,不保证顺序。

LinkedHashSet

内部使用哈希表和双向链表实现,保持元素插入的顺序,因此是有序的。

TreeSet

基于红黑树结构实现,自然排序或自定义比较器排序,提供有序访问元素的能力,并且支持范围查询。

EnumSet

一个为枚举类型设计的特殊集合实现。所有的元素都必须是枚举常量,提供高效的位运算和紧凑的内存存储。

常用方法

方法

描述

add(E element)

添加元素到集合中,如果元素已经存在,则不执行任何操作。

remove(Object o)

移除指定元素。

contains(Object o)

判断集合是否包含指定元素。

size()

返回集合中的元素数量。

isEmpty()

判断集合是否为空。

clear()

清空集合中的所有元素。

iterator()

返回一个迭代器,用于遍历集合中的元素。

应用场景

场景

描述

去重

当需要从一组数据中去除重复元素时,Set是非常有用的工具。

成员

资格检查

快速判断某个元素是否属于某集合。

集合运算

如并集、交集、差集等,可以通过Set的子类实现或Collections工具类完成。

排序与

范围查询

特别是使用TreeSet时,可以方便地对集合进行排序,并执行区间查询。

注意事项

  1. 在使用Set存储自定义对象时,确保正确覆盖equals()和hashCode()方法,以维护元素的唯一性。
  2. 虽然Set允许包含一个null元素,但在实际使用中应尽量避免,以免引发不必要的混淆或错误。

示例

import java.util.HashSet;
import java.util.Set;

public class SetExample {
  public static void main(String[] args) {
    Set set = new HashSet<>();

    // 添加元素
    set.add("Apple");
    set.add("Banana");
    set.add("Cherry");
    set.add("Apple"); // 重复添加,不会生效

    // 检查元素是否存在
    System.out.println(set.contains("Apple")); // 输出: true

    // 移除元素
    set.remove("Banana");

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

    // 输出集合大小
    System.out.println(set.size()); // 输出: 2(因为移除了Banana)
  }
}

相关文章

抽象类和接口(抽象类和接口的区别和相同点)

抽象类就像这个代码:在这个打印图形的例子当中,可以看到父类的 shape 方法并没有实际作用,主要的工作都由子类完成了,像这些没有实际工作的方法,我们就可以把它设计成一个抽象方法,包含抽象方法的类叫做...

揭秘什么是面向接口编程(面向接口的好处)

先用一个案例来给大家说明一下面向接口编程。案例:有一个电脑类(Computer),电脑除了有基本的开机关机功能外,还有连接任何外接设备的功能,比如能电脑能连接外置键盘(Keyboard),鼠标(Mou...

「JAVA8」- 函数式接口看这篇就够了

什么是函数式接口?就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。特点只有一个抽象方法。可以有多个非抽象方法的接口。例如自己定义一个接口...

「java8新特性」01:常见的函数式接口

Jdk8提供的函数式接口都在java.util.function包下,Jdk8的函数式类型的接口都有@FunctionInterface注解所标注,但实际上即使没有该注解标注的有且只有一个抽象方法的接...

Java编程新范式:用枚举实现接口定义的行为

在Java中,枚举(enum)是一种特殊的类,它不仅可以表示一组常量,还可以拥有字段、方法、构造函数等。从Java 8开始,枚举类型可以被实例化,这意味着它们可以拥有状态,并且可以定义行为,这使得枚举...

从0开始搭建开发自己的代码测试框架-接口java篇

从0开始搭建开发自己的代码测试框架-接口java篇多数人了解测试自动化后,大多理解和知道什么是自动化,也知道为什么要做自动化,同样知道自动化的目的是什么。但是不知道对于这个自动化,怎样开始做,都用到哪...