You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java:JTextField文本与HashMap字符串值对比返回false的原因排查

问题:对比HashMap字符串值与JTextField文本时if判断返回false的原因

你遇到的情况:调用LoginOperations.Login方法时,传入硬编码密码(如"password3")能返回true,但传入JTextField的输入值就返回false,相关代码如下:

事件处理代码

public void actionPerformed(ActionEvent e) {
    if(LoginOperations.Login(Integer.valueOf(customerNumberField.getText()), 
            passwordField.getText())) {
        // 登录成功逻辑
    }
}

LoginOperations类代码

public class LoginOperations {
    
    public static HashMap<Integer, String> loginCredentials = new HashMap<Integer, String>();
    
    public static void CreateDummyLoginData() {
        loginCredentials.put(123451, "password1");
        loginCredentials.put(123452, "password2");
        loginCredentials.put(123453, "password3");
        loginCredentials.put(123454, "password4");
    }
    
    public static boolean Login(int customerNumber, String password) {
        //to do: masking the password with hash table
        CreateDummyLoginData();
        String debug = loginCredentials.get(customerNumber);
        if(loginCredentials.get(customerNumber) == password) {
            return true;
        }
        else {
            return false;
        }
    }
}

原因分析

  1. 字符串比较方式错误:
    Java中==运算符比较的是对象的内存地址,而非字符串内容。

    • 硬编码的字符串字面量会被JVM存入字符串常量池,相同字面量的地址一致,所以==能匹配成功。
    • JTextField的getText()返回的是新创建的字符串对象,和常量池中的字符串地址不同,因此==判断返回false。
  2. 冗余的数据初始化:
    每次调用Login方法都会执行CreateDummyLoginData(),重复向HashMap插入相同键值对,虽然不会报错,但属于无效操作,浪费资源。


修复方案

修改LoginOperations类代码

public class LoginOperations {
    
    public static HashMap<Integer, String> loginCredentials = new HashMap<Integer, String>();
    
    // 静态代码块初始化数据,仅在类加载时执行一次
    static {
        CreateDummyLoginData();
    }
    
    public static void CreateDummyLoginData() {
        loginCredentials.put(123451, "password1");
        loginCredentials.put(123452, "password2");
        loginCredentials.put(123453, "password3");
        loginCredentials.put(123454, "password4");
    }
    
    public static boolean Login(int customerNumber, String password) {
        //to do: masking the password with hash table
        String storedPassword = loginCredentials.get(customerNumber);
        // 用equals比较内容,同时避免空指针异常
        return storedPassword != null && storedPassword.equals(password);
    }
}

关键修改点

  • 用equals()方法比较字符串的实际内容,这是Java字符串比较的标准方式。
  • 添加storedPassword != null判断,防止当用户编号不存在时调用equals()抛出空指针异常。
  • 改用静态代码块初始化登录数据,避免重复执行插入操作,提升效率。

内容的提问来源于stack exchange,提问作者mlkmhmtbyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:46:25