I did check the other questions; this question has its focus on solving this particular question the most efficient way.
Sometimes you want to create a new string with a specified length, and with a default character filling the entire string.
ie, it would be cool if you could do new String(10, '*')
and create a new String from there, with a length of 10 characters all having a *.
Because such a constructor does not exist, and you cannot extend from String, you have either to create a wrapper class or a method to do this for you.
At this moment I am using this:
protected String getStringWithLengthAndFilledWithCharacter(int length, char charToFill) {
char[] array = new char[length];
int pos = 0;
while (pos < length) {
array[pos] = charToFill;
pos++;
}
return new String(array);
}
It still lacks any checking (ie, when length is 0 it will not work). I am constructing the array first because I believe it is faster than using string concatination or using a StringBuffer to do so.
Anyone else has a better sollution?
One extra note: it seems that all public ways of creating a new
String
instance involves necessarily the copy of whatever buffer you are working with, be it achar[]
, aStringBuffer
or aStringBuilder
. From theString
javadoc (and is repeated in the respectivetoString
methods from the other classes):So you'll end up having a possibly big memory copy operation after the "fast filling" of the array. The only solution that may avoid this issue is the one from @mlk, if you can manage working directly with the proposed
CharSequence
implementation (what may be the case).PS: I would post this as a comment but I don't have enough reputation to do that yet.
What is wrong?
Simply use the StringUtils class from apache commons lang project. You have a leftPad method:
In Java 11, you have
repeat
:(Although at the time of writing still subject to change)
Solution using Google Guava, since I prefer it to Apache Commons-Lang:
Some possible solutions.
This creates a String with length-times '0' filled and replaces then the '0' with the charToFill (old school).
This creates a List containing length-times Strings with charToFill and then joining the List into a String.
This creates a unlimited java8 Stream with Strings with charToFill, limits the output to length and collects the results with a String joiner (new school).