Java 在Set toArray()方法中需要新字符串[0]

Java 在Set toArray()方法中需要新字符串[0],java,set,Java,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); Set s=新的HashSet(Arrays.asList(“mango”、“guava”、“apple”); 字符串[]a

我正在尝试将集合转换为数组

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);
Set s=新的HashSet(Arrays.asList(“mango”、“guava”、“apple”);
字符串[]a=s.toArray(新字符串[0]);
for(字符串x:a)
系统输出println(x);
而且效果很好。但是我不明白
String[]a=s.toArray(新字符串[0])中
newstring[0]
的意义


我的意思是最初我尝试
String[]a=c.toArray(),但它不工作。为什么需要
新字符串[0]

如果数组足够大,则该数组将存储集合中的元素;否则,将为此目的分配相同运行时类型的新数组

,返回一个
对象[]
,该对象不能转换为
字符串[]
或任何其他类型的数组

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

如果您仔细阅读了实现代码(我从中发布代码),您就会清楚:

 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;
 }
public T[]toArray(T[]a){
如果(a.长度<尺寸)
//创建a的运行时类型的新数组,但我的内容:
return(T[])array.copyOf(elementData,size,a.getClass());
System.arraycopy(elementData,0,a,0,size);
如果(a.长度>尺寸)
a[size]=null;
返回a;
}

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

与问题无关,但我会使用
String[]A=s.toArray(新字符串[s.size()]),因此无需重新分配阵列大小。