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

createh53个月前 (02-01)技术教程17

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)
  }
}

相关文章

Java 中那些绕不开的内置接口——Comparable 和 Comparator

恰巧今天要介绍的两个Java 内置接口在名字上乍一看也有点让人分不清楚,他们是 Comparable 和 Comparator 接口。如果你英文还可以应该能猜出来两者的区别,这篇我会用一些示例给大家解...

Java的类与接口(java 接口和类)

Java是一门面向对象的编程语言,主要核心点就是类,Java类具有封装,继承,多态的特性;在Java中,类里面包含了某类事物的基本属性,将这些属性封装起来,只对外部公开别人可以访问的信息,不想让别人访...

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

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

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

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

Java基础-抽象类、接口详解(java实验五抽象类和接口)

1、抽象类1.1 什么是抽象类Java中抽象类是指被abstract修饰的类,何为抽象,抽象指的是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程,所以抽象类主要用来定义类的一些共...

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

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