关于java中控制台输入和String类“==”和“equals”的研究

来源:互联网 发布:2016十大网络主播排名 编辑:程序博客网 时间:2024/05/23 15:07

今天在图书馆试着用新学习的java编写一个银行综合存储系统玩玩,结果程序框架弄好了。不料,卡在了管理员账户验证的地方。

我的方法是使用System.in读取控制台输入的字符串:

 

public static String readKeyboard()

    {

       try

       {

           byte[] b=new byte[1024];    //b为缓存

           int n=System.in.read(b);    //读取控制台输入内容到b

           String s=new String(b,0,n); //生成输入的字符串

           return s;

       }

       catch(Exception e)

       {}

       return "";

    }

 

然后,我用String b=readKeyboard();把输入的字符串存到b中。然后和“admin”比较,相同则通过,不同则报错。结果在我输入“admin”后报错。

寻找错误无果后写下了如下测试代码:

 

public static void main(String[] args)

    {

       String a="wang";

       String b=readKeyboard();        //从控制台采集字符串

       System.out.println(a+" "+b);    //分别输出两个字符串

       if(a==b)                        //比价两个字符串,并输出相应结果

       {

           System.out.println("a==b");

       }

       else

       {

           System.out.println("a!=b");

       }

    }

 

然后运行输入“wang”,运行结果如下:
 

wang(这个是键盘输入的wang,以下本颜色即为键盘输入)

wang wang
 

a!=b

明明是相同的两个“wang”,为什么结果是“a!=b”呢?仔细观察发现输出结果的第四行为空行。仔细想下,应该是readKeyboard()把换行符给读取存进b中了,为了过滤掉最后的换行符,我们把readKeyboard()中第七行String s=new String(b,0,n); 换成String s=newString(b,0,n-2);

然后运行修改后的程序,仍然输入“wang”,运行结果如下:

wang

wang wang

a!=b

这就让我非常费解了,这次明明是两个完全一样的字符串,为什么计算机比较的结果还是不相同呢?使用了多种方法无果时我想起了比较String类相同还有一个equals方法,我把比较从if(a==b)换成了if(a.equals(“wang”))然后再次运行程序,输入“wang”,结果如下:

wang

wang wang

a==b

这次可以看出计算机可以正确的比较出两个字符串是相同的。

那么为什么“==”比较不出来呢?通过查阅jdk文档我恍然大悟,原来因为学习过c++,我以为“==”和equals是相同的是等价的。但java中不同,“==”比较的是两字符串的地址是否相同,而equals比较的才是字符串的内容。

比如:  String a="wang";

       String b=new String("wang");

如果用“==”去比较ab,系统会返回两者是不同的结果,是因为new申请了新的内存地址,这样两个“wang”就存储在不同的地方。

 

Java中虽然并没有指针(实际上就是地址)的概念,但仍然摆脱不了指针的存在,虽然在c++中指针相关的内容比较复杂,但提供了一种接近底层操作的方法。

以上,希望对新入java的同学有点帮助,也提醒我自己不再犯此错误

0 0