Hello,

in JDK code base we have many places (mainly in j.u.Arrays) where we convert 
array to String using verbose constructions with StringBuilder.

As far as we have got StringJoiner for a long time we can use it making the 
code more simple.

Also toString() of AtomicIntegerArray, AtomicLongArray and AtomicReferenceArray 
partially duplicate logic of corresponding method available in j.u.Arrays and 
can be replaced with call to delegate.

With kind regards,
Sergey Tsypanov
diff --git a/src/java.base/share/classes/java/util/Arrays.java b/src/java.base/share/classes/java/util/Arrays.java
--- a/src/java.base/share/classes/java/util/Arrays.java
+++ b/src/java.base/share/classes/java/util/Arrays.java
@@ -4879,18 +4879,14 @@
     public static String toString(long[] a) {
         if (a == null)
             return "null";
-        int iMax = a.length - 1;
-        if (iMax == -1)
+        if (a.length == 0)
             return "[]";
 
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(a[i]);
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(", ");
+        StringJoiner joiner = new StringJoiner(", ", "[", "]");
+        for (long l : a) {
+            joiner.add(Long.toString(l));
         }
+        return joiner.toString();
     }
 
     /**
@@ -4909,18 +4905,14 @@
     public static String toString(int[] a) {
         if (a == null)
             return "null";
-        int iMax = a.length - 1;
-        if (iMax == -1)
+        if (a.length == 0)
             return "[]";
 
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(a[i]);
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(", ");
+        StringJoiner joiner = new StringJoiner(", ", "[", "]");
+        for (int i : a) {
+            joiner.add(Integer.toString(i));
         }
+        return joiner.toString();
     }
 
     /**
@@ -4939,18 +4931,14 @@
     public static String toString(short[] a) {
         if (a == null)
             return "null";
-        int iMax = a.length - 1;
-        if (iMax == -1)
+        if (a.length == 0)
             return "[]";
 
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(a[i]);
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(", ");
+        StringJoiner joiner = new StringJoiner(", ", "[", "]");
+        for (short s : a) {
+            joiner.add(Short.toString(s));
         }
+        return joiner.toString();
     }
 
     /**
@@ -4969,18 +4957,14 @@
     public static String toString(char[] a) {
         if (a == null)
             return "null";
-        int iMax = a.length - 1;
-        if (iMax == -1)
+        if (a.length == 0)
             return "[]";
 
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(a[i]);
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(", ");
+        StringJoiner joiner = new StringJoiner(", ", "[", "]");
+        for (char c : a) {
+            joiner.add(String.valueOf(c));
         }
+        return joiner.toString();
     }
 
     /**
@@ -4999,18 +4983,14 @@
     public static String toString(byte[] a) {
         if (a == null)
             return "null";
-        int iMax = a.length - 1;
-        if (iMax == -1)
+        if (a.length == 0)
             return "[]";
 
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(a[i]);
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(", ");
+        StringJoiner joiner = new StringJoiner(", ", "[", "]");
+        for (byte b : a) {
+            joiner.add(Byte.toString(b));
         }
+        return joiner.toString();
     }
 
     /**
@@ -5029,18 +5009,14 @@
     public static String toString(boolean[] a) {
         if (a == null)
             return "null";
-        int iMax = a.length - 1;
-        if (iMax == -1)
+        if (a.length == 0)
             return "[]";
 
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(a[i]);
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(", ");
+        StringJoiner joiner = new StringJoiner(", ", "[", "]");
+        for (boolean b : a) {
+            joiner.add(Boolean.toString(b));
         }
+        return joiner.toString();
     }
 
     /**
@@ -5059,19 +5035,14 @@
     public static String toString(float[] a) {
         if (a == null)
             return "null";
-
-        int iMax = a.length - 1;
-        if (iMax == -1)
+        if (a.length == 0)
             return "[]";
 
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(a[i]);
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(", ");
+        StringJoiner joiner = new StringJoiner(", ", "[", "]");
+        for (float f : a) {
+            joiner.add(Float.toString(f));
         }
+        return joiner.toString();
     }
 
     /**
@@ -5090,18 +5061,14 @@
     public static String toString(double[] a) {
         if (a == null)
             return "null";
-        int iMax = a.length - 1;
-        if (iMax == -1)
+        if (a.length == 0)
             return "[]";
 
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(a[i]);
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(", ");
+        StringJoiner joiner = new StringJoiner(", ", "[", "]");
+        for (double d : a) {
+            joiner.add(Double.toString(d));
         }
+        return joiner.toString();
     }
 
     /**
@@ -5123,19 +5090,14 @@
     public static String toString(Object[] a) {
         if (a == null)
             return "null";
-
-        int iMax = a.length - 1;
-        if (iMax == -1)
+        if (a.length == 0)
             return "[]";
 
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(String.valueOf(a[i]));
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(", ");
+        StringJoiner joiner = new StringJoiner(", ", "[", "]");
+        for (Object o : a) {
+            joiner.add(String.valueOf(o));
         }
+        return joiner.toString();
     }
 
     /**
@@ -5295,7 +5257,7 @@
      */
     public static <T> void parallelSetAll(T[] array, IntFunction<? extends T> generator) {
         Objects.requireNonNull(generator);
-        IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.apply(i); });
+        IntStream.range(0, array.length).parallel().forEach(i -> array[i] = generator.apply(i));
     }
 
     /**
@@ -5350,7 +5312,7 @@
      */
     public static void parallelSetAll(int[] array, IntUnaryOperator generator) {
         Objects.requireNonNull(generator);
-        IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.applyAsInt(i); });
+        IntStream.range(0, array.length).parallel().forEach(i -> array[i] = generator.applyAsInt(i));
     }
 
     /**
@@ -5405,7 +5367,7 @@
      */
     public static void parallelSetAll(long[] array, IntToLongFunction generator) {
         Objects.requireNonNull(generator);
-        IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.applyAsLong(i); });
+        IntStream.range(0, array.length).parallel().forEach(i -> array[i] = generator.applyAsLong(i));
     }
 
     /**
@@ -5460,7 +5422,7 @@
      */
     public static void parallelSetAll(double[] array, IntToDoubleFunction generator) {
         Objects.requireNonNull(generator);
-        IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.applyAsDouble(i); });
+        IntStream.range(0, array.length).parallel().forEach(i -> array[i] = generator.applyAsDouble(i));
     }
 
     /**
diff --git a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicIntegerArray.java b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicIntegerArray.java
--- a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicIntegerArray.java
+++ b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicIntegerArray.java
@@ -37,6 +37,8 @@
 
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.VarHandle;
+import java.util.Arrays;
+import java.util.StringJoiner;
 import java.util.function.IntBinaryOperator;
 import java.util.function.IntUnaryOperator;
 
@@ -370,18 +372,7 @@
      * @return the String representation of the current values of array
      */
     public String toString() {
-        int iMax = array.length - 1;
-        if (iMax == -1)
-            return "[]";
-
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(get(i));
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(',').append(' ');
-        }
+        return Arrays.toString(array);
     }
 
     // jdk9
