JavaSE_Java实现开散列哈希桶,测试重载hashCode方法

本文详细介绍C++中哈希表的实现,涉及哈希函数设计、解决哈希冲突的闭散列与开散列方法,以及针对字符串的模板特化。通过Java代码实例演示如何使用负载因子调整和自定义类型重写hashCode,适用于Key-Value存储模型的数组实现。

C++哈希函数_哈希表_哈希冲突_负载因子_仿函数_针对字符串的模板特化特化_闭散列(线性探测)哈希表_开散列哈希桶的模拟实现(Key_Value模型数组

具体思路看上面的链接,这里直接给出Java代码

import java.util.HashMap;
import java.util.Objects;

class Hash {
    static class Node {
        public int key;
        public int val;
        public Node next;

        public Node(int key, int val) {
            this.key = key;
            this.val = val;
        }
    }

    private Node[] array;
    public int useSize;

    public Hash() {
        this.useSize = 0;
        this.array = new Node[10];
    }

    public void put(int key, int val) {
        //找到key所在的位置
        int index = key % this.array.length;
        //遍历链表,看是否有相同的key
        Node node = this.array[index];
        while (node != null) {
            if (node.key == key) {
                node.val = val;
                return;
            }
            node = node.next;
        }
        //没有这个元素,头插法
        //先检查负载因子
        this.useSize++;
        if (loadFacter() > DEFAULT_LOADFACTER) {
            //扩容
            resize();
        }
        node = new Node(key, val);
        node.next = this.array[index];
        this.array[index] = node;
    }

    public int get(int key) {
        int index = key % this.array.length;
        Node node = this.array[index];
        while (node != null) {
            if (node.key == key) {
                return node.val;
            }
            node = node.next;
        }
        return -1;//没找到返回-1
    }

    public static final double DEFAULT_LOADFACTER = 0.75;

    private double loadFacter() {
        return 1.0 * this.useSize / this.array.length;
    }

    private void resize() {
        Node[] new_array = new Node[2 * this.array.length];
        for (int i = 0; i < this.array.length; i++) {
            Node node = this.array[i];
            while (node != null) {
                int index = node.key % new_array.length;
                //记录下一个节点
                Node next = node.next;
                node.next = new_array[index];
                new_array[index] = node;
                node = next;
            }
        }
        this.array = new_array;
    }
}

//测试HashCode
class Person {//自定义类型重写hashCode函数
    public String name;

    public Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

public class HashCode {
    public static void main(String[] args) {
        Hash hash = new Hash();
        for (int i = 0; i < 20; i++) {
            hash.put(i, i + 1);
        }
        for (int i = 20; i >= 0; i--) {
            System.out.print(hash.get(i) + " ");
        }
        System.out.println();
        System.out.println(new Person("123").hashCode());
        System.out.println(new Person("123").hashCode());
        HashMap<Person, Integer> hashMap = new HashMap<>();
        Person person = new Person("Hello");
        hashMap.put(person, 1);//需要重写hashCode方法
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaiRong-NUC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值