集合的初始尝试使用之登录&注册小程序-----没有重写equles方法的后果

学完集合之后,写一下网站登录注册用的小程序练习;
任务:通过控制台,写一个登录注册的交互程序
源码目录如下:
src→com.sunwoda.logreginterf→LogRegInterf.java如下:


 package com.sunwoda.logreginterf;

 import com.sunwoda.user.User;

 public interface LogRegInterf {
    public abstract boolean login(User user);   
    public abstract boolean register(User user);
 }

src→com.sunwoda.logregimpl→LogRegImpl.java如下:


package com.sunwoda.logregimpl;

import java.util.ArrayList;
import java.util.Iterator;

import com.sunwoda.logreginterf.LogRegInterf;
import com.sunwoda.user.User;

public class LogRegImpl implements LogRegInterf {
    ArrayList<User> ul = new ArrayList<User>();
    @Override
    public boolean login(User user) {
        if(ul.contains(user)){
            return true;
        }
        else{
        System.out.println("用户名不存在!");
        return false;
        }
    }

    @Override
    public boolean register(User user) {
        Iterator it = ul.iterator();
        while(it.hasNext()){
            User temp = (User)it.next();
            if(user.getAccount().equals(temp.getAccount())){
                System.out.println("用户名已存在!");
                return false;
            }
        }
        ul.add(user);
        return true;
    }
}

src→com.sunwoda.user→User.java如下:


package com.sunwoda.user;

public class User {
    private String account;
    private String password;
    public User() {
        super();

    }
    public User(String account, String password) {
        super();
        this.account = account;
        this.password = password;
    }
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [account=" + account + ", password=" + password + "]";
    }
}

src→com.sunwoda.welcome→Welcome.java如下:


package com.sunwoda.welcome;

import java.util.Scanner;

import com.sunwoda.logregimpl.LogRegImpl;
import com.sunwoda.user.User;

public class Welcome {
    public static void main(String[] args) {
        LogRegImpl lr = new LogRegImpl();
        String account;
        String password;
        boolean result;
        for(;;){
            System.out.println("请输入序号,选择操作:\n1,登录\n2,注册\n3,退出");
            int key = new Scanner(System.in).nextInt();
            switch(key){
            case 1:
                System.out.println("账号:");
                account = new Scanner(System.in).nextLine();
                System.out.println("密码:");
                password = new Scanner(System.in).nextLine();
                result = lr.login(new User(account,password));
                System.out.println(result);
                break;
            case 2:
                System.out.println("账号:");
                account = new Scanner(System.in).nextLine();
                System.out.println("密码:");
                password = new Scanner(System.in).nextLine();
                result = lr.register(new User(account,password));
                System.out.println(result);
                break;
            case 3:
                System.exit(0);
                break;
            default:
                break;
            }
        }
    }
}

这样写看起来没有问题,运行起来也没有什么错误,但是就是不按逻辑来走。。。哪里不按逻辑走呢?
在运行时,首先输入2,进行注册,注册后输入1,开始登录,,可是怎么登就是登不上,问题出在哪儿呢?找来找去,只有这里有问题了:

public boolean login(User user) {
        if(ul.contains(user)){
            return true;
        }
        else{
        System.out.println("用户名不存在!");
        return false;
        }
    }

怎么验证,程序就是不进

if(ul.contains(user)){
            return true;
  }

里面,判断输入数据,是否能个集合内元素匹配相等,结果看到的一直显示登录false。
问题就在这里,下面来看看contains()方法内部:

public boolean contains(Object o) {
    return indexOf(o) >= 0;
    }

indexOf()方法内部:

public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = 0; i < size; i++)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
    }

这里面出现了equals()方法,并且是o的equals()方法,o是什么呢?
顺着看上去,o就是

if(ul.contains(user)){
            return true;
  }

中的传入user对象,那么,将登录输入数据和集合匹配的核心就在于通过equles()方法进行判断是否相同,,,再回头看看,上面写的User.java中并没有重写equles()方法,那么调用的就是默认的Object类的equles方法:

public boolean equals(Object obj) {
    return (this == obj);
    }

“==”只有在两个标识符指向同一个对象时才为true,显然在这里肯定是false,这就是输出总是为登录失败的原因所在了。

怎么解决呢?
答:重写User.java的equles()方法;
进入User.java,按下快捷键Alt+Shift+s,继续按h,即可自动重写equles方法,重写如下:

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (account == null) {
            if (other.account != null)
                return false;
        } else if (!account.equals(other.account))
            return false;
        if (password == null) {
            if (other.password != null)
                return false;
        } else if (!password.equals(other.password))
            return false;
        return true;
    }

看下这个方法在什么情况下才会输出true,就会明白为什么要重写,
对于User对象来说,
要么传入User对象和此User对象同属一个对象,
要么传入User对象中的内容(内容也是就会account和password变量),和此User对象中的内容对应相等。
显然,我们在此小程序main方法中最终是通过后者来对比匹配相等,达到登录成功的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值