为什么 String 中的 equals() 比 java 中的 char 数组中的 equals() 快?

Why equals() in String is faster than equals() in char array in java?

现在我在 Java 中遇到一个问题,需要比较两个字符数组。我首先使用了像 (array1.equals(array2)) 这样的语句,它 returns 结果非常慢。然后我发现如果我使用like(new String(array1).equals(new String(array2))这样的语句,它竟然变得更快了。后来我也发现如果我在Arrayclass中使用equals()函数,那么速度也比直接在 array1 上调用 equals() 快得多。那是为什么呢?

我想你错了。

array1.equals(array2)
如果 array1array2 引用不指向同一个数组实例,

将简单地执行 array1 == array2 并且总是 return false。所以这应该很快,因为它只是内存位置匹配。

如果您在字符串 class 中看到 equals(),则它是

public boolean equals(Object anObject) {
if (this == anObject) {
    return true;
}
if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
        return false;
    }
    return true;
    }
}
return false;
}

其中数组 class 是

public static boolean equals(long[] a, long[] a2) {
    if (a==a2)
        return true;
    if (a==null || a2==null)
        return false;

    int length = a.length;
    if (a2.length != length)
        return false;

    for (int i=0; i<length; i++)
        if (a[i] != a2[i])
            return false;

    return true;
}

您可以使用以上任何一种。您所做的只是将 char 数组转换为 String,然后 String 中的 equals 再次使用 String 内部表示中的 char 数组进行比较。两种方法或多或少具有相同的时间复杂度。

但是是的,在您的情况下,您应该使用 Arrays.equals() 以获得最佳性能和结果。

我想你正在看的是这样的东西。

public class CharComparison {
public static void main(String[] args) {

        char[] array1 = "some random string".toCharArray();
        char[] array2 = "other random string".toCharArray();

        System.out.println(array1.equals(array2));// object class == comparison

        System.out.println(new String(array1).equals(new String(array2))); // String equals comparison

        System.out.println(Arrays.equals(array1,array2)); // Arrays.equals(foo,bar) comparison
    }
}

第一种比较方式应该是最快的,因为它只看对象引用是否相等。其他两个实现与提到的另一个答案具有相同的时间复杂度。