Java JPasswordField值和字符串不相等,但它们看起来相同
我知道人们以前问过这个问题,但他们没有使用Java JPasswordField值和字符串不相等,但它们看起来相同,java,string,jpasswordfield,Java,String,Jpasswordfield,我知道人们以前问过这个问题,但他们没有使用.equals()。所以我要再次问,为什么我有两个字符串,但是当我将它们与.equals()比较时,我得到了false。这两个字符串是1234(passwordField2.getPassword()和String s=bufferedreader.readLine()),我用s.tocharray来比较它们,也是一样。我试着把它们都打印出来,结果 1234 1234 有人知道为什么会这样吗? 谢谢大家! 查看,passwordField2.getPas
.equals()
。所以我要再次问,为什么我有两个字符串,但是当我将它们与.equals()
比较时,我得到了false。这两个字符串是1234(passwordField2.getPassword()
和String s=bufferedreader.readLine()
),我用s.tocharray来比较它们,也是一样。我试着把它们都打印出来,结果
1234
1234
有人知道为什么会这样吗?
谢谢大家! 查看,passwordField2.getPassword()
返回一个char[]
以下代码应适用于您:
boolean passwordsMatch = bufferedreader.readLine().equals(
new String(passwordField2.getPassword())
);
此代码将char[]
转换为一个字符串,然后可以将该字符串与原始String
值进行比较
编辑:,JPasswordField
出于安全目的将密码存储为字符数组
因此,编写此代码的更好方法可能是:
boolean passwordsMatch = Arrays.equals(
passwordField2.getPassword(),
bufferedreader.readLine().toCharArray()
);
结合其他答案和其他观点,这里有几个问题: 第二个密码中有额外的空格。您不应该修剪字符串,否则将忽略前导空格和尾随空格,这是一种糟糕的做法
另外,
JPasswordField
s在调用getPassword()
(读取原因)时将返回一个char[]
,并且字符数组永远不会等于字符串。解决此问题的最佳方法(就安全性而言)是将密码存储为字符数组。然后,您可以使用Arrays.equals(arr1,arr2)
检查密码是否相等。空白?它们的长度相等吗?看起来第二个上有一个额外的空间。尝试在修剪后比较它们<代码>密码字段2.getPassword().trim().equals(bufferedReader.readLine().trim())@Todd我试过这么做,但是.trim()
对JPasswordField
不字符串不起作用。equal()
不等于字符串。找出原因:也许是调试器。另外,有些对象在“预期方式”中不支持equals()
(这相当于使用arr1==arr2
)。返回一个char[]
。也许这就是它们不匹配的原因?现在您已经取消了在上面使用char[]的安全性原因String@MadProgrammer我认为,如果我深入研究Java中的密码最佳实践,这可能超出了这个问题的范围。如果他们能改进答案,我愿意接受任何建议的编辑。安全性从未超出范围,也不是正确和专业的做法谢谢@TaylorHx!我还注意到bufferedreader.readLine().equals(String.valueOf(passwordField2.getPassword())代码>也有效。