OneMoreError
OneMoreError

Reputation: 7738

Need for new String[0] in the Set toArray() method

I am trying to convert a Set to an Array.

Set<String> s = new HashSet<String>(Arrays.asList("mango","guava","apple"));
String[] a = s.toArray(new String[0]);
for(String x:a)
      System.out.println(x);

And it works fine. But I don't understand the significance of new String[0] in String[] a = s.toArray(new String[0]);.

I mean initially I was trying String[] a = c.toArray();, but it wan't working. Why is the need for new String[0].

Upvotes: 4

Views: 3847

Answers (3)

Sreemoyee
Sreemoyee

Reputation: 1

.toArray(new String[0]) converts the collection elements to an array of Strings. new String[0] is given to indicate the type of the array, not to indicate the size of the collection. The toArray() method allocates a new in-memory array with a length equal to the size of the collection. Internally, it invokes the Arrays.copyOf on the underlying array backing the collection. ref: https://www.baeldung.com/java-collection-toarray-methods

Upvotes: 0

AllTooSir
AllTooSir

Reputation: 49432

It is the array into which the elements of the Set are to be stored, if it is big enough; otherwise, a new array of the same runtime type is allocated for this purpose.

Object[] toArray(), returns an Object[] which cannot be cast to String[] or any other type array.

T[] toArray(T[] a) , returns an array containing all of the elements in this set; the runtime type of the returned array is that of the specified array. If the set fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this set.

If you go through the implementing code (I'm posting the code from OpenJDK) , it will be clear for you :

 public <T> T[] toArray(T[] a) {
     if (a.length < size)
     // Make a new array of a's runtime type, but my contents:
     return (T[]) Arrays.copyOf(elementData, size, a.getClass());
     System.arraycopy(elementData, 0, a, 0, size);
     if (a.length > size)
         a[size] = null;
    return a;
 }

Upvotes: 10

Michael Aaron Safyan
Michael Aaron Safyan

Reputation: 95639

The parameter is a result of one of the many well-known limitations in the Java generics system. Basically, the parameter is needed in order to be able to return an array of the correct type.

Upvotes: 5

Related Questions