diff --git a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicLongArray.java b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicLongArray.java
--- a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicLongArray.java
+++ b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicLongArray.java
@@ -37,6 +37,8 @@
 
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.VarHandle;
+import java.util.Arrays;
+import java.util.StringJoiner;
 import java.util.function.LongBinaryOperator;
 import java.util.function.LongUnaryOperator;
 
@@ -370,18 +372,7 @@
      * @return the String representation of the current values of array
      */
     public String toString() {
-        int iMax = array.length - 1;
-        if (iMax == -1)
-            return "[]";
-
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(get(i));
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(',').append(' ');
-        }
+        return Arrays.toString(array);
     }
 
     // jdk9
diff --git a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReferenceArray.java b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReferenceArray.java
--- a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReferenceArray.java
+++ b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReferenceArray.java
@@ -40,6 +40,7 @@
 import java.lang.reflect.Array;
 import java.lang.reflect.Field;
 import java.util.Arrays;
+import java.util.StringJoiner;
 import java.util.function.BinaryOperator;
 import java.util.function.UnaryOperator;
 
@@ -300,18 +301,7 @@
      * @return the String representation of the current values of array
      */
     public String toString() {
-        int iMax = array.length - 1;
-        if (iMax == -1)
-            return "[]";
-
-        StringBuilder b = new StringBuilder();
-        b.append('[');
-        for (int i = 0; ; i++) {
-            b.append(get(i));
-            if (i == iMax)
-                return b.append(']').toString();
-            b.append(',').append(' ');
-        }
+        return Arrays.toString(array);
     }
 
     /**
diff --git a/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java b/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java
--- a/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java
+++ b/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java
@@ -309,12 +309,10 @@
      * of an annotation.
      */
     private static String toSourceString(String s) {
-        StringBuilder sb = new StringBuilder();
-        sb.append('"');
+        StringJoiner sb = new StringJoiner("", "\"", "\"");
         for (int i = 0; i < s.length(); i++) {
-            sb.append(quote(s.charAt(i)));
+            sb.add(quote(s.charAt(i)));
         }
-        sb.append('"');
         return sb.toString();
     }
 
diff --git a/src/java.base/share/classes/sun/security/pkcs/SigningCertificateInfo.java b/src/java.base/share/classes/sun/security/pkcs/SigningCertificateInfo.java
--- a/src/java.base/share/classes/sun/security/pkcs/SigningCertificateInfo.java
+++ b/src/java.base/share/classes/sun/security/pkcs/SigningCertificateInfo.java
@@ -26,10 +26,9 @@
 package sun.security.pkcs;
 
 import java.io.IOException;
-import java.util.ArrayList;
+import java.util.StringJoiner;
 
 import sun.security.util.HexDumpEncoder;
-import sun.security.util.DerInputStream;
 import sun.security.util.DerValue;
 import sun.security.x509.GeneralNames;
 import sun.security.x509.SerialNumber;
@@ -92,14 +91,10 @@
     }
 
     public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("[\n");
-        for (int i = 0; i < certId.length; i++) {
-            sb.append(certId[i].toString());
+        StringJoiner sb = new StringJoiner("", "[\n", "\n]");
+        for (ESSCertId essCertId : certId) {
+            sb.add(essCertId.toString());
         }
-        // format policies as a string
-        sb.append("\n]");
-
         return sb.toString();
     }
 

Reply via email to