Comparing two identical strings with == returns false
我正在为我的家人制作档案。没有语法错误,但是每当我在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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"); } } } |
DR
你写的(这不管用):
埃多克斯1〔6〕
你的意思是:
江户十一〔七〕号
或者这个:
埃多克斯1〔8〕
解释在Java(和许多其他面向对象的编程语言)中,对象与数据类型不一样。运行时将数据类型识别为数据类型。
数据类型的示例包括:int、float、short。
没有与数据类型关联的方法或属性。例如,这将引发一个错误,因为数据类型不是对象:
1 2 3 4 5 |
引用基本上是一块内存,它显式地告诉运行时环境该数据块是什么。运行时不知道如何解释这个问题;它假定程序员会这样做。
例如,如果在前一个示例中使用整数而不是int,则可以:
1 2 3 4 5 |
。
然而,这并不能给出预期的结果(if条件的值将为false):
1 2 3 4 5 |
这是因为两个整数对象的值相同,但它们不是同一个对象。double equals基本上检查两个对象是否是相同的引用(有其用途)。
在代码中,您将对象与字符串文字(也是对象)进行比较,这与比较两者的值不同。
让我们来看另一个例子:
。
在本例中,if块的计算结果可能为true。这是为什么?
编译器被优化为尽可能少地使用额外的内存,尽管这意味着什么取决于实现(可能还取决于运行时环境)。
第一行中的字符串文字
使用
1 | if(realName.equals("Maaz")) |
号
对象
但是如果要比较爪哇中的对象,则应该使用等值方法。
改为这样做
1 | if (realName.equals("Maaz")) |
"
您必须将对象与
最好使用
只有当比较字符串时,
- 字符串文本或对字符串文本的引用,或
- 由调用
str = str.intern(); 的应用程序级代码"interned"的字符串。
(不,字符串在默认情况下不会被实习生。)
由于编写保证所有字符串都具有这些前提条件的程序通常比较困难,因此最好使用
在你决定实习是个好主意之前,你需要比较实习的好处和成本。这些成本包括在字符串池的哈希表中查找字符串的成本,以及维护字符串池的空间和GC开销。与仅使用常规字符串和使用
您也可以使用
1 | realname.equalsIgnoreCase("Maaz") |
。
这样,您就可以接受maaz、maaz、maaz、maaz等。
=测试浅等同性。它检查两个对象是否引用内存中相同的位置。
很有趣。虽然,正如其他人所说,正确的方法是使用
1 2 3 4 5 6 7 |
1 2 3 | if(realName.compareTo("Maaz") == 0) { // I dont think theres a better way do to do this. } |
号
似乎没有人指出,将对象与Java中的常量进行比较的最佳做法是调用常数的等值方法,而不是变量对象:
1 | if ("Maaz".equals (realName)) {} |
这样就不需要另外检查变量realname是否为空。
==比较对象引用或基元类型(int、char、float…)
equals(),可以重写此方法以比较两个对象的相等程度。
对于字符串类,其方法equal()将比较其中的内容(如果它们相同或不同)。
如果您的示例中,两个字符串没有相同的对象引用,则返回false,==不会比较两个字符串上的字符。
因为您正在处理字符串,所以应该使用String类的Equals to EqualisingNorecase方法。"="只有当两个对象指向相同的内存位置时,才会进行比较,在您的情况下,两个对象都是不同的,并且不会等于它们不指向相同的位置。另一方面,字符串类的equals方法根据对象包含的值执行比较。因此,如果使用equals方法,将满足if条件。