java.util.Arrays中equals()的运行时是什么?

时间:2012-12-27 10:42:26

标签: java arrays runtime equals

如标题所述,equals()java.util.Arrays的运行时间是多少?

例如,如果它正在比较两个int[],它是否循环遍历数组中的每个元素,那么O(n)?对于java中各个类equals()中的所有equals(),我们可以假设运行时总是O(n)吗?

感谢。

4 个答案:

答案 0 :(得分:11)

从源代码中获取(源代码值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;
}

答案 1 :(得分:8)

  

如标题所述,java.util.Arrays中默认的运行时为equals()是什么?

默认等于可能意味着Object.equals。 Arrays.equals()通常是你真正想要的。

  

例如,如果它正在比较两个int [],它是否循环遍历数组中的每个元素,那么O(n)?

是的,这就是消息来源的建议。

  

对于java中的所有默认equals(),我们可以假设运行时总是O(n)吗?

对于某些集合,这是正确的,但对于Tree集合,它可以是O(n log n)。 HashMap的最坏情况是O(N ^ 2)对于非集合n没有意义。

答案 2 :(得分:6)

它首先检查长度,如果相等,则遍历所有元素并且调用等于它们。

所以,如果你想忽略个人等于的成本,是的,那就是O(n)。但是,如果条目是字符串,例如,随着字符串变长,它也会变长,而不仅仅是因为它们得到更多(因为比较本身也是O(m))。

答案 3 :(得分:0)

javadoc states两个数组相等,如果它们包含相同顺序的相同元素。所以很明显,这将是一个O(n)操作,因为它需要遍历所有项目(至少如果它们都相等)。

default equals(即Object#equals)是一个O(1)操作,它是一个简单的参考比较:

  

对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)