Java HashSet 的常用方法以及实现原理

一、概念

HashSet 是 Java 中的一种集合类,它实现了 Set 接口,并使用哈希表(HashMap)作为其底层数据结构。哈希表是一种以键值对(key-value)形式存储数据的数据结构,它根据键的哈希值进行快速的查找、插入和删除操作

二、构造器

/**
 * 默认的无参构造器,创建一个HashMap。
 * 因此,默认加载因子0.75,默认初始容量16
 */
public HashSet() {
    map = new HashMap<>();
}

/**
 * 将参数c,也就是集合添加到HashMap中
 * 默认加载因子0.75,容量大小是取 ((c.size()/.75f) + 1) 和 16 两个的最大值
 * 也就是 c.size >= 12 时,容量为 ((c.size()/.75f) + 1)
 * c.size < 12 时,容量为 16
 */
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

/**
 * 创建一个容量为initialCapacity和加载因子为loadFactor的HashMap
 * initialCapacity不能小于0; loadFactor不能小于等于0
 */
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

/**
 * 创建一个容量为initialCapacity的HashMap
 * 默认加载因子为0.75
 */
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}

三、常用方法

/**
 * 因为,HashSet的内部是基于HashMap实现的,而HashSet的元素都是存储在Key中
 * 所以,PRESENT相当于占位符,作为HashMap每个Key的Value
 * 并且该PRESENT被static修饰,也节省了内存空间,即不需要为每个Key分配一个Value
 */
private static final Object PRESENT = new Object();

/**
 * 使用HashMap的put()方法将元素添加到内部的HashMap中
 * true,即添加成功,说明集合中没有与元素e相同的元素
 * false,即添加失败,说明集合中存在与元素e相同的元素
 */
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

/**
 * map.remove(o)也就是HashMap中的remove方法。根据Key删除键值对,并返回对应的value
 * true,删除成功,说明返回了o对应的value,也就是PRESENT
 * false,删除失败,说明返回了null,也就是比较地址失败
 */
public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

/**
 * 调用HashMap的size()方法,返回HashMap中键值对的数量,也就是集合中元素的数量
 */
public int size() {
    return map.size();
}

/**
 * 调用HashMap的isEmpty()方法,判断HashMap中是否包含任何键值对
 * true,说明集合中不包含任何元素
 * false,说明集合中包含元素
 */
public boolean isEmpty() {
    return map.isEmpty();
}

/**
 * 调用HashMap的containsKey()方法来判断map中是否包含指定的Key,即是否包含元素o
 * true,说明存在与o相等的Key
 * false,说明没有相等的Key
 */
public boolean contains(Object o) {
    return map.containsKey(o);
}

/**
 * 调用底层HashMap的keySet()方法来获取HashMap中所有Key的集合,也就是HashSet
 * 返回一个Iterator对象,用于遍历集合中的元素
 * 使用 hasNext() 和 next() 方法按顺序遍历集合中的元素
 */
public Iterator<E> iterator() {
    return map.keySet().iterator();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java HashSet类是一个基于HashMap实现的集合类,它不允许有重复元素。HashSet类是无序的,即不会记录插入的顺序。它也不是线程安全的,如果多个线程同时修改HashSet,则最终结果是不确定的,需要显式同步对HashSet的并发访问。HashSet实现了Set接口,它可以存储对象,并且通过使用哈希码来提高存取效率。可以使用add()方法HashSet中添加元素,使用remove()方法删除集合中的元素,使用clear()方法删除所有元素。还可以使用size()方法获取HashSet的大小。在使用HashSet之前,需要先导入java.util包。以下是一个示例代码: import java.util.HashSet; public class Example { public static void main(String[] args) { HashSet<String> set = new HashSet<>(); // 添加元素 set.add("Apple"); set.add("Banana"); set.add("Orange"); // 删除元素 set.remove("Banana"); // 计算大小 int size = set.size(); System.out.println("HashSet的大小为:" + size); } } 在这个示例中,我们创建了一个HashSet对象,用于保存字符串元素。通过add()方法向集合中添加元素,使用remove()方法删除元素,使用size()方法计算集合的大小。最终输出HashSet的大小为2。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [实例讲解Java HashSet](https://download.csdn.net/download/weixin_38665411/12723550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【JavaHashSet的一些基本用法](https://blog.csdn.net/qq_63511424/article/details/125359653)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值