我有两个char
数组从两个字符串生成。我想确定数组是否等于。
str1Array = str1.toCharArray();
str2Array = str2.toCharArray();
我的理解是str1Array.equals(str2Array)
只会在数组对象与内存中的同一对象时返回true
。如果我想检查每个索引是否相同,我应该使用Arrays.equals(str1Array, str2Array)
我想知道这种等于方法的复杂性。
我认为它不能是O(1)
,因为它无法在不检查每个索引的相等性的情况下评估数组对象的内容相等性。我的猜测是O(n)
n
对应min(str1Array.length, str2Array.length)
任何人都可以验证这一点或发表评论吗?
答案 0 :(得分:8)
好吧,让我们来看看源代码:
public static boolean equals(Object[] a, Object[] 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++) {
Object o1 = a[i];
Object o2 = a2[i];
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return true;
}
(该方法的其他变体大致相同)。
正如我们所看到的,它正在遍历数组。因此它具有O(n)
的最坏情况复杂性,其中n
是所比较的数组的长度。 (如果数组大小不同,则立即退出,使其成为O(1)
)。
然而,并不总是需要那么久。它确实有一些前提条件,用于相等,空检查和长度检查。它也会在找到匹配后立即退出,因此可能会花费更少的时间。