标题说明了一切。我的问题是关于不同的效率String
等价方法。我经常使用.equalsIgnoreCase(String str)
因为我只是有它的东西。但我开始怀疑它是否可能不是找到 Strings
之间等价的最有效方法。 .在我看来 .equalsIgnoreCase(String str)
正在调用其中一种大小写转换方法 toUpperCase
或 toLowerCase
然后调用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/