src/java.base/share/classes/java/lang/String.java
changeset 49109 f2804cb922ce
parent 48262 daf3b49f4839
child 49122 fc16b5f193c7
--- 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.
+     * <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);
+    }
+
     ////////////////////////////////////////////////////////////////
 
     /**