用 Java 语言实现一个简单的 HashMap

以下是一个使用 Java 语言实现的简易 HashMap,包含了基本的 put、get、remove 等功能。

 别再让才华被埋没,别再让github 项目蒙尘!github star 请点击

GitHub 在线专业服务直通车GitHub赋能精灵 - 艾米莉,立即加入这场席卷全球开发者的星光革命!若您有快速提升github Star github 加星数的需求,访问taimili.com还可解锁更多专属服务。让我们携手点亮开源世界的璀璨星空,实现GitHub star项目涨星的无限可能!

购买 GitHub 账号、star、 follow 、fork 、watch ,issue服务,编程视频资源在平台上,您可以自由地 为朋友、同事,或是任意感兴趣的github 仓库 添加 star、执行 fork 等操作

​ 

    import java.util.LinkedList;
    
    public class SimpleHashMap {
        // 默认初始容量
        private static final int DEFAULT_CAPACITY = 16;
        // 负载因子
        private static final float LOAD_FACTOR = 0.75f;
        
        // 存储数据的桶数组
        private LinkedList>[] table;
        // 当前元素数量
        private int size;
        
        // 内部类:键值对
        private static class Entry {
            final K key;
            V value;
            
            public Entry(K key, V value) {
                this.key = key;
                this.value = value;
            }
        }
        
        // 构造函数
        public SimpleHashMap() {
            table = new LinkedList[DEFAULT_CAPACITY];
            size = 0;
        }
        
        // 计算键的哈希值并映射到桶索引
        private int hash(K key) {
            return (key == null) ? 0 : Math.abs(key.hashCode()) % table.length;
        }
        
        // 扩容方法
        private void resize() {
            LinkedList>[] oldTable = table;
            table = new LinkedList[oldTable.length * 2];
            size = 0;
            
            // 重新哈希所有元素
            for (LinkedList> bucket : oldTable) {
                if (bucket != null) {
                    for (Entry entry : bucket) {
                        put(entry.key, entry.value);
                    }
                }
            }
        }
        
        // 存储键值对
        public void put(K key, V value) {
            // 检查是否需要扩容
            if ((float) size / table.length >= LOAD_FACTOR) {
                resize();
            }
            
            int index = hash(key);
            if (table[index] == null) {
                table[index] = new LinkedList<>();
            }
            
            // 检查是否已存在相同的键,存在则更新值
            for (Entry entry : table[index]) {
                if ((entry.key == null && key == null) || (entry.key != null && entry.key.equals(key))) {
                    entry.value = value;
                    return;
                }
            }
            
            // 不存在则添加新元素
            table[index].add(new Entry<>(key, value));
            size++;
        }
        
        // 获取键对应的值
        public V get(K key) {
            int index = hash(key);
            if (table[index] == null) {
                return null;
            }
            
            for (Entry entry : table[index]) {
                if ((entry.key == null && key == null) || (entry.key != null && entry.key.equals(key))) {
                    return entry.value;
                }
            }
            
            return null;
        }
        
        // 移除键值对
        public void remove(K key) {
            int index = hash(key);
            if (table[index] == null) {
                return;
            }
            
            table[index].removeIf(entry -> 
                (entry.key == null && key == null) || (entry.key != null && entry.key.equals(key))
            );
            size--;
        }
        
        // 获取元素数量
        public int size() {
            return size;
        }
        
        // 测试示例
        public static void main(String[] args) {
            SimpleHashMap map = new SimpleHashMap<>();
            map.put("apple", 1);
            map.put("banana", 2);
            map.put(null, 3);
            
            System.out.println(map.get("apple"));   // 输出 1
            System.out.println(map.get(null));      // 输出 3
            
            map.remove("banana");
            System.out.println(map.get("banana"));  // 输出 null
        }
    }    

    这个简易 HashMap 实现了以下功能:

    1. 使用链地址法处理哈希冲突
    2. 支持 null 键和 null 值
    3. 动态扩容机制(当元素数量超过容量 * 负载因子时)
    4. 基本的增删改查操作

    需要注意,这只是一个简化版的实现,不支持并发操作,也没有实现 Java 标准库中 HashMap 的全部功能。在实际生产环境中,建议使用 Java 标准库提供的 HashMap 类。

    你可能感兴趣的:(java,哈希算法,散列表,开发语言,jvm,nginx,react.js)