8197594: String#repeat

Reviewed-by: smarks, psandoz, plevart, rriggs, redestad
This commit is contained in:
Jim Laskey 2018-03-01 15:45:51 -04:00
parent 95b1eef0da
commit b4d4d8f66c
2 changed files with 183 additions and 0 deletions

View file

@ -2963,6 +2963,56 @@ public final class String
*/
public native String intern();
/**
* Returns a string whose value is the concatenation of this
* string repeated {@code count} times.
* <p>
* If this string is empty or count is zero then the empty
* string is returned.
*
* @param count number of times to repeat
*
* @return A string composed of this string repeated
* {@code count} times or the empty string if this
* string is empty or count is zero
*
* @throws IllegalArgumentException if the {@code count} is
* negative.
*
* @since 11
*/
public String repeat(int count) {
if (count < 0) {
throw new IllegalArgumentException("count is negative: " + count);
}
if (count == 1) {
return this;
}
final int len = value.length;
if (len == 0 || count == 0) {
return "";
}
if (len == 1) {
final byte[] single = new byte[count];
Arrays.fill(single, value[0]);
return new String(single, coder);
}
if (Integer.MAX_VALUE / count < len) {
throw new OutOfMemoryError("Repeating " + len + " bytes String " + count +
" times will produce a String exceeding maximum size.");
}
final int limit = len * count;
final byte[] multiple = new byte[limit];
System.arraycopy(value, 0, multiple, 0, len);
int copied = len;
for (int next = copied << 1; next < limit && 0 < next; next = next << 1) {
System.arraycopy(multiple, 0, multiple, copied, copied);
copied = next;
}
System.arraycopy(multiple, 0, multiple, copied, limit - copied);
return new String(multiple, coder);
}
////////////////////////////////////////////////////////////////
/**