为什么不==在string上工作?
我刚开始Java编程。 到目前为止,我很喜欢这个问题,但是我一直在困扰这个问题。
当我运行这个代码时,每当我input“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"); } } }
为什么?
使用String.equals(String otherString)
函数比较string,而不是==
运算符。
原因是==
只是比较object
引用。
因为String
类的.equals()
检查相等性
String
类equals
方法ovveridden,使得传递的String对象的值与当前Object相同
string的源代码中的equals()方法:
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")){ }
或者无论如何都要昏迷
if(gender.equalsIgnoreCase("boy")){ }
并为零安全
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
比较String
types的对象时,应该使用equals
方法而不是operator ==
。 equals
将比较String
对象的值,而==
检查它们是否在内存中是同一个对象。
所以,而不是:
if(gender=="boy")
使用
if(gender.equals("boy"))
使用equals
而不是==
if("boy".equals(gender)){ }
使用等于比较值。 而==
是比较对象引用。
你不能比较像java中的string,你需要使用
if (gender.equals("boy"))
为它工作。 你的方式是比较对象而不是内容
你在那里使用引用平等。 ==
是字面上比较2引用。 即他们是同一个对象。
你需要使用equals()
方法,在这个例子中,它会比较两个string的内容 。 在这里看到更多的信息。
在Java中,string是对象( String
)。 包含对象的variables是引用。 如果使用==
运算符比较两个对象,则仅当它们是相同对象(在内存中)时才返回true
。 但是在你的代码中,他们不是( "boys"
是一个即兴的string)。
但是,有一个方法String.equals()
,它比较两个string,如果它们具有相同顺序的相同字符,则返回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"); } } }
你也可以交换这两个string(好处是它可以防止NullPointerException
在gender == null
被抛出):
"boy".equals(gender)
要忽略比较的字母大小写,请使用equalsIgnoreCase()
。
String a,b; a==b;
这里比较两个string对象的引用(地址)
a.equals(b);
这里比较两个string的内容