Java字符串类中的compareTo方法比下面的代码效率如何? private static int myCompare(字符串a、字符串b){ /*String Java类中compareTo方法的我的版本*/ int len1=a.长度(); int len2=b.长度(); 如果(len1==len2){ 对于(inti=0;i

Java字符串类中的compareTo方法比下面的代码效率如何? private static int myCompare(字符串a、字符串b){ /*String Java类中compareTo方法的我的版本*/ int len1=a.长度(); int len2=b.长度(); 如果(len1==len2){ 对于(inti=0;i,java,string,string-comparison,Java,String,String Comparison,编辑: 我很抱歉第一次没有正确地提出我的问题。接下来,我会更加小心地精确地提出我的问题。在我的项目中,我需要一种方法来比较两个字符串以按字母顺序排序,因此我没有像大多数理智的人那样用谷歌搜索,而是快速编写了一个(而且不是一个好的)。通过查看String类,特别是compareTo方法,我发现它使用的变量比我使用的多。所以,我对这种方法如何比我的更有效感到困惑。后来,我了解到它比我的更有效地处理排序。更详细地说,如果两个字符串的长度不同,那么我的代码将自动返回-1,这不会给出第二个字符串是否在第一

编辑:

我很抱歉第一次没有正确地提出我的问题。接下来,我会更加小心地精确地提出我的问题。在我的项目中,我需要一种方法来比较两个字符串以按字母顺序排序,因此我没有像大多数理智的人那样用谷歌搜索,而是快速编写了一个(而且不是一个好的)。通过查看String类,特别是
compareTo
方法,我发现它使用的变量比我使用的多。所以,我对这种方法如何比我的更有效感到困惑。后来,我了解到它比我的更有效地处理排序。更详细地说,如果两个字符串的长度不同,那么我的代码将自动返回
-1
,这不会给出第二个字符串是否在第一个字符串之前或之后的信息

此外,感谢DM指出,字符串对象显然可以直接访问其私有变量,并且在执行
toCharAt
调用时只传递一个副本,这让人明白了
compareTo
方法确实是有效的,并且比我的temerary
myCompare
方法提供了更多的实用性


我真的很匆忙,但也很好奇为什么
compareTo
方法比
myCompare
方法好,这导致我在没有任何研究或思考的情况下,不经意地匆忙提出问题。哈哈,创造者知道他们的方法。正如我所说的,在未来,我将首先研究并发布更好的问题。

好吧,看来代码2确实使用了更多的内存。但这是因为它使用
toCharArray()
来复制字符串的内容。String
compareTo()
方法可以访问String的私有变量,而不必这样做


除此之外,它们非常相似,尽管您的方法主要根据字符串长度而不是字母顺序进行排序。我相信它们都是O(n)-它们必须潜在地检查两个字符串的每个字符。代码2还涉及复制两个字符串中的字符,但这些也是O(n)操作,O(n)+O(n)=O(n)。

您可以自己分析代码并执行基准测试。。。或者你想让我们帮你这么做?你知道int和char以及其他变量之间的内存大小差异吗?了解这一点将有助于理解内存成本的差异我可能会弄错,但我可以想象,就时间而言,它们具有相同的O(N)线性复杂性。内存,我不确定。@cricket\u 007我如何评测和基准测试?不能比较不产生相同结果的代码的效率。重点是什么?苹果和桔子!!如果你不相信我说的不同结果,试着比较一下
“AA”
“B”
。很好的解释。您能详细说明一下什么是字符串可以访问字符串对象的私有变量吗?我想这就是我想要的。谢谢最相关的是,它可以访问字符串的private
value
变量,该变量是包含字符串中实际字符的字符数组。(它是私有的,因为如果它允许直接访问数组,其他代码可能会更改数组中的内容,这将打破字符串不可变的保证。这就是为什么其他人只能使用
tocharray()
-更改副本不会更改原始数组。)
private static int myCompare(String a, String b) {

    /* my version of the compareTo method from the String Java class */

    int len1 = a.length();
    int len2 = b.length();

    if (len1 == len2) { 

        for (int i = 0; i < a.length(); i++) { 

            int intValueOfStringA = (int) a.charAt(i); 
            int intValueOfStringB = (int) b.charAt(i); 

            if (intValueOfStringA != intValueOfStringB) {

                return intValueOfStringA - intValueOfStringB;
            }
        }
    }
    return -1;
}