Java 如何使用.equals()方法比较两个密码(创建密码和确认密码)?

Java 如何使用.equals()方法比较两个密码(创建密码和确认密码)?,java,swing,serialization,passwords,Java,Swing,Serialization,Passwords,我正在构建一个简单的createaccountusergui,它与我的LogInScreen类集成。它创建一个简单用户,将其序列化,然后让我在登录程序中使用该访问权限。问题是,当我输入密码时,它们永远都不正确。我总是遇到一个问题,我的程序告诉我我的密码不一样。我不知道如何解决这个问题,我想知道如何解决。我将在下面发布我的代码(整个过程,以及我的序列化类,因为问题可能就在这里) 用户类别: package passwordProgram; import java.util.ArrayList;

我正在构建一个简单的createaccountusergui,它与我的LogInScreen类集成。它创建一个简单用户,将其序列化,然后让我在登录程序中使用该访问权限。问题是,当我输入密码时,它们永远都不正确。我总是遇到一个问题,我的程序告诉我我的密码不一样。我不知道如何解决这个问题,我想知道如何解决。我将在下面发布我的代码(整个过程,以及我的序列化类,因为问题可能就在这里)

用户类别:

package passwordProgram;

import java.util.ArrayList;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.Serializable;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;

public class User implements Serializable, ActionListener {

    public static ArrayList<String> allUsernames = new ArrayList<String>();

    String username;
    String password;

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        User user = new User();
        user.mainGUI();
    }



    JFrame frame;
    JPanel panel;
    JTextField createUsername;
    JPasswordField createPassword;
    JPasswordField confirmPassword;
    JButton createAccount;
    JLabel noValid;

    public void mainGUI() {
        noValid = new JLabel();
        frame = new JFrame("Create a new account!");
        panel = new JPanel();
        panel.setBackground(Color.ORANGE);
        createPassword = new JPasswordField(10);
        confirmPassword = new JPasswordField(10);
        createUsername = new JTextField(10);
        JLabel userTxt = new JLabel("New Username: ");
        JLabel userPass = new JLabel("New Password: ");
        JLabel confirmPass = new JLabel("Confirm Password: ");
        createAccount = new JButton("Create your account!");

        panel.setLayout(new GridBagLayout());
        GridBagConstraints left = new GridBagConstraints();
        left.anchor = GridBagConstraints.WEST;
        GridBagConstraints right = new GridBagConstraints();
        right.anchor = GridBagConstraints.EAST;
        right.weightx = 2.0;
        right.fill = GridBagConstraints.HORIZONTAL;
        right.gridwidth = GridBagConstraints.REMAINDER;

        frame.getContentPane().add(BorderLayout.NORTH, noValid);
        frame.getContentPane().add(BorderLayout.CENTER, panel);
        panel.add(userTxt, left);
        panel.add(createUsername, right);
        panel.add(userPass, left);
        panel.add(createPassword, right);
        panel.add(confirmPass, left);
        panel.add(confirmPassword, right);

        frame.getContentPane().add(BorderLayout.SOUTH, createAccount);
        frame.setVisible(true);
        frame.setSize(500, 300);

        createAccount.addActionListener(this);
    }

    public void actionPerformed(ActionEvent event) {
        if (createUsername.getText().length() <= 0 ) {
            noValid.setText("That is not a valid username. Please try again.");
            frame.getContentPane().add(BorderLayout.NORTH, noValid);
        }

        else if (allUsernames.contains(createUsername.getText())) {
            noValid.setText("That username is already taken. Please try again.");
            frame.getContentPane().add(BorderLayout.NORTH, noValid);
        }

            //THIS IS THE PART I'M CONFUSED ABOUT
        else if (!(createPassword.getPassword().equals(confirmPassword.getPassword()))) {
            noValid.setText("Your passwords do not match!");
            frame.getContentPane().add(BorderLayout.NORTH, noValid);
        } else {    
            SaveUser sUser = new SaveUser();
            sUser.createAccount(this);
            noValid.setText("Account created successfully");
            frame.getContentPane().add(BorderLayout.NORTH, noValid);
        }
    }
}
getPassword()
返回一个
char[]
。因此,请尝试:

if (!(new String(createPassword.getPassword()).equals(new String(confirmPassword.getPassword()))

您正在比较的是
char
array
对象(由返回),而不是数组本身的内容。比较这两个数组最安全的方法是使用
数组#equals

else if (!(Arrays.equals(createPassword.getPassword(), 
                            confirmPassword.getPassword()))) {

JPasswordField.getPassword()
返回一个
char[]
。使用两个字符数组调用
array1.equals(array2)
将检查它们是否是相同的对象引用,而不是它们是否具有相同的内容。您想使用,就像这样:

else if (!Array.equals(createPassword.getPassword(), confirmPassword.getPassword()))
getPassword()
返回
char[]
,而不是
String
。使用

!(Arrays.equals(createPassword.getPassword(), confirmPassword.getPassword()))

相反,除非这是一个玩具项目,否则不应该以明文形式存储密码。相反,存储密码的散列;用户登录时,对密码进行散列,并将其与存储的散列进行比较

首先,你不应该把一个类和它的GUI结合起来。GUI和类都应该有单独的文件,如果您想使用另一个GUI或没有GUI的地方再次使用
User
,该怎么办?
serializable
类不声明与问题无关的
static final serialversionuid
类型的字段,尽管如此,请使用
frame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)
优雅地关闭Swing应用程序。此外,如果您使用的是
JDK 7
,那么请停止使用
frame.getContentPane().add(blahblah)
,而只需简单地使用
frame.add(blahblah,BorderLayout.CENTER)
+1就可以了,但这实际上并不能回答问题。这个问题实际上是关于比较两个char[]变量是否相等。罪名成立,但在我发布帖子时,其他四个人已经回答了这个问题。@Zim-ZamO'Pootertoot感谢你的回答,尽管这有点无关紧要。如果您想查看我的完整代码并回答我的另一个问题,您可以这样做:您应该避免将密码字符数组转换为字符串,这会在字符串内部化到JVM时使密码暴露给潜在的黑客(当然,它可能不是一个企业应用程序,但可能会鼓励良好的实践)
!(Arrays.equals(createPassword.getPassword(), confirmPassword.getPassword()))