diff -r b9ee7c274ee0 -r f2804cb922ce src/java.base/share/classes/java/lang/String.java --- a/src/java.base/share/classes/java/lang/String.java Thu Mar 01 18:27:39 2018 +0000 +++ b/src/java.base/share/classes/java/lang/String.java Thu Mar 01 15:45:51 2018 -0400 @@ -2963,6 +2963,56 @@ */ public native String intern(); + /** + * Returns a string whose value is the concatenation of this + * string repeated {@code count} times. + *

+ * 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); + } + //////////////////////////////////////////////////////////////// /**