当前位置: 首页 > 知识库问答 >
问题:

关于hashmap实现的问题[关闭]

娄阳舒
2023-03-14

我想实现一个hashmap,但是当我测试时,直接运行和调试运行的结果不一致

下面是我的代码

public class HashMap {

    //test
    public static void main(String[] args) {
        var map = new HashMap();
        map.put("c1", "1");
        map.put("w1", "2");
        map.put("m1", "3");
        System.out.println(map.get("c1"));
        System.out.println(map.get("w1"));
        System.out.println(map.get("m1"));
    }
    ListNode[] map = new ListNode[10];

    int size;

    public void put(String key, String value) {
        if (size >= map.length * 0.75f) {
            System.out.println("Capacity expansion required");
        }
        int index = Math.abs(key.hashCode() % map.length);
        ListNode node = map[index];
        if (node == null) {
            node = new ListNode();
            node.head = new Node(key, value, null);
            map[index] = node;
        } else {
            node.addNode(key, value);
        }
        size++;
    }

    public String get(String key) {
        int index = Math.abs(key.hashCode() % map.length);
        ListNode node = map[index];
        if (node == null) {
            return null;
        }
        return node.getValue(key);
    }

    static class Node {
        String key;
        String value;
        Node next;

        public Node(String key, String value, Node next) {
            this.key = key;
            this.value = value;
            this.next = next;
        }
    }

    /**
     * Single linked list container
     */
    static class ListNode {
        Node head;
        Node tail;

        public void addNode(String key, String value) {
            if (head == null) return;
            Node node = new Node(key, value, null);
            //only one
            if (tail == null) {
                if (key.equals(head.key))
                    head.value = value;
                else {
                    head.next = node;
                    tail = node;
                }
            } else {
                if (key.equals(tail.key)) {
                    tail.value = value;
                } else {
                    tail.next = node;
                    tail = node;
                }
            }
        }

        public String getValue(String key) {
            if (head == null) return null;
            if (head.next == null) {
                return head.value;
            } else {
                do {
                    if (key.equals(head.key)) {
                        return head.value;
                    }
                    head = head.next;
                } while (head.next != null);
            }
            return null;
        }
    }
}

这是我的直接运行时的结果

1
2
null

当我在没有断点的情况下调试和运行时,结果同上。但当我踏过它,结果如下

1
2
3

谁能告诉我为什么???

共有1个答案

融烨华
2023-03-14

您应该在此处处理HashMap的最后一个元素:

do {
    if (key.equals(head.key)) {
        return head.value;
    }
    head = head.next;
} while (head.next != null);

因为头。next在从ListNode获取最后一个元素时没有值,它不能返回m1的值。

 类似资料:
  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 刚开始学习java大约一个月,我对arraylist和oop有几个问题 这个arraylist允许我将字符串添加到列表中并存储它,但是如果我有一个类调用簿呢 这三者有什么区别?假设我有大量的输入,比如文件 我有一个班级运动 我该怎么做呢?所以我用许多参数来添加这些输入,因为如果我想添加,我通常会这样做 我也会去

  • 问题内容: 常量INADDR_ANY是所谓的IPv4通配符地址。通配符IP地址对于在多宿主主机上绑定Internet域套接字的应用程序很有用。如果多宿主主机上的应用程序将套接字仅绑定到其主机的IP地址之一,则该套接字只能接收发送到该IP地址的UDP数据报或TCP连接请求。但是,我们通常希望多宿主主机上的应用程序能够接收指定主机IP地址的数据报或连接请求,并将套接字绑定到通配符IP地址可以实现这一点

  • 有时我们会遇到几个关于Autoconf的问题。下面是被提及的一些问题。 发布configure脚本 对发行由Autoconf生成的configure有什么限制?它们是如何影响我那些使用它们的程序的? 关于由Autoconf生成的配置脚本是如何发行和如何被使用的,并没有限制。在Autoconf第1版中,它们是服从GNU通用公共许可证的。 我们仍然鼓励软件的作者按照诸如GPL的条款发行他们的作品,但A

  • 问题内容: 我想查询在以下情况下flush方法的实际作用: 这是否意味着在迭代20之后,将刷新高速缓存,然后将这20个保留的内存对象实际保存在数据库中? 有人可以告诉我当条件为真时会发生什么。 问题答案: 来自的javadoc : 强制刷新该会话。必须在提交事务并关闭会话之前在工作单元的末尾调用(取决于 flush- mode ,Transaction.commit() 调用此方法)。 刷新 是将

  • 过去几天我一直在使用java,最近几天我收到了一个问题表单。当我试图在servlet中创建一个类时,包部分显示以下错误"** > 无法解析ObjectInputStreamjava.io.类型。它是从必需的. class文件间接引用的 当我试着评论出 导入javax.servlet.http.HttpServlet; **"部分的错误是去,但我不能扩展的http的servlet类。 此图像显示错误

  • 我们基本上是在使用这里记录的Git流:http://nvie.com/posts/a-successful-git-branching-model/.现在开发人员提出了一些问题: 我们从哪里发布代码到生产?发布/修补程序分支还是主分支 我还有更多问题: 如果发布分支没有变化,为什么我们甚至需要一个?我来自ClearCase世界,我总是有这样的印象,如果没有变化,分支就不需要了。 为什么Git不经常