changeset 9949:09edbf07c17c

8231800: Better listing of arrays Reviewed-by: mbalao
author andrew
date Sun, 12 Jul 2020 23:11:42 +0100
parents 501a8850e941
children 0abf40ecd9c5
files src/share/classes/java/util/ArrayList.java src/share/classes/java/util/PriorityQueue.java src/share/classes/java/util/Vector.java src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java src/share/classes/java/util/concurrent/PriorityBlockingQueue.java
diffstat 5 files changed, 21 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/util/ArrayList.java	Mon Mar 02 19:11:29 2020 -0800
+++ b/src/share/classes/java/util/ArrayList.java	Sun Jul 12 23:11:42 2020 +0100
@@ -163,11 +163,13 @@
      * @throws NullPointerException if the specified collection is null
      */
     public ArrayList(Collection<? extends E> c) {
-        elementData = c.toArray();
-        size = elementData.length;
-        // c.toArray might (incorrectly) not return Object[] (see 6260652)
-        if (elementData.getClass() != Object[].class)
-            elementData = Arrays.copyOf(elementData, size, Object[].class);
+        Object[] a = c.toArray();
+        size = a.length;
+        if (c.getClass() == ArrayList.class) {
+          elementData = a;
+        } else {
+          elementData = Arrays.copyOf(a, size, Object[].class);
+        }
     }
 
     /**
--- a/src/share/classes/java/util/PriorityQueue.java	Mon Mar 02 19:11:29 2020 -0800
+++ b/src/share/classes/java/util/PriorityQueue.java	Sun Jul 12 23:11:42 2020 +0100
@@ -240,8 +240,7 @@
 
     private void initElementsFromCollection(Collection<? extends E> c) {
         Object[] a = c.toArray();
-        // If c.toArray incorrectly doesn't return Object[], copy it.
-        if (a.getClass() != Object[].class)
+        if (c.getClass() != ArrayList.class)
             a = Arrays.copyOf(a, a.length, Object[].class);
         int len = a.length;
         if (len == 1 || this.comparator != null)
--- a/src/share/classes/java/util/Vector.java	Mon Mar 02 19:11:29 2020 -0800
+++ b/src/share/classes/java/util/Vector.java	Sun Jul 12 23:11:42 2020 +0100
@@ -168,11 +168,13 @@
      * @since   1.2
      */
     public Vector(Collection<? extends E> c) {
-        elementData = c.toArray();
-        elementCount = elementData.length;
-        // c.toArray might (incorrectly) not return Object[] (see 6260652)
-        if (elementData.getClass() != Object[].class)
-            elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
+        Object[] a = c.toArray();
+        elementCount = a.length;
+        if (c.getClass() == ArrayList.class) {
+            elementData = a;
+        } else {
+            elementData = Arrays.copyOf(a, elementCount, Object[].class);
+        }
     }
 
     /**
--- a/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java	Mon Mar 02 19:11:29 2020 -0800
+++ b/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java	Sun Jul 12 23:11:42 2020 +0100
@@ -118,9 +118,8 @@
      */
     public CopyOnWriteArrayList(Collection<? extends E> c) {
         Object[] elements = c.toArray();
-        // c.toArray might (incorrectly) not return Object[] (see 6260652)
-        if (elements.getClass() != Object[].class)
-            elements = Arrays.copyOf(elements, elements.length, Object[].class);
+        if (c.getClass() != java.util.ArrayList.class)
+          elements = Arrays.copyOf(elements, elements.length, Object[].class);
         setArray(elements);
     }
 
@@ -721,6 +720,9 @@
      */
     public int addAllAbsent(Collection<? extends E> c) {
         Object[] cs = c.toArray();
+        if (c.getClass() != ArrayList.class) {
+            cs = cs.clone();
+        }
         if (cs.length == 0)
             return 0;
         Object[] uniq = new Object[cs.length];
--- a/src/share/classes/java/util/concurrent/PriorityBlockingQueue.java	Mon Mar 02 19:11:29 2020 -0800
+++ b/src/share/classes/java/util/concurrent/PriorityBlockingQueue.java	Sun Jul 12 23:11:42 2020 +0100
@@ -253,8 +253,7 @@
         }
         Object[] a = c.toArray();
         int n = a.length;
-        // If c.toArray incorrectly doesn't return Object[], copy it.
-        if (a.getClass() != Object[].class)
+        if (c.getClass() != java.util.ArrayList.class)
             a = Arrays.copyOf(a, n, Object[].class);
         if (screen && (n == 1 || this.comparator != null)) {
             for (int i = 0; i < n; ++i)