HashSet解析

本文深入解析了HashSet的工作原理,展示了其如何通过HashMap实现无重复元素的特性,适用于去重及集合运算,同时提供了实例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


title: HashSet解析
date: 2019-03-09 08:11:42
categor:

  • Java基础
    tags:
  • HashSet
  • 容器类

HashSet解析

基本用法

HashSet实现了Set接口,Set表示无重复元素、且不保证访问顺序的容器接口。与HashMap类似,它有如下的构造方法。

  public HashSet() { map = new HashMap<>();}

  public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));

    addAll(c);}

  public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}

  public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}

initialCapacity(初始容量,默认16),loadFactor(负载因子,默认0.75)与HashMap中的含义是一样的。

HashSet的用法也很简单。

 List a= new ArrayList();

    a.add(1);

    a.add(1);

    //直接传入个容器类进去

    Set c = new HashSet<>(a);

    Iterator iterator = c.iterator();

    while (iterator.hasNext()) {

        System.out.println(iterator.next());

    }

因为HashSet中是无重复元素的,所以结果为1。这个特性可以将其用于去重。

基本原理

HashSet其实就是HashMap实现的,在HashSet内部有个HashMap实例变量。

private transient HashMap<E,Object> map;

还有个常量。在Map中有key,有value,而在HashSet中相当于只有key,所有的value都是这个常量。

private static final Object PRESENT = new Object();

再来看看add(E e)方法

  public boolean add(E e) {

    return map.put(e, PRESENT)==null;

}

直接调用HashMapput方法,将元素作为key,常量PRESENT作为value存入,null值也可以存入,若集合中已有元素,则保持集合不变返回false

检查也是HashMap的方法:

public boolean contains(Object o) {

    return map.containsKey(o);

}

检查map中是否有对应的key。

删除也是HashMap的方法:

public boolean remove(Object o) {

    return map.remove(o)==PRESENT;

}    

删除对应key的节点。

结论

HashSet原理较为简单,实现了Set接口,内部维护了一个HashMap,特点是无重复元素,元素无顺序,可以用于去重,集合运算,若想了解更深层次的,可以看看HashMap的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值