今天在图书馆试着用新学习的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");
如果用“==”去比较a和b,系统会返回两者是不同的结果,是因为new申请了新的内存地址,这样两个“wang”就存储在不同的地方。
Java中虽然并没有指针(实际上就是地址)的概念,但仍然摆脱不了指针的存在,虽然在c++中指针相关的内容比较复杂,但提供了一种接近底层操作的方法。
以上,希望对新入java的同学有点帮助,也提醒我自己不再犯此错误