21xrx.com
2024-12-22 23:16:36 Sunday
登录
文章检索 我的文章 写文章
Java中Set的用途及实现类
2023-06-15 19:01:40 深夜i     --     --
Java Set HashSet

我对Java中Set的理解

我在Java开发中经常会用到Set这个数据结构,Set是一种无序、不可重复的数据集合。它的实现类有HashSet、LinkedHashSet和TreeSet。

HashSet是最常用的Set实现类,它是基于HashMap实现的。当我们向HashSet中添加元素时,会先计算元素的hashCode值,然后根据hashCode值找到对应的桶(Bucket),如果桶中已经存在该元素,那么就比较元素是否相等,如果相等就不添加,如果不相等则直接添加到桶中。如果桶中不存在该元素,则直接添加到桶中。HashSet的添加、删除、查询的时间复杂度都是O(1)的。

LinkedHashSet是HashSet的子类,它在HashSet的基础上增加了维护元素插入顺序的功能。LinkedHashSet采用哈希表和链表实现,每个元素在哈希表中的位置由元素的hashCode决定,而且每个元素都同时保存了前驱和后继指针。LinkedHashSet的插入和删除性能略低于HashSet,但遍历性能更好,因为LinkedHashSet内部维护了一个双向链表,所以遍历元素的顺序与元素的插入顺序相同。

TreeSet是基于红黑树实现的,它可以自动按照元素的自然顺序进行排序,或者按照构造函数中传入的Comparator进行排序。TreeSet的添加、删除、查询的时间复杂度都是O(logN)的,但比起HashSet和LinkedHashSet,TreeSet占用的内存空间更大。

下面是一个使用HashSet的简单示例:


import java.util.HashSet;

import java.util.Set;

public class SetDemo {

  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.size()); // 输出3

    System.out.println(set.contains("banana")); // 输出true

    set.remove("cherry");

    System.out.println(set.size()); // 输出2

  }

}

在上面的代码中,我们先创建了一个HashSet对象,然后向其中添加了三个元素:apple、banana和cherry。由于apple是一个重复元素,所以只有两个元素被添加进去了。接着我们使用size()方法获取集合的大小,发现集合中只有两个元素。然后我们使用contains()方法判断集合中是否包含banana元素,返回true。最后我们使用remove()方法删除了cherry元素,再次使用size()方法获取集合大小,发现集合中只有两个元素。

通过上面的例子可以看出,Set主要用来去重,但是它还有其他的用途。在实际开发中,我们可以根据需要选择HashSet、LinkedHashSet或者TreeSet,来满足不同的需求。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复