Java:测试String值 - 在if else语句中使用switch语句和.equals(),但在if-else语句中不使用==

时间:2013-03-08 22:17:42

标签: java if-statement switch-statement

我试图根据为特定值“Y”或“y”测试String变量'response'的结果,将布尔变量'answer'设置为true或false。

评估正确的内容:  示例1:使用switch语句测试String的“响应”值,  示例2:在if-else语句中使用(response.equals(“Y”))和(response.equals(“y”)),

什么不正确评估:  示例3:在if-else语句中使用(response ==“Y”)或(response ==“y”),

所有三个示例都编译没有错误。

我的问题是:为什么示例一和二都有效,但示例三没有?

我尝试在示例3 if-else条件评估中使用单引号(即'Y'和'y'),但这导致编译错误'无法比较的类型:字符串和字符',我尝试使用'='而不是'=='但是会导致编译错误'不兼容的类型:required:boolean,found:String'

我用谷歌搜索'java测试字符串值'并找到:

  

要比较字符串的内容相等性,我们必须使用String.equals()方法。此方法确保它将比较两个字符串的内容而不是两个字符串的对象引用。如果比较中的两个字符串具有相同的内容,则此方法返回true。

     

不要使用==运算符来比较字符串的内容。 ==运算符检查对象引用相等性,仅当两个对象都指向同一引用时才返回true。如果对象未指向相同的引用,则此运算符返回false。

但我不明白这是什么意思,或者这实际上是我问题的答案。任何追踪答案的建议都将受到赞赏。提前谢谢。

示例一:

public static boolean AskQuestion() {
    boolean answer = false;
    String response = "";

    Scanner input = new Scanner(System.in);
    System.out.println("Enter Y to repeat, any other key to exit: ");
    response = input.next();

    switch (response) {
        case "Y": answer = true;
                  break;
        case "y": answer = true;
                  break;
        default: answer = false;
    }
    return answer;
}

示例二:

public static boolean AskQuestion(){
    boolean answer = false;
    String response = "";

    Scanner input = new Scanner(System.in);
    System.out.println("");
    System.out.println("Enter Y to play again, any other key to exit: ");
    response = input.next();

    if (response.equals("y")) {
        answer = true;
    }
    else if (response.equals("Y")) {
        answer = true;
    }
    else {
        answer = false;
    }
    return answer;
}

示例三:

public static boolean AskQuestion() {

    boolean answer = false;
    String response = "";

    Scanner input = new Scanner(System.in);
    System.out.println("Enter Y to repeat, any other key to exit: ");
    response = input.next();

    if (response == "y") {
        answer = true;
    }
    else if (response == "Y") {
        answer = true;
    }
    else {
        answer = false;
    }
    return answer;
}

3 个答案:

答案 0 :(得分:1)

在第二个示例中,您可以使用equalsIgnoreCase方法来减少一些代码。

if (response.equalsIgnoreCase("y")) {
    answer = true;
}

在Java中使用==运算符进行比较时,您正在检查两个对象是否是同一个对象,即“引用是否相同”。使用equalsequalsIgnoreCase比较两个对象的值。

由于您已为响应创建了变量/已分配内存(创建引用)并将输入分配给该变量,因此它具有与为“Y”或“y”创建的引用不同的引用。因此,当==运算符返回false时,它正确地确定这两个对象不是同一个对象/引用。

例如:

    String something = new String("something");
    String somethingElse = new String("something");

    System.out.println(something == somethingElse); //prints false

另一个例子:

        String somethingElse = "";
        String something = new String("something");
        somethingElse = "something";

        System.out.println(somethingElse == something); //returns false
        System.out.println(somethingElse.equals(something)); //returns true

答案 1 :(得分:0)

如果引用(对象)完全相同,则

==返回true。在您的情况下,response == "y"不一样。

当写入方法返回true时,

equals(Object)返回true。这可以是同一个对象,一个等价的对象,也可以是开发人员想写的东西。

你应该总是使用equals,因为它们不是同一个对象。

答案 2 :(得分:0)

你可以用以下的东西更加整洁地完成整个事情:

static Set<String> trues = new HashSet<String>(Arrays.asList(new String[] {"y","yes","1"}));
static Set<String> falses = new HashSet<String>(Arrays.asList(new String[] {"n","no","0"}));

public static boolean isTrue ( String s ) {
    return trues.contains(s.toLowerCase());
}

public static boolean isFalse ( String s ) {
    return falses.contains(s.toLowerCase());
}

public static boolean isTrueOrFalse ( String s, boolean dflt ) {
    return isTrue(s) ? true :
            isFalse(s) ? false :
            dflt;
}

public static boolean isTrueOrFalse ( String s ) {
    return isTrueOrFalse(s, false);
}