黑马程序员技术交流社区

标题: 为什么输入name为li,code为12,输入正确,还进入不了系统 [打印本页]

作者: hujch    时间: 2017-3-13 19:56
标题: 为什么输入name为li,code为12,输入正确,还进入不了系统
import java.util.Scanner;
public class hello{
        public static void main(String [] args){
                Scanner input =new Scanner(System.in);
                String name; int code;int i=1;int j=2-i;
                for(i=1;i<=3;i++){System.out.println("请输入用户名:"); name=input.next();
                System.out.println("请输入密码:");code=input.nextInt();
                if(name=="li"&&code==12){System.out.println("欢迎进入系统!");break;
                       
                }else { System.out.println("输入错误,您还有"+(3-i)+"次机会\n");if(i==3){ System.out.println("对不起,您3次均输入错误");}continue;
                       
                }
                }               
        }
}


作者: 北海北    时间: 2017-3-13 22:13
将name==li改成name.equal(”li”)

作者: lvshen9    时间: 2017-3-14 08:51
楼上正解,String类型用==是地址判断

作者: hujch    时间: 2017-3-14 09:02
北海北 发表于 2017-3-13 22:13
将name==li改成name.equal(”li”)

谢谢,

作者: xulinml    时间: 2017-3-14 09:06
本帖最后由 xulinml 于 2017-3-14 09:21 编辑

对于String这样的引用数据类型来说
== 比较的是地址值,equals() 比较的是引用数据类型的 值
因此你这个应该用equals;
但是有时候我们比较程序中自己定义的一些字符串的时候,equals和== 号却有相同的结果,比如下面这个:
String name1 = "123";
String name2 = "123";
比较name1==name2和 name.equals(name2)都返回true,
这是因为,程序先将"123"的地址值赋给了name1,
第二次赋值的时候由于java对于String常量的优化,不会新建一个已有的"123",而是将已有的"123"的地址值赋给name2;
因此这时候name1 和 name2 无论是地址是还是值都是相等的
对于程序中Scanner从键盘中获取得到的字符串地址值和你自己设置的那个"lin"的地址值就不一样了;
这也是为什么你的程序用==会一直报错的原因了








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2