Java 为什么’;t==处理字符串?

Java 为什么’;t==处理字符串?,java,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?"); Scann

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

为什么?

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

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

所以你应该写

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,但s4!=s5

何处为


anyOfAbove.equals(anyOtherOfAbove)//true

您无法在java中比较这样的字符串,您需要使用

if (gender.equals("boy"))
让它工作。您的方法是比较对象而不是内容

您在那里使用的是引用等式。
=
实际上是在比较这两个参考。i、 它们是同一个物体吗


您需要使用
equals()
方法,该方法(在本例中)将比较两个字符串的内容。有关更多信息,请参阅。

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

因此,不是:

if(gender=="boy") 
使用


使用
equals
代替
=

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

}
使用equals比较该值。而
==
是比较对象引用

String a,b;

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

a.equals(b);

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

在Java中,字符串是对象(
String
)。包含对象的变量是引用。如果使用
=
运算符比较两个对象,则仅当它们是相同的对象(在内存中)时才会返回
true
。但在您的代码中,它们不是(
“boys”
是一个动态实例化的字符串)

a.equals(b);
但是,有一个方法
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");
        }
    }
}
您还可以交换这两个字符串(优点是,如果
gender==null
,它可以防止引发
NullPointerException
):


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

在java中对字符串使用等于而不是==。请查看本网站上的其他问题,以了解更多关于此问题的精确性。这一问题已被问了很多时间。当有人将Java
String
s与
=
进行比较时,请在发布之前花点时间探索一下,开发人员会哭喊……哦,上帝。。。你知道你已经有一段时间没有学过Java了,当你突然想起指针考试的问题时,第二个==出现了“为什么不==处理字符串”?它确实有效!当你问一个字符串是否与另一个字符串“相等”时,它并没有做你通常想做的事情。或者更好的是,
“boy”。equals(性别)
因为即使
gender==null
equalsIgnoreCase()也可以使用
会更好:D@Tichodroma有时,如果某个东西是
null
,你应该注意它。因此,你实际上希望看到NPE以防止出现这种情况。但是,如果你可以故意将某个字符串设置为
null
。那么这种态度是非常好的。@marounnaroun:如果null是预期的,并且会被不同的对待,那么en检查
null
会更好地捕捉到NPEJava是最奇怪的语言,感谢这些快速的回答。第一次在stackoverflow上。正确,但是他的代码也不工作吗?字符串是内部化的,所以在读取“boy”时,引用应该都指向同一个“boy”字符串对象?
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");
        }
    }
}
"boy".equals(gender)