6

我刚开始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"); 
        }
    }
}

为什么?

4

7 回答 7

28

使用String.equals(String otherString)函数来比较字符串,而不是==运算符。

这是因为==运算符只比较对象引用,而该String.equals()方法比较两个String的值,即构成每个 的字符序列String

来自 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

于 2013-07-03T08:31:16.180 回答
7

比较对象类型String时,应使用equals方法而不是运算符==equals将比较String对象的值,同时==检查它们是否是内存中的同一个对象。

所以而不是:

if(gender=="boy") 

利用

if(gender.equals("boy"))
于 2013-07-03T08:32:31.027 回答
1

在 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被抛出 if gender == null):

"boy".equals(gender)

要忽略比较字母的大小写,请equalsIgnoreCase()改用。

于 2013-07-03T08:38:41.817 回答
1

使用equals代替==

if("boy".equals(gender)){

}

使用equals来比较值。while==是比较对象引用。

于 2013-07-03T08:32:36.773 回答
1
String a,b;

a==b;

这里比较两个字符串对象的引用(地址)

a.equals(b);

这里比较两个字符串的内容

于 2013-07-03T08:35:29.347 回答
0

你在那里使用引用相等。这==是从字面上比较两个参考。即它们是同一个对象。

您需要使用该equals()方法,该方法(在这种情况下)将比较两个字符串的内容。请参阅此处了解更多信息。

于 2013-07-03T08:32:26.123 回答
0

你不能在java中比较字符串,你需要使用

if (gender.equals("boy"))

让它工作。您的方式是比较对象而不是内容

于 2013-07-03T08:32:03.743 回答