我刚开始Java编程。我到目前为止都很喜欢它,但我一直坚持这个问题。
当我运行此代码时,每当我输入“boy”时,它只会回复GIRL
:
import java.util.Scanner;
public class ifstatementgirlorboy {
public static void main(String args[]) {
System.out.println("Are you a boy or a girl?");
Scanner input = new Scanner(System.in);
String gender = input.nextLine();
if(gender=="boy") {
System.out.println("BOY");
}
else {
System.out.println("GIRL");
}
}
}
为什么?
答案 0 :(得分:19)
使用String.equals(String otherString)
函数比较字符串,而不是==
运算符。
这是因为==
运算符仅比较对象引用
String.equals()
方法会比较两个String
的值,即构成每个String
的字符序列。
equals() method from Source code of String:
public boolean equals(Object anObject) {
1013 if (this == anObject) {
1014 return true;
1015 }
1016 if (anObject instanceof String) {
1017 String anotherString = (String)anObject;
1018 int n = count;
1019 if (n == anotherString.count) {
1020 char v1[] = value;
1021 char v2[] = anotherString.value;
1022 int i = offset;
1023 int j = anotherString.offset;
1024 while (n-- != 0) {
1025 if (v1[i++] != v2[j++])
1026 return false;
1027 }
1028 return true;
1029 }
1030 }
1031 return false;
1032 }
所以你应该写
if(gender.equals("boy")){
}
或与comapre无论如何
if(gender.equalsIgnoreCase("boy")){
}
和null安全性
if("boy".equals(gender)){
}
未来参考:
String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // same reference
String s4 = new String("Hello"); // String object
String s5 = new String("Hello"); // String object
此处s1 == s2 == s3 but s4 != s5
在哪里
anyOfAbove.equals(anyOtherOfAbove); //true
答案 1 :(得分:6)
比较String
类型的对象时,应使用equals
方法而不是运算符==
。 equals
会比较String
对象的值,==
检查它们是否与内存中的对象相同。
所以而不是:
if(gender=="boy")
使用
if(gender.equals("boy"))
答案 2 :(得分:1)
使用equals
代替==
if("boy".equals(gender)){
}
使用等于来比较值。而==
是比较对象引用。
答案 3 :(得分:0)
你无法比较java中的字符串,你需要使用
if (gender.equals("boy"))
让它发挥作用。你的方式是比较对象而不是内容
答案 4 :(得分:0)
你在那里使用引用相等。 ==
字面上比较了2个引用。即他们是同一个对象。
您需要使用equals()
方法,在这种情况下,它将比较两个字符串的内容。有关详细信息,请参阅here。
答案 5 :(得分:0)
String a,b;
a==b;
这里比较两个字符串对象的引用(地址)
a.equals(b);
这里比较两个字符串的内容
答案 6 :(得分:0)
在Java中,字符串是对象(String
)。包含对象的变量是引用。如果将两个对象与==
运算符进行比较,则仅当它们是相同的对象(在内存中)时才返回true
。但是在你的代码中它们不是("boys"
是一个实时化的字符串)。
然而,有一个方法String.equals()
,它比较两个字符串,如果它们在相同的顺序中具有相同的字符,则返回true,而不是它们是相同的对象。
在此处更正代码:
import java.util.Scanner;
public class ifstatementgirlorboy {
public static void main(String args[]) {
System.out.println("Are you a boy or a girl?");
Scanner input = new Scanner(System.in);
String gender = input.nextLine();
if (gender.equals("boy")) {
System.out.println("BOY");
}
else {
System.out.println("GIRL");
}
}
}
您还可以交换这两个字符串(优点是,如果NullPointerException
),它会阻止gender == null
被抛出:
"boy".equals(gender)
要忽略比较字母的情况,请改用equalsIgnoreCase()
。