import java.util.*;
public class While2{
public static void main(String[] args){
    String answer;//回答结果
Scanner input = new Scanner(System.in);
System.out.println("表演的怎么样?(y/n)");
answer = input.next();//获取用户输入
while(! answer.equals("y")){//输入的不是y则继续执行
System.out.println("早上5点开始练声!");
System.out.println("上午练习钢琴!");
System.out.println("下午到声乐老师家练习唱歌!!");
System.out.println("晚上练习舞蹈基本功!");
System.out.println("表演的怎么样(y/n)!");
answer = input.next();
}
System.out.println("圆满完成");
}
}
为什么我吧while循环条件改成while(answer!="y")这样无论我输入y或者x他都是吧循环体的东西打出来
但是我觉得那句话和这话意思一样while(! answer.equals("y"))
他们之间的区别是什么?
刚学几天的新人碰到的问题 请谅解!

解决方案 »

  1.   

    哈哈 我看书看到后面了才知道 String 是需要用这种方法来判断 。但是为什么会这样呢?
      

  2.   

    因为在java里面String是对象,不是基本字符数据类型,所以不能用“=”来判断只能用equals
      

  3.   

    ==号永远是比较对象在内存中的地址是否相同
    对于equals方法,在Object里是这样定义的public boolean equals(Object obj) {
    return (this == obj);
        }可以看的出来,还是比较对象在内存中的地址
    但是对于String,它重写了父类Object的equals方法(具体可自己看下String的源码)
    重写后就是比较字符串的内容了
    所以出现answer和"y"的地址永远不一样
    所以无论你输出什么他都是true
      

  4.   

    String 的 == 比较的是两个String类型的地址的比较,而 equals比较的则是两个String内容的,以下是String类equals方法的底层实现 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;
        }
    可以看出就是将字符串转成char[] 然后挨个比较
      

  5.   

    因为String是对象 对象都得这样的 啊   
      

  6.   

    String是个类  不是基础数据类型  类对象虚拟机会分配给哈希地址  ==号比较的是哈希地址   equals比较的才是值
      

  7.   

    java中String类型的比较不能直接用“=”,必须要用equals或者compareTo来进行比较.
    String 的 == 比较的是两个String类型的地址的比较,而 equals比较的则是两个String内容的,以下是String类equals方法的底层实现