static String format(@Nullable String template, Object... args) {
    template = String.valueOf(template); // null -> "null"

    // start substituting the arguments into the '%s' placeholders
    StringBuilder builder = new StringBuilder(template.length() + 16 * args.length);
    int templateStart = 0;
    int i = 0;
    while (i < args.length) {
      int placeholderStart = template.indexOf("%s", templateStart);
      if (placeholderStart == -1) {
        break;
      }
      builder.append(template.substring(templateStart, placeholderStart));
      builder.append(args[i++]);
      templateStart = placeholderStart + 2;
    }
    builder.append(template.substring(templateStart));

    // if we run out of placeholders, append the extra args in square braces
    if (i < args.length) {
      builder.append(" [");
      builder.append(args[i++]);
      while (i < args.length) {
        builder.append(", ");
        builder.append(args[i++]);
      }
      builder.append(']');
    }

    return builder.toString();
  }
Substitutes each {@code %s} in {@code template} with an argument. These are matched by
position: the first {@code %s} gets {@code args[0]}, etc. If there are more arguments than
placeholders, the unmatched arguments will be appended to the end of the formatted message in
square braces.

@param template a non-null string containing 0 or more {@code %s} placeholders.
@param args the arguments to be substituted into the message template. Arguments are converted
    to strings using {@link String#valueOf(Object)}. Arguments can be null.
fbcore/src/main/java/com/facebook/common/internal/Preconditions.java