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; } } }
原因分析
字符串比较方式错误:
Java中==运算符比较的是对象的内存地址,而非字符串内容。- 硬编码的字符串字面量会被JVM存入字符串常量池,相同字面量的地址一致,所以
==能匹配成功。 - JTextField的
getText()返回的是新创建的字符串对象,和常量池中的字符串地址不同,因此==判断返回false。
- 硬编码的字符串字面量会被JVM存入字符串常量池,相同字面量的地址一致,所以
冗余的数据初始化:
每次调用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
相关产品推荐
相关产品推荐

