使用==比较两个相同的字符串将返回false

时间:2011-09-10 23:53:05

标签: java string

我正在为我的家人制作档案。没有语法错误,但每当我输入"Maaz"时,它都会将realName == "Maaz"评估为false并转到else语句。

import java.util.Scanner;

public class MainFamily {
    public static void main (String [] args) {

        System.out.println("Enter you're name here");
        Scanner name = new Scanner(System.in);//Scanner variable = name

        String realName;
        realName = name.nextLine();//String variable = user input
        System.out.println("Name: "+ realName);

        if (realName == "Maaz") {

            System.out.println("Name: Maaz");

        } else {
            System.out.println("This person is not in the database");
        }
    }
}       

12 个答案:

答案 0 :(得分:32)

TL; DR

您写道(这不起作用):

realName == "Maaz"

你的意思是:

realname.equals("Maaz")

或者这个:

realname.equalsIgnoreCase("Maaz")

解释

在Java(以及许多其他面向对象的编程语言)中,对象与数据类型不同。数据类型被运行时识别为数据类型。

数据类型的示例包括:int,float,short。

没有与数据类型相关联的方法或属性。例如,这会抛出错误,因为数据类型不是对象:

int x = 5;
int y = 5;
if (x.equals(y)) {
    System.out.println("Equal");
}

引用基本上是一块内存,它明确告诉运行时环境该数据块是什么。运行时不知道如何解释这个;它假设程序员这样做。

例如,如果我们在前面的示例中使用了Integer而不是int,那么这将起作用:

Integer x = new Integer(5);
Integer y = new Integer(5);
if (x.equals(y)) {
    System.out.println("Equal");
}

虽然这不会给出预期的结果(if条件将评估为false):

Integer x = new Integer(5);
Integer y = new Integer(5);
if (x == y) {
    System.out.println("Equal");
}

这是因为两个Integer对象具有相同的值,但它们不是同一个对象。 double equals基本上检查两个对象是否是相同的引用(有其用途)。

在您的代码中,您将对象与字符串文字(也是对象)进行比较,这与比较两者的值不同。

让我们看另一个例子:

String s = "Some string";
if (s == "Some string") {
    System.out.println("Equal");
}

在这种情况下,if块可能会评估为true。这是为什么?

编译器经过优化,可以使用尽可能少的额外内存,尽管这意味着取决于实现(以及可能的运行时环境)。

第一行中的字符串文字"Some string"可能被识别为等同于第二行中的字符串字面值,并且将在内存中为每个字符串使用相同的位置。简单来说,它将创建一个String对象并将其插入“Some string”的两个实例中。这是不可靠的,因此如果您只关心值,那么使用String.equals总是更好的检查等价的方法。

答案 1 :(得分:8)

改为执行此操作

if (realName.equals("Maaz"))

equals()应该用于所有非基本对象,例如本例中的String

'=='只应在进行原始比较时使用,例如intlong

答案 2 :(得分:8)

使用

if(realName.equals("Maaz"))

使用==原始数据类型,如int boolean .... etc

但是如果你想比较java中的对象,你应该使用equals方法

答案 3 :(得分:7)

您必须将对象与realName.equals ("Maaze")进行比较,而不是使用==。

答案 4 :(得分:5)

使用str.equals(str2)而非str == str2比较字符串是最佳做法。正如您所观察到的,第二种形式在很多时候都不起作用。相比之下,第一种形式始终有效

==方法始终有效的唯一情况是比较字符串的时间是:

  • 字符串文字或对字符串文字的引用,或
  • 由调用str = str.intern();的应用程序级代码“实习”的字符串。

(不,默认情况下,字符串不会被中断。)

由于编写保证所有字符串的这些前置条件的程序通常很棘手,因此使用equals最佳做法,除非有与性能相关的命令来实现您的字符串和使用==

在此之前,您决定实习是一个好主意,您需要将实习的好处与成本进行比较。这些成本包括在字符串池的哈希表中查找字符串的成本以及维护字符串池的空间和GC开销。与仅使用常规字符串并使用equals进行比较的典型成本相比,这些都是非常重要的。

答案 5 :(得分:4)

您也可以使用

realname.equalsIgnoreCase("Maaz")

这样你可以接受Maaz,maaz,maaZ,mAaZ等。

答案 6 :(得分:3)

==测试浅层平等。它检查两个对象是否引用内存中的相同位置。

答案 7 :(得分:2)

趣。虽然正如其他人所说的那样,正确的方法是使用.equals(...)方法,但我总是认为字符串是汇集的(无论它们的创建如何)。这似乎只适用于字符串文字。

final String str1 = new String("Maaz");
final String str2 = new String("Maaz");
System.out.println(str1 == str2); // Prints false

final String str3 = "Laaz";
final String str4 = "Laaz";
System.out.println(str3 == str4); // Prints true

答案 8 :(得分:0)

由于您正在处理字符串,因此应使用equals到String类的equalsIngnorecase方法。 “==”只会比较两个对象是否指向相同的内存位置,在您的情况下,两个对象都不同并且不相等,因为它们不指向相同的位置。另一方面,String类的equals方法根据对象包含的值执行比较。因此,如果您将使用equals方法,您的if条件将得到满足。

答案 9 :(得分:0)

==比较对象引用基本类型(int,char,float ...)

equals(),您可以覆盖此方法以比较两个对象的相等方式。

对于String类,其方法 equal()将比较内部的内容是否相同。

如果您的示例,两个字符串都没有相同的对象引用,那么它们返回false,==不会比较两个字符串上的字符。

答案 10 :(得分:0)

似乎没有人指出将对象与Java中的常量进行比较的最佳实践是调用常量的equals方法,而不是变量对象:

if ("Maaz".equals (realName)) {}

这样您就不需要另外检查变量realName是否为空。

答案 11 :(得分:0)

if(realName.compareTo("Maaz") == 0) {
    // I dont think theres a better way do to do this.
}