到目前为止,我一直在程序中使用==运算符来比较所有的字符串。 然而,我遇到了一个错误,将其中一个改为.equals(),它修复了这个错误。
==不好吗?什么时候应该使用,什么时候不应该使用?有什么不同?
到目前为止,我一直在程序中使用==运算符来比较所有的字符串。 然而,我遇到了一个错误,将其中一个改为.equals(),它修复了这个错误。
==不好吗?什么时候应该使用,什么时候不应该使用?有什么不同?
当前回答
==比较对象引用。
.equals()比较字符串值。
有时==会产生比较String值的错觉,如下所示:
String a="Test";
String b="Test";
if(a==b) ===> true
这是因为当您创建任何String字面值时,JVM首先在String池中搜索该字面值,如果找到匹配,则将相同的引用给予新的String。因此,我们得到:
(a==b) ==>为真
String Pool
b -----------------> "test" <-----------------a
但是,==在以下情况下失效:
String a="test";
String b=new String("test");
if (a==b) ===> false
在这种情况下,对于new String("test"),语句new String将在堆上创建,并且该引用将被赋予给b,因此b将被赋予堆上的引用,而不是在String池中。
现在a指向String池中的String,而b指向堆中的String。因此我们得到:
如果(a==b) ==>假。
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
而.equals()总是比较String的值,所以在这两种情况下都是true:
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
所以使用.equals()总是更好。
其他回答
.equals()比较类中的数据(假设函数已经实现)。 ==比较指针位置(对象在内存中的位置)。
==如果两个对象(不是谈论原语)指向同一个对象实例,则返回true。 .equals()如果两个对象包含相同的数据,则返回true
那可能对你有帮助。
Java有一个String池,Java在该池下管理String对象的内存分配。参见Java中的字符串池
当您使用==操作符检查(比较)两个对象时,它将地址相等性比较到字符串池中。如果两个String对象具有相同的地址引用,则返回true,否则返回false。但是如果你想比较两个String对象的内容,那么你必须重写equals方法。
equals实际上是Object类的方法,但它被重写到String类中,并给出了一个比较Object内容的新定义。
Example:
stringObjectOne.equals(stringObjectTwo);
但注意,它尊重String的情况。如果你想要不区分大小写的比较,那么你必须使用String类的equalsIgnoreCase方法。
让我们来看看:
String one = "HELLO";
String two = "HELLO";
String three = new String("HELLO");
String four = "hello";
one == two; // TRUE
one == three; // FALSE
one == four; // FALSE
one.equals(two); // TRUE
one.equals(three); // TRUE
one.equals(four); // FALSE
one.equalsIgnoreCase(four); // TRUE
是的,==不利于比较字符串(实际上是任何对象,除非您知道它们是规范的)。==只是比较对象引用。.equals()测试是否相等。对于字符串,它们通常是相同的,但正如你所发现的,这并不总是保证的。
==操作符检查两个字符串是否完全相同的对象。
equals()方法将检查两个字符串是否具有相同的值。
==比较Java中的对象引用,String对象也不例外。
为了比较对象(包括String)的实际内容,必须使用equals方法。
如果使用==对两个String对象进行比较的结果为真,那是因为String对象被合并了,并且Java虚拟机有多个引用指向同一个String实例。不要期望使用==比较一个包含相同内容的String对象与另一个String对象的计算结果为true。