A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴扬 中级黑马   /  2012-6-27 14:58  /  2398 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴扬 于 2012-6-29 00:54 编辑

毕老师的基础视频第十九天的获取键盘录入,自己尝试着写了下代码,出现了一个问题不是很明白,下面是我自己写的代码
  1. <p>import java.io.IOException;
  2. import java.io.InputStream;</p><p>public class ReadFromKeyboard {

  3. public static void main(String[] args) throws IOException {
  4.   readFromKeyboard();
  5. }

  6. public static void readFromKeyboard() throws IOException
  7. {
  8.   InputStream input = System.in;
  9.   
  10.   System.out.print("请输入:");
  11.   
  12.   StringBuilder str = new StringBuilder();//定义一个字符串缓冲区,用于存储从键盘获取到的字符串
  13.   
  14.   while(true)
  15.   {
  16.    int ch = input.read();
  17.    if(ch == '\r')
  18.     continue;
  19.    if(ch == '\n')
  20.    {
  21.     //String s = str.toString();//一开始,这步我没有写,所以下面直接用"over"和str相比较,但是输入"over"之后,程序并没有结束,而是将''over"打印了出来,这是怎么回事?
  22.     if("over".equals(str))
  23.      break;
  24.     System.out.println(str);
  25.     str.delete(0, str.length());
  26.    }
  27.    else
  28.     str.append((char)ch);
  29.   }
  30. }
  31. }
  32. </p>
复制代码

6 个回复

倒序浏览
StringBuilder 和String类型不一样啊..
调试的时候你会看到这样的代码
  1. public boolean equals(Object anObject) {
  2.         if (this == anObject) {
  3.             return true;
  4.         }
  5.         if (anObject instanceof String) {
  6.             String anotherString = (String)anObject;
  7.             int n = count;
  8.             if (n == anotherString.count) {
  9.                 char v1[] = value;
  10.                 char v2[] = anotherString.value;
  11.                 int i = offset;
  12.                 int j = anotherString.offset;
  13.                 while (n-- != 0) {
  14.                     if (v1[i++] != v2[j++])
  15.                         return false;
  16.                 }
  17.                 return true;
  18.             }
  19.         }
  20.         return false;
  21.     }
复制代码
这时java String类型equals的实现...
你会发现if (anObject instanceof String)不相等的时候会直接返回false...

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 韦念欣 于 2012-6-27 15:15 编辑


楼主的比较方法写错了,其实不用想李天甲兄那样复杂,楼主只要修改一个函数即可。
很简单对于String和StringBuilder的比较,应该用contentEquals,而不是equals
楼主可以参考一下,如果不明白可以看一下API文档,里面有详细介绍。
正确的具体代码如下:
  1. import java.io.IOException;
  2. import java.io.InputStream;

  3. class ReadFromKeyboard {

  4.         public static void main(String[] args) throws IOException
  5.         {
  6.                 readFromKeyboard();
  7.         }

  8.         public static void readFromKeyboard() throws IOException
  9.         {
  10.                 InputStream input = System.in;
  11.                 System.out.print("请输入:");
  12.                 StringBuilder str = new StringBuilder();

  13.                 while(true)
  14.                 {
  15.                         int ch = input.read();
  16.                         if(ch == '\r')
  17.                         continue;

  18.                         if(ch == '\n')
  19.                         {
  20.                                 if("over".contentEquals(str))        // 这里将equals方法改成contentEquals方法,因为楼主的str是StringBuilder,所以不能用equals
  21.                                         break;
  22.                                 System.out.println(str);
  23.                                 str.delete(0, str.length());
  24.                         }
  25.                         else
  26.                                 str.append((char)ch);
  27.                 }
  28.         }
  29. }
复制代码

评分

参与人数 2技术分 +2 收起 理由
刘蕴学 + 1
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
<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>

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
//首先: if("over".equals(str)) 比较的是” over“ 字符串和str所代表的字符串,而str是BufferString类型,不是String类型
//当然使用equals就不能判断是否为相等,也不会break
//其次:输出over是因为,System.out.println(str);会自动调用toString()方法,的就等于System.out.println(str.toString())
回复 使用道具 举报
不用那么复杂,只要
String s = str.toString();
    if("over".equals(s))//这里既然楼主把s=str.toString()了,当然拿over和S比较,怎么会和流去比较呢?注意str = new StringBuilder();str是流啊。
回复 使用道具 举报
吴扬 中级黑马 2012-6-29 00:54:18
7#
谢谢大家了,看来String和StringBuilder的区别还不是很清楚!查查API去...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马