String.isEmpty()比"" .equals(s)或s.equals("")性能更快 - Dmytro Dumanskiy


让我们看一下以下基本代码:

if (s != null && s.equals(“”)) {
}


if (“”.equals(s)) {
}

乍一看,它看起来像是正确的代码。但是,如果我们考虑性能,那不是最佳选择。让我们稍微改变一下方法,改用String.isEmpty()方法:
if (s != null && s.isEmpty()) {

}

改用isEmpty以后的新代码速度提高了约20–40%!

性能测试代码:

@BenchmarkMode(Mode.AverageTime)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 5, time = 1)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Measurement(iterations = 10, time = 1)
public class EmptyStringEquals {

   @Param({"", "nonEmptyString"})
   private String strParams;

   @Benchmark
   public boolean nonNullAndIsEmpty() {
       return strParams != null && strParams.isEmpty();
   }

   @Benchmark
   public boolean equalsPost() {
       return strParams != null && strParams.equals(
"");
   }

   @Benchmark
   public boolean preEquals() {
       return
"".equals(strParams);
   }

}
测试结果:
EmptyStringEquals.equalsPost                         avgt   10  4.240 ± 0.058  ns/op
EmptyStringEquals.nonNullAndIsEmpty                  avgt   10  2.985 ± 0.048  ns/op
EmptyStringEquals.preEquals                          avgt   10  4.243 ± 0.062  ns/op

EmptyStringEquals.equalsPost         nonEmptyString  avgt   10  3.522 ± 0.034  ns/op
EmptyStringEquals.nonNullAndIsEmpty  nonEmptyString  avgt   10  2.894 ± 0.048  ns/op
EmptyStringEquals.preEquals          nonEmptyString  avgt   10  3.672 ± 0.016  ns/op


基准测试的源代码,因此您可以自己尝试。