日期:2014-05-20  浏览次数:20654 次

java输入字符串判断的怪问题()
下面的程序想判读输入的字符串是不是"y" 
上述程序输出只有
string=输入地内容
就什么都没有了.......
问什么?
import java.io.*;
 class App3_13
{
  public static void main(String args[]) throws IOException
  {
  BufferedReader buf;
  String str="aaa";
  buf=new BufferedReader(new InputStreamReader(System.in));
  System.out.print("Input a string:");  
  str = buf.readLine(); 
  System.out.println("string="+str);
  if(str=="y")
  System.out.println("yes");
  else
  System.out.println("no");  
  }
}


------解决方案--------------------
假如输入的是y,程序除了输出String = y 外,还输出了 no
如果你要判断输入的是否为y,应该把 if(str=="y") 改成 if(str.equals("y")) 


------解决方案--------------------
应该还会输出一个Y吧.
字符串的比较应该使用equals方法
------解决方案--------------------
if(str=="y") 修改为
if("y".equals(str))

不建议修改为改成 if(str.equals("y"))  


------解决方案--------------------
1楼说的对
------解决方案--------------------

如果比较对象是否 内容相同 用 object1.equals(object2)


如果比较是否是同一个对象,或基本类型比较请用 ==

------解决方案--------------------
==是比较两者是不是相同
EQUALS是比较两者的内容是不是相同
------解决方案--------------------
同意三楼!
equals()应该那样用!
------解决方案--------------------
请问三楼的理由是什么?
------解决方案--------------------
str="y" 
和后面直接数"y"
在内存里是同一个对象,所以==判断的结果为true

补充:
假如你用str=new String("y");
再做==判断,结果就是false了,因为new全新创造了一个String对象

--------------------------
总结:所有的String直接数,JVM会对内存里的String直接数做比较,如果有相同的话,就把String变量指向已有的String对象(不再生产新对象了)
优点:假设你做一个
for(int i=0;i<10000;i++)
 String tmp="tmp string"+i;
循环,JVM并不会为字符串"tmp string"创建10000次对象,而只是使用第一次创建的"tmp string"对象.
------解决方案--------------------
import java.io.*;
public class Test
{
public static void main(String args[])throws Exception
{
String str=;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
str = in.readLine();
if(str.equals("y"))
{
System.out.println("yes");
}
else
{
System.out.println("no");
}
}
}


str不要初始值,就可以达到你要的目的,要是str给初始值,那就输入什么直都是no