while循环结构的问题

时间:2022-12-13 13:36:29
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"))
他们之间的区别是什么?
刚学几天的新人碰到的问题 请谅解!

10 个解决方案

#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


该回复于2011-03-18 10:52:02被版主删除

#6


引用 1 楼 yyx520aiy520 的回复:
哈哈 我看书看到后面了才知道 String 是需要用这种方法来判断 。但是为什么会这样呢?
因为String是对象 对象都得这样的 啊   

#7


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

#8


该回复于2011-03-18 09:14:34被版主删除

#9


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

#10


青鸟学友,握握手,哈

#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


该回复于2011-03-18 10:52:02被版主删除

#6


引用 1 楼 yyx520aiy520 的回复:
哈哈 我看书看到后面了才知道 String 是需要用这种方法来判断 。但是为什么会这样呢?
因为String是对象 对象都得这样的 啊   

#7


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

#8


该回复于2011-03-18 09:14:34被版主删除

#9


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

#10


青鸟学友,握握手,哈