> That doesn't remove the performance difference when the string is NOT upper > case.
When the code is C2 compiler there is no significant difference, but in interpreter mode it's noticeable. @OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(value = Mode.AverageTime) public class StringEqualityBenchmark { @Benchmark public boolean equals(Data data) { return data.getStr1().equals(data.getStr2()); } @Benchmark public boolean reference(Data data) { return data.getStr1() == data.getStr2(); } @State(Scope.Thread) public static class Data { @Param({"true", "false"}) private boolean latin; private final String latinStr1 = "AZ"; private final String latinStr2 = latinStr1; private final String russianStr1 = "АЯ"; private final String russianStr2 = russianStr1; String getStr1() { return latin ? latinStr1 : russianStr1; } String getStr2() { return latin ? latinStr2 : russianStr2; } } } This benchmark run in interpreter mode yields following results: Benchmark (latin) Mode Cnt Score Error Units StringEqualityBenchmark.equals true avgt 50 212,916 ± 24,065 ns/op StringEqualityBenchmark.reference true avgt 50 160,699 ± 8,948 ns/op StringEqualityBenchmark.equals false avgt 50 178,818 ± 13,223 ns/op StringEqualityBenchmark.reference false avgt 50 158,227 ± 8,704 ns/op Regards, Sergey Tsypanov