到目前为止,我一直在程序中使用==运算符来比较所有的字符串。 然而,我遇到了一个错误,将其中一个改为.equals(),它修复了这个错误。

==不好吗?什么时候应该使用,什么时候不应该使用?有什么不同?


当前回答

.equals()比较类中的数据(假设函数已经实现)。 ==比较指针位置(对象在内存中的位置)。

==如果两个对象(不是谈论原语)指向同一个对象实例,则返回true。 .equals()如果两个对象包含相同的数据,则返回true

那可能对你有帮助。

其他回答

==比较对象引用。

.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()总是更好。

==比较对象的引用值,而java.lang.String类中的equals()方法比较String对象的内容(与另一个对象)。

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

功能:

public float simpleSimilarity(String u, String v) {
    String[] a = u.split(" ");
    String[] b = v.split(" ");

    long correct = 0;
    int minLen = Math.min(a.length, b.length);

    for (int i = 0; i < minLen; i++) {
        String aa = a[i];
        String bb = b[i];
        int minWordLength = Math.min(aa.length(), bb.length());

        for (int j = 0; j < minWordLength; j++) {
            if (aa.charAt(j) == bb.charAt(j)) {
                correct++;
            }
        }
    }

    return (float) (((double) correct) / Math.max(u.length(), v.length()));
}

测试:

String a = "This is the first string.";

String b = "this is not 1st string!";

// for exact string comparison, use .equals

boolean exact = a.equals(b);

// For similarity check, there are libraries for this
// Here I'll try a simple example I wrote

float similarity = simple_similarity(a,b);

如果equals()方法出现在java.lang.Object类中,并且希望它检查对象状态的等价性!也就是说,对象的内容。而==运算符则用于检查实际的对象实例是否相同。

例子

考虑两个不同的参考变量str1和str2:

str1 = new String("abc");
str2 = new String("abc");

如果你使用equals()

System.out.println((str1.equals(str2))?"TRUE":"FALSE");

如果使用==,您将得到TRUE的输出。

System.out.println((str1==str2) ? "TRUE" : "FALSE");

现在您将得到FALSE作为输出,因为str1和str2都指向两个不同的对象,尽管它们共享相同的字符串内容。因为有了new String(),每次都会创建一个新对象。