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

Maa*_*ood 19 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");
        }
    }
}       
Run Code Online (Sandbox Code Playgroud)

bea*_*mit 33

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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

Integer x = new Integer(5);
Integer y = new Integer(5);
if (x.equals(y)) {
    System.out.println("Equal");
}
Run Code Online (Sandbox Code Playgroud)

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

Integer x = new Integer(5);
Integer y = new Integer(5);
if (x == y) {
    System.out.println("Equal");
}
Run Code Online (Sandbox Code Playgroud)

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

在您的代码中,您将Object与String文本(也是对象)进行比较,这与比较两者的值不同.

让我们看另一个例子:

String s = "Some string";
if (s == "Some string") {
    System.out.println("Equal");
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Sha*_*awn 9

这样做

if (realName.equals("Maaz"))
Run Code Online (Sandbox Code Playgroud)

equals() 应该在所有非基本对象上使用,例如在这种情况下为String

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


con*_*ius 9

使用

if(realName.equals("Maaz"))
Run Code Online (Sandbox Code Playgroud)

use == with primitive data type like int boolean .... etc

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

  • 你不应该使用`==`浮点数和双倍(除非你喜欢舍入错误:P) (4认同)

use*_*own 8

您必须使用realName.equals ("Maaze")而不是使用== 来比较对象.


Ste*_*n C 5

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

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

  • 字符串文字或对字符串文字的引用,或
  • 由应用程序级代码调用"实例化"的字符串str = str.intern();.

(不,默认情况下,字符串不会被拦截.)

由于它一般是棘手写一个保证这些前提条件的所有字符串的程序,这是最好的做法使用equals,除非有与性能相关的迫切需要实习生的字符串和使用==.

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