9

タイトルが述べたように、の実行時間は何equals()ですかjava.util.Arrays

たとえば、2つint[]を比較している場合、配列内のすべての要素をループするので、O(n)ですか?そして、Javaequals()の個々のクラスのすべてequals()について、ランタイムが常にO(n)であると想定できますか?

ありがとう。

4

4 に答える 4

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;
}
于 2012-12-27T10:43:49.923 に答える
8

タイトルにあるように、java.util.Arraysのデフォルトのequals()の実行時間はどれくらいですか?

デフォルトのequalsは、Object.equalsを意味する場合があります。Arrays.equals()は通常、本当に必要なものです。

たとえば、2つのint []を比較している場合、配列内のすべての要素をループするので、O(n)ですか?

はい、それはソースが示唆していることです。

そして、Javaのすべてのデフォルトのequals()について、ランタイムが常にO(n)であると想定できますか?

一部のコレクションではこれが当てはまりますが、ツリーコレクションではO(n log n)になる可能性があります。HashMapの最悪のケースはO(N ^ 2)です。非コレクションの場合nは意味がありません。

于 2012-12-27T10:52:26.527 に答える
6

最初に長さをチェックし、等しい場合はすべての要素をループして、それらに対してequalsを呼び出します。

したがって、個人のコストが等しいことを無視したい場合は、そうです、それはO(n)になります。ただし、たとえば、エントリが文字列の場合、文字列が長くなるだけでなく、文字列が長くなるにつれて長くなります(比較自体もO(m)であるため)。

于 2012-12-27T10:43:58.510 に答える
0

javadocの状態:2つの配列が同じ順序で同じ要素を含んでいる場合、それらは等しい。したがって、すべてのアイテムをループする必要があるため、これがO(n)操作になることは明らかです(少なくともそれらがすべて等しい場合)。

デフォルトequals(つまり、Object#equals)はO(1)操作であり、単純な参照比較です。

null以外の参照値xおよびyの場合、このメソッドは、xとyが同じオブジェクトを参照している場合にのみtrueを返します(x == yの値はtrueです)。

于 2012-12-27T10:46:39.703 に答える