java - 为什么等于功能不起作用?

标签 java equals

当我编译下面的代码时,它显示(字符串)用户名和 myList.get(0) 相等,但 equals 函数返回 false,为什么密码也会发生同样的情况。

btnLogIn.addActionListener(new ActionListener()
 {
   public void actionPerformed(ActionEvent e) {

    String Username=(String) textField.getText();   //fatch the user name from text field
    String Password=(String) textField_1.getText();  //fatch password frof text field
    databaseconnection connect = new databaseconnection(); // databaseconnection class object to connect to data base
    ArrayList myList = connect.search(Username,Password);  //serch the username and password in data base
            System.out.println((String)myList.get(0));  //for testing 
            System.out.println((String)myList.get(1));  //for testing
            System.out.println(Username);               //for testing
            System.out.println(Password);               //for testing
            System.out.println(Username.equals(myList.get(0)));  //for testing 
            System.out.println(Password.equals((String)myList.get(1)));   //for testing
            if(Username.equals(myList.get(0))&&Password.equals((String)myList.get(1))){
            System.out.println("Hello"+Username);
            }
        }
    });

enter image description here

这是我的数据库连接类

   import java.sql.*;
   import java.util.ArrayList; 

 public class databaseconnection{
Statement stmt  ;
ResultSet rs ;
Connection conn;
ArrayList<String> temp = new ArrayList<String>();

public void getconnection(){

try{


    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

    Connection conn = DriverManager.getConnection("jdbc:odbc:Database1","","");

    stmt = conn.createStatement();


}
catch(Exception e){
    System.out.println("connection error");
}
}
public ArrayList  search(String Username,String Password){

    getconnection();
    try{
    rs = stmt.executeQuery("select username,password from login where username = \'"+Username+"\'");
    if(rs.next()){
    String tempString=rs.getString("username");
    temp.add(tempString);
    tempString= rs.getString("password");
    temp.add(tempString);
    }
    }
    catch(Exception e){
    System.out.println("search error");
    }
    return temp;
  }

  }

最佳答案

我将你的代码重写为:

String Username = "user";
String Password = "pass";

List<String> myList = new ArrayList<>(); 
myList.add("user");
myList.add("pass");

System.out.println(Username);
System.out.println(Password);
System.out.println(myList.get(0));
System.out.println(myList.get(1));
System.out.println(Username.equals(myList.get(0)));
System.out.println(Password.equals(myList.get(1)));

if (Username.equals(myList.get(0)) && Password.equals(myList.get(1))) {
    System.out.println("Hello, " + Username);
}

现在可以了。请注意<String>在列表声明之后。这就是 generics并说只有 Strings可以放入列表中。它还消除了任何显式转换的需要,显式转换很容易出错,并且只有在您确定可以安全地执行的情况下才应该执行。

如果您根据此更改了代码但仍然没有得到正确的结果,请确保连接中的值正确并且不包含任何类型的不可见字符。

<小时/>

另外,在Java中,变量名通常在 lowerCamelCase 中。类名应该在 UpperCamelCase 中。请参阅Java naming conventions .

Don't forget to close your connections! Java 7 automatic resource management可以帮助你。在一般情况下,您还应该处理任何连接错误。

根据变量的作用来命名变量是个好主意。因此,您的代码应该看起来更像这样:

public void actionPerformed(ActionEvent e) {
    String username = "user";
    String password = "pass";

    List<String> dtbSearchResults;
    try (DatabaseConnection connection = new DatabaseConnection()) {
        dtbSearchResults = connection.search(username, password); 
    } catch (SomeExceptionYouReallyShouldHandle e) {
        // seriously, handle it here
    }

    System.out.println(username);
    System.out.println(password);
    System.out.println(dtbSearchResults.get(0));
    System.out.println(dtbSearchResults.get(1));
    System.out.println(username.equals(dtbSearchResults.get(0)));
    System.out.println(password.equals(dtbSearchResults.get(1)));

    if (username.equals(dtbSearchResults.get(0)) && password.equals(dtbSearchResults.get(1))) {
        System.out.println("Hello, " + username);
    }
}

它仍然不完美,因为 search()方法应该返回 UserCredentials 类型的实例或 List<UserCredentials> 的实例基于它应该做什么。 UserCredentials然后看起来像这样:

public class UserCredentials {

    private final String username;
    private final String password;

    public UserCredentials(String username, String password) {
        // maybe some validity checks
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

}

实现此类后,您的代码将如下所示(假设 search() 应仅返回一个结果):

public void actionPerformed(ActionEvent e) {
    String username = "user";
    String password = "pass";

    UserCredentials user;
    try (DatabaseConnection connection = new DatabaseConnection()) {
        user = connection.search(username, password); 
    } catch (SomeExceptionYouReallyShouldHandle e) {
        // seriously, handle it here
    }

    System.out.println(username);
    System.out.println(password);
    System.out.println(user.getUsername());
    System.out.println(user.getPassword());
    System.out.println(username.equals(user.getUsername()));
    System.out.println(password.equals(user.getPassword()));

    if (username.equals(user.getUsername())
            && password.equals(user.getPassword())) {
        System.out.println("Hello, " + username);
    }
}

如有任何其他问题,请提出。

关于java - 为什么等于功能不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14673827/

相关文章:

java - 为什么 hadoop_home 设置不正确

Java HashSet 允许重复

html - 使用CSS创建两个等高布局列,并在右侧列内插入三个等高堆叠列

c++ - = 符号的替代方案

Java - 特定的 .contain() 逻辑

java - Spring可以自动处理验证错误吗?

java - 事件计数的窗口聚合

java - 使用 compareTo 实现 equals 方法

java - 仅覆盖 Java 对象的 equals() 方法

java - Annotation.equals() 与 Object.equals()