为什么 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)
如果 array1
和 array2
引用不指向同一个数组实例, 将简单地执行 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
}
}
第一种比较方式应该是最快的,因为它只看对象引用是否相等。其他两个实现与提到的另一个答案具有相同的时间复杂度。
现在我在 Java 中遇到一个问题,需要比较两个字符数组。我首先使用了像 (array1.equals(array2)) 这样的语句,它 returns 结果非常慢。然后我发现如果我使用like(new String(array1).equals(new String(array2))这样的语句,它竟然变得更快了。后来我也发现如果我在Arrayclass中使用equals()函数,那么速度也比直接在 array1 上调用 equals() 快得多。那是为什么呢?
我想你错了。
array1.equals(array2)
如果 array1
和 array2
引用不指向同一个数组实例, 将简单地执行 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
}
}
第一种比较方式应该是最快的,因为它只看对象引用是否相等。其他两个实现与提到的另一个答案具有相同的时间复杂度。