为什么不= =在字符串上工作?

时间:2013-07-03 08:30:33

标签: java

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

为什么?

7 个答案:

答案 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()