Why is this an issue?

It is inefficient to build a String from a StringBuilder or StringBuffer just to check if it’s empty. Instead, directly use the .isEmpty method.

Noncompliant code example

StringBuilder sb = new StringBuilder();
// ...
if ("".equals(sb.toString()) { // Noncompliant
  // ...
}
if (sb.toString().isEmpty()) { // Noncompliant
  // ...
}

Compliant solution

StringBuilder sb = new StringBuilder();
// ...
if (sb.isEmpty()) {
  // ...
}
if (sb.isEmpty()) {
  // ...
}

Benchmarks

Method stringBuilderSize Runtime Average time Error margin

isEmpty

10

Temurin 21

6.57 ns/op

±0.38 ns/op

isEmpty

100

Temurin 21

6.68 ns/op

±0.10 ns/op

isEmpty

1000

Temurin 21

6.80 ns/op

±0.12 ns/op

length

10

Temurin 21

6.83 ns/op

±0.12 ns/op

length

100

Temurin 21

6.66 ns/op

±0.11 ns/op

length

1000

Temurin 21

6.67 ns/op

±0.07 ns/op

toStringEquals

10

Temurin 21

13.92 ns/op

±0.18 ns/op

toStringEquals

100

Temurin 21

59.09 ns/op

±0.53 ns/op

toStringEquals

1000

Temurin 21

465.79 ns/op

±5.86 ns/op

toStringIsEmpty

10

Temurin 21

13.83 ns/op

±0.23 ns/op

toStringIsEmpty

100

Temurin 21

60.06 ns/op

±3.42 ns/op

toStringIsEmpty

1000

Temurin 21

484.58 ns/op

±4.24 ns/op

Benchmarking code

The results were generated by running the following snippet with JMH.

@Param({"10", "100", "1000"})
int stringBuilderSize;


private StringBuilder sb;

@Setup(Level.Iteration)
public void setup() {
  sb = new StringBuilder();
  IntStream.range(0, stringBuilderSize).forEach(i -> sb.append("word"));
}

@Benchmark
public StringBuilder toStringEquals() {
  if ("".equals((sb.toString()))) {
    return sb;
  }
  return new StringBuilder();
}

@Benchmark
public StringBuilder toStringIsEmpty() {
  if (sb.toString().isEmpty()) {
    return sb;
  }
  return new StringBuilder();
}

@Benchmark
public StringBuilder length() {
  if (sb.length() == 0) {
    return sb;
  }
  return new StringBuilder();
}

@Benchmark
public StringBuilder isEmpty() {
  if (sb.isEmpty()) {
    return sb;
  }
  return new StringBuilder();
}