leeCode每日一题-设计哈希集合

本文围绕力扣每日一题,介绍不使用内建哈希表库设计哈希集合。给出问题描述及示例,还重学了HashSet与HashMap,包括HashMap的基础操作、HashSet的特性及去重方式,最后提到可依据散列表实现方式实现哈希集合及序列化相关内容。

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

问题描述:

不使用任何内建的哈希表库设计一个哈希集合(HashSet)。

实现 MyHashSet 类:

  • void add(key) 向哈希集合中插入值 key 。
  • bool contains(key) 返回哈希集合中是否存在这个值 key 。
  • void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。
  • 示例:

    输入:
    ["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"]
    [[], [1], [2], [1], [3], [2], [2], [2], [2]]
    输出:
    [null, null, null, true, false, null, true, null, false]
    
    解释:
    MyHashSet myHashSet = new MyHashSet();
    myHashSet.add(1);      // set = [1]
    myHashSet.add(2);      // set = [1, 2]
    myHashSet.contains(1); // 返回 True
    myHashSet.contains(3); // 返回 False ,(未找到)
    myHashSet.add(2);      // set = [1, 2]
    myHashSet.contains(2); // 返回 True
    myHashSet.remove(2);   // set = [1]
    myHashSet.contains(2); // 返回 False ,(已移除)

题解:

package basement.HashSet;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * @author: hj
 * @className: MyHashSet
 * @Describe:TODO
 */
public class MyHashSet implements HashSetDemo{

    /*
    * 题解1:HashSet是基于HashMap的一个没有重复元素的集合,允许存在null值
    * HashMap是散列表方式生成  769 = 512 + 256 + 1
    * */
    private static final int CAPACITY = 769;
    private LinkedList<Integer>[] list;

    public MyHashSet(){
        list = new LinkedList[CAPACITY];
        for (int i = 0; i < CAPACITY; i++){
            list[i] = new LinkedList<Integer>();
        }
    }

    public int hash(Object key){
        int h ;
//        高八位
        return key == null ? 0 : ((h = key.hashCode()) ^ (h >>> 8))% CAPACITY;
    }

    @Override
    public void add(int key) {
        int hashCode = hash(key);
        Iterator<Integer> iterator = list[hashCode].iterator();
        while (iterator.hasNext()){
            Integer ele = iterator.next();
            if (ele.equals(key)){
                return;
            }
        }
        list[hashCode].offerLast(key);
    }

    @Override
    public void remove(int key) {
        int hashCode = hash(key);
        Iterator<Integer> iterator = list[hashCode].iterator();
        while (iterator.hasNext()){
            Integer ele = iterator.next();
            if (ele.equals(key)){
                list[hashCode].remove(ele);
                return;
            }
        }
    }

    @Override
    public boolean contains(int key) {
        int hashCode = hash(key);
        Iterator<Integer> iterator = list[hashCode].iterator();
        while (iterator.hasNext()){
            Integer ele = iterator.next();
            if (ele.equals(key)){
                return true;
            }
        }

        return false;
    }
}

链表capacity设计参考源码,感谢大佬的讲解源码hashcode()取值的博文,获益匪浅:https://blog.youkuaiyun.com/weixin_46195957/article/details/125274802icon-default.png?t=N7T8https://blog.youkuaiyun.com/weixin_46195957/article/details/125274802

HashSet与HashMap重学

HashMap

hashmap是一个散列表,存储内容是键值对(key-value)映射。hashmap的key与value的类型可以相同也可以不同,不受限制。

HashMap中键值对可以重复,取值就近原则,允许存在null数值hashMap.put("key4",null);

基础操作(增删改查)

  1. 定义HashMap<String, Integer> hashMap = new HashMap<>();

  2. 增加

    hashMap.put("key1", 1);
    hashMap.put("key2", 2);
    hashMap.put("key3", 3);
  3. Object val = hashMap.get("key1");

  4. hashMap.remove("key1");
    Object val2 = hashMap.get("key1");
    System.out.println(val2);       //null
    hashMap.clear();    //全清除
  5. 替换hashMap.replace("key2", 3);

  6. 键值对数量hashMap.size();

  7. 包含hashMap.containsKey("key3")

  8. 是否为空hashMap.isEmpty()

  9. 返回所有values的数组集合System.out.println(hashMap.values());

HashSet

HashSet是基于HashMap的一个不允许有重复元素的集合,但允许有null数值

set是不包含重复元素的集合,即不包含e1.equals(e2)

  1. 定义:Set<Integer> hashSet = new HashSet<>();

  2. 增加:hashSet.add(1);

    迭代增加:

            List<Integer> list = new ArrayList<>();
            list.add(1);
            list.add(2);
            list.add(3);
            list.add(4);
            HashSet<Integer> intSet = new HashSet<>();
            Iterator in = list.iterator();
            while (in.hasNext()){
                intSet.add((Integer) in.next());
            }
            
    //      或
            for(int i : list){
                inset.add(li);
            }
    ​
    //        注意迭代器位置
            Iterator out = intSet.iterator();
            while (out.hasNext()){
                System.out.println(out.next());
            }
            System.out.println(intSet.size());
    Set<Integer> hashSet = new HashSet<>();
    System.out.println(hashSet.size());
    Iterator<Integer> iterator = hashMap.values().iterator();
    while (iterator.hasNext()){
        hashSet.add(iterator.next());
    }
    Iterator<Integer> it = hashSet.iterator();
    while (it.hasNext()){
        System.out.println(it.next());
    }
    System.out.println(hashSet.size());
    Set<Integer> hashSet = new HashSet<>();
    System.out.println(hashSet.size());
    Iterator<Integer> iterator = hashMap.values().iterator();
    while (iterator.hasNext()){
        hashSet.add(iterator.next());
    }
    Iterator<Integer> it = hashSet.iterator();
    while (it.hasNext()){
        System.out.println(it.next());
    }
    System.out.println(hashSet.size());
  3. 判断元素是否存在System.out.println(hashSet.contains(3));

  4. 删除

    hashSet.remove(3);
    System.out.println(hashSet.contains(3));
    hashMap.clear();
    System.out.println(hashSet.size());

HashSet去重方式

通过equals()与hashCode()实现去重

hashCode()通过比较不同HashSet对象的HashCode值进行判断是否对等

实现哈希集合

HashSet寄予HashMap实现数据存储,HashMap是散列表,故可依据散列表实现方式实现。

序列化

java中的transient关键字详解_transient关键字作用-优快云博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值