本问题已经有最佳答案,请猛点这里访问。

我正在为我的家人制作档案。没有语法错误,但是每当我在"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");
}
}
}

使用realName.equals("Maaz");。

一个非常好的主意是,提到,您不会得到编译错误,也不会得到异常,而是一个运行时语义错误,以及其他错误。但是请阅读关于如何写问题的常见问题解答,创建有意义的标题,这些标题不仅重复了java的标签,而且您是一个初学者。好主意是发布整个源代码,并使用语法高亮,但不太好使用俚语(plzzz)。避免问候之类的-这里几乎每个问题都在寻求帮助。总的来说,欢迎。:)

@格雷格:不要滥用评论来回答问题。:)

DR

你写的(这不管用):

埃多克斯1〔6〕

你的意思是:

江户十一〔七〕号

或者这个:

埃多克斯1〔8〕解释

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

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

没有与数据类型关联的方法或属性。例如,这将引发一个错误,因为数据类型不是对象:

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

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

例如,如果在前一个示例中使用整数而不是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");
}

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

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

让我们来看另一个例子:

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

在本例中,if块的计算结果可能为true。这是为什么?

编译器被优化为尽可能少地使用额外的内存,尽管这意味着什么取决于实现(可能还取决于运行时环境)。

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

回答得好。更多相关信息,请参见以下问题:stackoverflow.com/questions/594604/…

如果我记得正确的话,Java预先为整数分配了0255,所以在那个范围内所有值的整数实际上是相等的,因为它们都指向同一个对象…同样,final String s1 ="foo"; final String s2 ="foo";也是相等的,因为它们将被优化为指向同一个对象。

@paxinum——这是我上一个代码示例试图说的,但我不确定每个运行时/编译器是否都工作相同(例如openjdk、android的编译器等)。

但是,如果像这样的条件String s1 = new String("test"); String s2 ="test";s1==s2总是返回false

使用

if(realName.equals("Maaz"))

对象int boolean .... etc这样的原始数据类型使用==

但是如果要比较爪哇中的对象,则应该使用等值方法。

你不应该使用带浮点和双精度的==(除非你喜欢舍入误差:p)

改为这样做

if (realName.equals("Maaz"))

equals()应用于所有非原语对象,如本例中的字符串。

"==只能在进行原始比较时使用,如int和long。

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

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

只有当比较字符串时,==方法才会始终起作用:

字符串文本或对字符串文本的引用,或

由调用str = str.intern();的应用程序级代码"interned"的字符串。

(不,字符串在默认情况下不会被实习生。)

由于编写保证所有字符串都具有这些前提条件的程序通常比较困难,因此最好使用equals,除非有与性能相关的命令需要对字符串进行实习生并使用==。

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

为了完整性:字符串值常量表达式(如"hello"+"world")的行为与本例中的字符串文本相同。

@约翰-没错,但这与我的问题或答案都无关。尤其是因为我的答案的主要信息是不要使用==来比较字符串。

您也可以使用

realname.equalsIgnoreCase("Maaz")

这样,您就可以接受maaz、maaz、maaz、maaz等。

如果(myString.equals("test")=false,这是否有效?

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

==测试,例如相等性。通过比较内存位置可以做到这一点,这是一些JVM的实现细节,不一定是真的。

很有趣。虽然,正如其他人所说,正确的方法是使用.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

在jls第3.10.5章:字符串文本中,字符串文本的相等性是众所周知的,并且有很好的定义。

第一部分测试了str1和str2的身份(位置),因此它们不指向内存中的相同位置。第二部分测试字符串文本,并测试它们的值(这就是池/interning发挥作用的地方)。

@不是吗?两个部分做的完全一样。字符串文本是内部的,因此str3和str4具有相同的值;它们都指向内存中的相同位置。

@non==for对象比较引用值。我同意布莱恩的观点。

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

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

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

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

==比较对象引用或基元类型(int、char、float…)

equals(),可以重写此方法以比较两个对象的相等程度。

对于字符串类,其方法equal()将比较其中的内容(如果它们相同或不同)。

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

因为您正在处理字符串,所以应该使用String类的Equals to EqualisingNorecase方法。"="只有当两个对象指向相同的内存位置时,才会进行比较,在您的情况下,两个对象都是不同的,并且不会等于它们不指向相同的位置。另一方面,字符串类的equals方法根据对象包含的值执行比较。因此,如果使用equals方法,将满足if条件。