Although it is less readable, you can do it
final char[] ca = in.toCharArray(); Arrays.fill(ca, left, str.length - right, 'X'); return new String(ca)
Using Google Caliper on my machine will give about 20-25 ns compared to more than 100 ns using the StringBuilder or StringUtils.overlay + repeat methods.
import static org.apache.commons.lang3.StringUtils.overlay; import static org.apache.commons.lang3.StringUtils.repeat; import java.util.Arrays; import org.apache.commons.lang3.StringUtils; import com.google.caliper.Param; import com.google.caliper.Runner; import com.google.caliper.SimpleBenchmark; public class ArrayCopyVsStringBuild extends SimpleBenchmark { public static void main(final String[] args) throws Exception { Runner.main(ArrayCopyVsStringBuild.class, args); } @Param({ "1234567890123456", "1234567890" }) private String input; @Param({ "0", "4" }) private int left; @Param({ "0", "4" }) private int right; public void timeArray(final int reps) { for (int i = 0; i < reps; i++) { final char[] masked = input.toCharArray(); Arrays.fill(masked, left, masked.length - right, 'X'); final String x = new String(masked); x.toString(); } } public void timeStringBuilder(final int reps) { for (int i = 0; i < reps; i++) { final StringBuilder b = new StringBuilder(input.length()); b.append(input.substring(0, left)); for (int z = 0; z < input.length() - left - right; ++z) { b.append('X'); } b.append(input.substring(input.length() - right)); final String x = b.toString(); x.toString(); } } public void timeStringUtils(final int reps) { for (int i = 0; i < reps; i++) { final StringBuilder b = new StringBuilder(input.length()); b.append(input.substring(0, left)); b.append(repeat('x', input.length() - left - right)); b.append(input.substring(input.length() - right)); final String x = b.toString(); x.toString(); } } public void timeStringUtilsOverlay(final int reps) { for (int i = 0; i < reps; i++) { final int maskLength = input.length() - left - right; final String x = overlay(input, repeat('x', maskLength), left, maskLength + left); x.toString(); } } }
Archimedes trajano
source share