简体   繁体   English

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

[英]What is the runtime of equals() in java.util.Arrays?

As title stated, what's the runtime of equals() in java.util.Arrays ? 正如标题所述, java.util.Arraysequals()的运行时是什么?

For example if it's comparing two int[] , does it loop through every element in the array, so O(n)? 例如,如果它比较两个int[] ,它是否循环遍历数组中的每个元素,那么O(n)? And for all equals() in individual classes' equals() in java, can we assume that the runtime is always O(n) ? 对于java中各个类' equals()中的所有equals() ,我们可以假设运行时总是O(n)吗?

Thanks. 谢谢。

Grabbed from the source code (source code is worth 100 words :P): 从源代码中获取(源代码值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;
}

As title stated, what's the runtime of default equals() in java.util.Arrays? 正如标题所述,java.util.Arrays中默认的运行时是什么等于()?

The default equals could mean Object.equals. 默认等于可能意味着Object.equals。 The Arrays.equals() is usually what you really want. Arrays.equals()通常是你真正想要的。

For example if it's comparing two int[], does it loop through every element in the array, so O(n)? 例如,如果它比较两个int [],它是否循环遍历数组中的每个元素,那么O(n)?

yes, thats what the source suggests. 是的,这就是消息来源所暗示的。

And for all default equals() in java, can we assume that the runtime is always O(n)? 对于java中的所有默认equals(),我们可以假设运行时总是O(n)吗?

For some collections this is true, but for Tree collections it can be O(n log n). 对于某些集合,这是正确的,但对于Tree集合,它可以是O(n log n)。 The worst case for HashMap is O(N^2) For non-collections n has no meaning. HashMap的最坏情况是O(N ^ 2)对于非集合, n没有意义。

It first checks the length, and if equal, loops over all elements and calls equals on them. 它首先检查长度,如果相等,则遍历所有元素并且调用等于它们。

So, if you want to ignore the cost of the individual equals, yes, that would be O(n). 所以,如果你想忽略个人等于的成本,是的,那就是O(n)。 But if the entries are Strings, for example, it will also get longer as the Strings get longer, not just as they get more (because the comparisons themselves are O(m) as well). 但是,如果条目是字符串,例如,随着字符串变长,它也会变长,而不仅仅是因为它们得到更多(因为比较本身也是O(m))。

The javadoc states : two arrays are equal if they contain the same elements in the same order . javadoc声明如果两个数组包含相同顺序的相同元素,则它们是相等的 So it is clear that this is going to be an O(n) operation as it will need to loop over all the items (at least if they are all equal). 所以很明显,这将是一个O(n)操作,因为它需要遍历所有项目(至少如果它们都相等)。

The default equals (ie Object#equals) is an O(1) operation, it is a simple reference comparison: 默认equals (即Object#equals)是一个O(1)操作,它是一个简单的参考比较:

for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true) 对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法返回true(x == y的值为true)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM