在Set toArray()方法中需要新的String [0]

时间:2013-05-09 10:26:38

标签: java set

我正在尝试将Set转换为数组。

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);

它工作正常。但我不理解new String[0]String[] a = s.toArray(new String[0]);的重要性。

我的意思是最初我正在尝试String[] a = c.toArray();,但它无法正常工作。为什么需要new String[0]

2 个答案:

答案 0 :(得分:9)

如果它足够大,它就是要存储Set元素的数组;否则,为此目的分配一个相同运行时类型的新数组。

Object[] toArray(),返回无法转换为Object[]或任何其他类型数组的String[]

T[] toArray(T[] a)返回一个包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果集合适合指定的数组,则返回其中。否则,将使用指定数组的运行时类型和此set的大小分配新数组。

如果您查看实施代码(我是从OpenJDK发布代码),那么您将会很清楚:

 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;
 }

答案 1 :(得分:5)

该参数是Java泛型系统中许多众所周知的限制之一的结果。基本上,需要该参数才能返回正确类型的数组。