java - equalsIgnoreCase() 与 toUpperCase().equals 和 toLowerCase().equals 的效率

标签 java string performance

标题说明了一切。我的问题是关于不同的效率String等价方法。我经常使用.equalsIgnoreCase(String str)因为我只是有它的东西。但我开始怀疑它是否可能不是找到 Strings 之间等价的最有效方法。 .在我看来 .equalsIgnoreCase(String str)正在调用其中一种大小写转换方法 toUpperCasetoLowerCase然后调用equals在它的定义中,但我可能错了。那么,在以下情况或任何情况下,这些方法中哪一种更有效?

int count = 0;//checks for face cards at indexes listed in selectedCards
              // Selected cards is Integer ArrayList

    for(; (count < selectedCards.size() && count < 3); count++)
    {
        if(cardAt(selectedCards.get(count)).rank().equalsIgnoreCase("Queen"))
            count++;
        else if(cardAt(selectedCards.get(count)).rank().equalsIgnoreCase("King"))
            count++;
        if(cardAt(selectedCards.get(count)).rank().equalsIgnoreCase("Jack"))
            count++;
    }

    if(count == 3)
        return true;
    return false;

最佳答案

JMH 使微基准测试变得容易:

更新:将输入字符串设置为参数以解决来自 JMH God Alexey Shipilev 的评论。我留下了目标字符串常量,因为 OP 的用例是将输入字符串与常量进行比较。

@State(Benchmark)
public class StrComp {

    @Param({"Queen", "queen", "King"})
    public String input;

    @Benchmark
    public boolean eqIgnoreCase() {
        return input.equalsIgnoreCase("queen");
    }

    @Benchmark
    public boolean eqToLower() {
        return input.toLowerCase().equals("queen");
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(".*StrComp.*")
                .mode(Mode.AverageTime)
                .timeUnit(TimeUnit.NANOSECONDS)
                .forks(5)
                .warmupIterations(10)
                .measurementIterations(10)
                .build();

        new Runner(opt).run();
    }
}

和输出:
Benchmark             Mode  Cnt   Score   Error  Units
StrComp.eqIgnoreCase  avgt   50  18.581 ± 0.051  ns/op
StrComp.eqToLower     avgt   50  54.796 ± 0.173  ns/op

使用参数更新输出:
Benchmark             (input)  Mode  Cnt   Score   Error  Units
StrComp.eqIgnoreCase    Queen  avgt   50  17.947 ± 0.205  ns/op
StrComp.eqIgnoreCase    queen  avgt   50  15.553 ± 0.159  ns/op
StrComp.eqIgnoreCase     King  avgt   50   2.968 ± 0.037  ns/op
StrComp.eqToLower       Queen  avgt   50  56.499 ± 0.180  ns/op
StrComp.eqToLower       queen  avgt   50  22.023 ± 0.040  ns/op
StrComp.eqToLower        King  avgt   50  49.174 ± 0.145  ns/op

因此,eqIgnoreCase 更快,但除非您每秒进行一百万次比较,否则您不会注意到任何差异。

如果第一个字符串已经是小写或者字符串的长度不同等,您可以四处玩耍,看看差异会如何受到影响。

无论如何,如果你想让你的代码更“高效”、更清晰、类型安全且不易出现错误,请不要将字符串用于此类事情。使用枚举。

一副纸牌非常适合通过枚举实现,它经常被用来说明 enum概念:http://docs.oracle.com/javase/8/docs/technotes/guides/language/enums.html#Card

关于java - equalsIgnoreCase() 与 toUpperCase().equals 和 toLowerCase().equals 的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29785600/

相关文章:

java - 如何读取作为命令参数的文本文件(字符串)的第一行(在Java中使用eclipse)

sql - 我如何优化这个更新每一行的 PostgreSQL 查询?

performance - 绕过 TCP-IP 堆栈

ios - 替换C字符串中的字符

java - 如何将 java jna 接口(interface)转换为 kotlin

java - Android在输入其他编辑文本值时更改编辑文本值

java - Kotlin 委托(delegate)表达而不是固定引用

java - 正则表达式查找特定字符在字符串中是否存在奇数次

c 中的 case 语句效率

JavaScript 匿名函数数组到 Java 的翻译