黑马程序员技术交流社区
标题:
获取键盘录入的一个问题
[打印本页]
作者:
吴扬
时间:
2012-6-27 14:58
标题:
获取键盘录入的一个问题
本帖最后由 吴扬 于 2012-6-29 00:54 编辑
毕老师的基础视频第十九天的获取键盘录入,自己尝试着写了下代码,出现了一个问题不是很明白,下面是我自己写的代码
<p>import java.io.IOException;
import java.io.InputStream;</p><p>public class ReadFromKeyboard {
public static void main(String[] args) throws IOException {
readFromKeyboard();
}
public static void readFromKeyboard() throws IOException
{
InputStream input = System.in;
System.out.print("请输入:");
StringBuilder str = new StringBuilder();//定义一个字符串缓冲区,用于存储从键盘获取到的字符串
while(true)
{
int ch = input.read();
if(ch == '\r')
continue;
if(ch == '\n')
{
//String s = str.toString();//一开始,这步我没有写,所以下面直接用"over"和str相比较,但是输入"over"之后,程序并没有结束,而是将''over"打印了出来,这是怎么回事?
if("over".equals(str))
break;
System.out.println(str);
str.delete(0, str.length());
}
else
str.append((char)ch);
}
}
}
</p>
复制代码
作者:
李天甲
时间:
2012-6-27 15:09
StringBuilder 和String类型不一样啊..
调试的时候你会看到这样的代码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
复制代码
这时java String类型equals的实现...
你会发现if (anObject instanceof String)不相等的时候会直接返回false...
作者:
韦念欣
时间:
2012-6-27 15:10
本帖最后由 韦念欣 于 2012-6-27 15:15 编辑
楼主的比较方法写错了,其实不用想李天甲兄那样复杂,楼主只要修改一个函数即可。
很简单对于String和StringBuilder的比较,应该用contentEquals,而不是equals
。
楼主可以参考一下,如果不明白可以看一下API文档,里面有详细介绍。
正确的具体代码如下:
import java.io.IOException;
import java.io.InputStream;
class ReadFromKeyboard {
public static void main(String[] args) throws IOException
{
readFromKeyboard();
}
public static void readFromKeyboard() throws IOException
{
InputStream input = System.in;
System.out.print("请输入:");
StringBuilder str = new StringBuilder();
while(true)
{
int ch = input.read();
if(ch == '\r')
continue;
if(ch == '\n')
{
if("over".contentEquals(str)) // 这里将equals方法改成contentEquals方法,因为楼主的str是StringBuilder,所以不能用equals
break;
System.out.println(str);
str.delete(0, str.length());
}
else
str.append((char)ch);
}
}
}
复制代码
作者:
吴琼
时间:
2012-6-27 15:19
<p>import java.io.IOException;
import java.io.InputStream;</p><p>public class ReadFromKeyboard {
public static void main(String[] args) throws IOException {
readFromKeyboard();
}
public static void readFromKeyboard() throws IOException
{
InputStream input = System.in;
System.out.print("请输入:");
StringBuilder str = new StringBuilder();//定义一个字符串缓冲区,用于存储从键盘获取到的字符串
while(true)
{
int ch = input.read();
if(ch == '\r')
continue;
if(ch == '\n')
{
String s = str.toString
//如果没写这一步,你输入的over会追加到原来的字符串中.
if("
over
".equals(str))//键盘录入必须确定结束的条件,这是必须要确定的.这里的结束条件为当输入over就结束.
break;
System.out.println(str);
str.delete(0, str.length());
}
else
str.append((char)ch);
}
}
}
</p>
作者:
rslheima
时间:
2012-6-27 16:12
//首先: if("over".equals(str)) 比较的是” over“ 字符串和str所代表的字符串,而str是BufferString类型,不是String类型
//当然使用equals就不能判断是否为相等,也不会break
//其次:输出over是因为,System.out.println(str);会自动调用toString()方法,的就等于System.out.println(
str.toString()
)
作者:
陆强强
时间:
2012-6-27 16:39
不用那么复杂,只要
String s = str.toString();
if("over".equals(s))//这里既然楼主把s=str.toString()了,当然拿over和S比较,怎么会和流去比较呢?注意str = new StringBuilder();str是流啊。
作者:
吴扬
时间:
2012-6-29 00:54
谢谢大家了,看来String和StringBuilder的区别还不是很清楚!查查API去...
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2