【问题标题】:Which is faster, equalsIgnoreCase or compareToIgnoreCase哪个更快,equalsIgnoreCase 或 compareToIgnoreCase
【发布时间】:2023-04-05 19:07:01
【问题描述】:

在 java 应用程序中,假设我可以选择以下比较方法

equalsIgnoreCase(String anotherString)

compareToIgnoreCase(String str)

哪个更快?

【问题讨论】:

    标签: java string


    【解决方案1】:

    equalsIgnoreCase 可以快很多。例如,考虑两个以相同的 10,000 个字符开头的字符串,但其中一个字符串末尾有一个额外的字符。 equalsIgnoreCase可以立即返回; compareToIgnoreCase 必须迭代到字符串的末尾才能看到差异。

    但一般来说,我会选择更能表达您的意图的那个。这对性能也很有效:假设我说equalsIgnoreCase 至少和compareToIgnoreCase 一样快是对的,这意味着你应该尽可能使用它——如果你需要实际订购,你必须无论如何都要使用compareToIgnoreCase

    【讨论】:

    • equalsIgnoreCase() 与 compareToIgnoreCase() 有一些关键的区别。对于 1,它首先测试 == 相等性,然后再实际查看所有字符是否相同。 CompareTo 将始终对字符进行完整比较,但不会考虑语言环境。因此,您确实需要知道要使用哪种比较,然后对其进行基准测试。
    【解决方案2】:

    如果您担心性能... 衡量它

    【讨论】:

    • 太简单了!必须有一种方法可以浪费更多人的时间!
    • 确实,不是很好的答案吗?
    • 在这种情况下使用测量实际上很容易得出错误的结论,因为结果很大程度上取决于您测量的内容。最好先获得一些见解 - 请参阅 Jon Skeet 的回答以获取一个很好的示例。
    【解决方案3】:

    查看 java.lang.String 的源代码

     public boolean equalsIgnoreCase(String anotherString) {
        return (this == anotherString) ? true :
               (anotherString != null) && (anotherString.count == count) &&
           regionMatches(true, 0, anotherString, 0, count);
     }
    

    因此,在逐个字符查看实际字符串之前(compareToIgnoreCase 也以类似的方式发生),equalsIgnoreCase 还会检查引用标识和字符长度,这可能会快得多。

    【讨论】:

    • 或者当大多数字符串不同时可能会浪费时间:)
    • 当然,这是一种权衡。但是这两个比较很快,所以你损失不大。并且长度比较应该非常有效(非常快速地检测到很多不同的字符串)。
    猜你喜欢
    • 2010-11-10
    • 2012-10-03
    • 2011-02-15
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多