关于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");
如果用“==”去比较a和b,系统会返回两者是不同的结果,是因为new申请了新的内存地址,这样两个“wang”就存储在不同的地方。
Java中虽然并没有指针(实际上就是地址)的概念,但仍然摆脱不了指针的存在,虽然在c++中指针相关的内容比较复杂,但提供了一种接近底层操作的方法。
以上,希望对新入java的同学有点帮助,也提醒我自己不再犯此错误
- 关于java中控制台输入和String类“==”和“equals”的研究
- 关于String的==和equals
- 在Java 中,关于String的 compareTo()、equals()和== 的区别
- Java中String的equals和==
- JAVA中String的“==”和equals()浅析
- java中String的equals和==
- Java中String的==和equals区别
- java中String 的==和equals;String直接赋值和使用new String()
- 关于java中 == 和 equals 的详解
- java 中String类的内存和equals与“=="的比较
- String类的equals和==
- String 和Integer中 == 和 equals的使用
- java 中String中的equals和==
- 关于java String的“==”和equals()比较、引用的小问题
- 关于java String的“==”和equals()比较、引用的小问题
- 关于java String的“==”和equals()比较、引用的小问题
- java中==与 String中 equals 和对象中equals比较
- C#中关于String.Equals(object,object)和(object==object )的比较
- MTK 6573工程目录结构
- java中实例化Class类对象的三种方式
- 审计
- linux中断--中断下半部机制的使用 & 中断编程
- 黑马程序员-数组基础
- 关于java中控制台输入和String类“==”和“equals”的研究
- emulator window was out of view and was recentered
- Permission is only granted to system app 错误
- Netbeans-8.0 && apktool_2.0.0b9 调试apk
- is it a prime
- 并发管理
- day_7在servlet中实现cookie技术
- Codeforces Round #241 (Div. 2) A~C
- ANDROID SDK体系介绍