Java集合-HashSet的使用及与LinkedHashSet、TreeSet的对比

导读:本篇文章讲解 Java集合-HashSet的使用及与LinkedHashSet、TreeSet的对比,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、HashSet 概述

  • HashSet 实现了 Set 接口
  • HashSet 基于 HashMap 来实现,是一个不允许有重复元素的集合。
  • HashSet 允许有 null 值。
  • HashSet 是无序的,即不会记录插入的顺序。
  • HashSet 不是线程安全的。

二、HashSet 的使用

2.1 创建

import java.util.HashSet;

HashSet<T> newSet = new HashSet<T>();

2.2 添加元素

set无重复元素的特性,重复添加同值只存放一个。

newSet.add("hello");

2.3 删除元素

newSet.remove("hello");

2.4 是否包含某元素

boolean newSet.contains(T t)

2.5 获取大小

newSet.size();

2.6 遍历集合

可以使用for-each遍历元素

for(T t : newSet) {
    System.out.println(t);
}

2.7 清空集合

newSet.clear();

三、HashSet LinkedHashSet 和 TreeSet 三者的对比

1、HashSet、LinkedHashSet 和 TreeSet 都是 Set 接口的实现类,都能保证元素唯一,并且都不是线程安全的。

2、HashSet、LinkedHashSet 和 TreeSet 的主要区别在于底层数据结构不同。

  • HashSet 的底层数据结构是哈希表(基于 HashMap 实现)。

  • LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO(先进先出)。

  • TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。

3、底层数据结构不同又导致这三者的应用场景不同

  • HashSet 用于不需要保证元素插入和取出顺序的场景,
  • LinkedHashSet 用于保证元素的插入和取出顺序满足 FIFO 的场景,
  • TreeSet 用于支持对元素自定义排序规则的场景。

四、源码分析 HashSet 添加过程

HashSet 内部使用 HashMap 来存放数据,HashSet 元素值放入 HashMap 的 key 里,由 HashMap key的唯一性,保证了 HashSet 元素的唯一性。

内部HashMap 的 value 存放的值可以理解为一个常量,final Object PRESENT = new Object()。

	//底层使用了HashMap存储数据。
    private transient HashMap<E,Object> map;
    //用来填充底层数据结构HashMap中的value,因为HashSet只用key存储数据。
    private static final Object PRESENT = new Object();

	public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

————————————————
版权声明:本文为CSDN博主「jinyangjie0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JinYJ2014/article/details/122753667

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68401.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!