Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中2个字符串的.equals的时间复杂度是多少?_Java_String_Big O - Fatal编程技术网

java中2个字符串的.equals的时间复杂度是多少?

java中2个字符串的.equals的时间复杂度是多少?,java,string,big-o,Java,String,Big O,我想知道Java中.equals运算符对于两个字符串的时间复杂度(大O)是多少 基本上,如果我做了stringOne.equals(stringTwo),它的性能如何 谢谢。最坏的情况是O(n),除非两个字符串是同一个对象,在这种情况下是O(1) (虽然在本例中,n是指两个字符串中从第一个字符开始的匹配字符数,而不是字符串的总长度)。这里的其他答案过于简单化 通常,证明两个不同的字符串相等是O(n),因为您可能需要比较每个字符 然而,这只是一种最坏的情况:有许多快捷方式意味着equals()方法

我想知道Java中.equals运算符对于两个字符串的时间复杂度(大O)是多少

基本上,如果我做了stringOne.equals(stringTwo),它的性能如何

谢谢。

最坏的情况是O(n),除非两个字符串是同一个对象,在这种情况下是O(1)


(虽然在本例中,n是指两个字符串中从第一个字符开始的匹配字符数,而不是字符串的总长度)。

这里的其他答案过于简单化

通常,证明两个不同的字符串相等是
O(n)
,因为您可能需要比较每个字符

然而,这只是一种最坏的情况:有许多快捷方式意味着
equals()
方法在一般/典型情况下的性能要好得多:

  • 如果字符串是相同的,则为
    O(1)
    :它们是相同的对象,因此定义相等,因此结果为真
  • 如果您能够检查预计算的hashcode,那么这就是
    O(1)
    ,它可以证明两个字符串不相等(显然,它不能帮助证明两个字符串相等,因为许多字符串都散列到相同的hashcode)
  • 如果字符串长度不同(它们不可能相等,因此结果为假),则为
    O(1)
  • 您只需要检测一个不同的字符就可以证明字符串不相等。所以对于随机分布的字符串,比较两个字符串实际上是平均
    O(1)
    时间。如果字符串不是完全随机的,则结果可能介于
    O(1)
    O(n)
    之间,具体取决于数据分布
如您所见,确切的性能取决于数据的分布

除此之外:这取决于实现,因此确切的性能特征将取决于所使用的Java版本。然而,据我所知,目前所有主要的Java实现都进行了上面列出的优化,因此您可以期望字符串上的
equals()
性能非常快


最后一个技巧:如果使用字符串内部处理,那么所有相等的字符串都将映射到同一个对象实例。然后,您可以使用极快的
==
检查对象标识来代替
equals()
,这保证是
O(1)
。这种方法有缺点(您可能需要插入大量字符串,这会导致内存问题,并且您需要严格记住插入计划用于此方案的任何字符串),但在某些情况下它非常有用。

要添加到优秀的答案中,我们可以从代码中看到:

public boolean equals(Object anObject) {
    if (this == anObject) { // O(1)
        return true;
    }
    if (anObject instanceof String) //O(1)  {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) { // O(1)
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {  // O(n)
                if (v1[i] != v2[i]) //O(1)
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
最佳案例:O(1)


最坏的情况:O(n)

你会怎么想?你认为平等性检查是如何实现的?如果两个
String
s都进行了
intern
ed,它可以在固定时间内完成。没错,我忘记了对象标识。OpenJDK至少在比较字符之前检查
String
s是否具有相同的长度。这个答案有误导性。在缩放问题中,传统的N是数据结构的长度/大小……实习的另一个缺点是,你必须记住实习将要比较的每个字符串。如果使用
=
比较单个未插入的字符串,则代码可能会中断。这使您的应用程序变得脆弱。您还可以提到依赖于字符串对象(特定于实现)的哈希代码缓存的(假设)优化。已调用哈希冲突。>如果您能够检查预先计算的哈希代码,这可以证明两个字符串不相等(显然,它不能帮助证明两个字符串相等,因为许多字符串都散列到相同的哈希代码)。地狱,如果应用程序的唯一目标是比较定义良好的字符串池,那么实习可能是一件大事。也许我应该习惯在使用通用算法之前检查我的目标两次。我认为这是不对的。和斯古普塔的原因一样。