如标题所述, in 的运行时间是equals()
多少java.util.Arrays
?
例如,如果它比较两个int[]
,它是否会遍历数组中的每个元素,所以 O(n)?对于javaequals()
中各个类equals()
中的所有内容,我们可以假设运行时总是 O(n) 吗?
谢谢。
从源代码中获取(源代码价值 100 字:P):
/**
* Returns <tt>true</tt> if the two specified arrays of ints are
* <i>equal</i> to one another. Two arrays are considered equal if both
* arrays contain the same number of elements, and all corresponding pairs
* of elements in the two arrays are equal. In other words, two arrays
* are equal if they contain the same elements in the same order. Also,
* two array references are considered equal if both are <tt>null</tt>.<p>
*
* @param a one array to be tested for equality
* @param a2 the other array to be tested for equality
* @return <tt>true</tt> if the two arrays are equal
*/
public static boolean equals(int[] a, int[] 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;
}
如标题所述,java.util.Arrays 中默认 equals() 的运行时间是多少?
默认 equals 可能意味着 Object.equals。Arrays.equals() 通常是您真正想要的。
例如,如果它比较两个 int[],它是否会遍历数组中的每个元素,所以 O(n)?
是的,这就是消息来源所暗示的。
对于java中所有默认的equals(),我们可以假设运行时总是O(n)吗?
对于某些集合,这是正确的,但对于树集合,它可以是 O(n log n)。HashMap 最坏的情况是 O(N^2) 因为非集合n
没有意义。
它首先检查长度,如果相等,则遍历所有元素并在它们上调用 equals。
所以,如果你想忽略个人等价的成本,是的,那将是 O(n)。但是,例如,如果条目是字符串,它也会随着字符串变长而变长,而不仅仅是因为它们变得更多(因为比较本身也是 O(m))。
javadoc 声明:如果两个数组以相同的顺序包含相同的元素,则它们是相等的。所以很明显,这将是一个 O(n) 操作,因为它需要遍历所有项目(至少如果它们都相等)。
默认equals
(即Object#equals)是 O(1) 操作,它是一个简单的引用比较:
对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true