Java 的 JDK 8 和 JDK 9 及以上版本中,Stream 接口的 toArray 方法有一些细微的变化,主要体现在其签名和使用方式上。本文主要介绍Jdk 8中String[].class == Arrays.asList( “a”, “b”).toArray().getClass()结果为true,而Jdk 9及以上版本中为false的原因,以及两种Jdk版本中toArray()方法区别及用法。

1、Arrays.asList("a", "b").toArray()中toArray()方法对应的源代码

1)Jdk 8中toArray()代码

@Override
public Object[] toArray() {
    return a.clone();
}

2) Jdk 9以上版本中toArray()代码

@Override
public Object[] toArray() {
    return Arrays.copyOf(a, a.length, Object[].class);
}

2、Jdk 8和Jdk 9+中toArray()方法区别

String[].class == Arrays.asList("a", "b").toArray().getClass()

JDK 8的情况下它被克隆,它保留了它的数组类型(String[]),而在JDK 9+中它使用Arrays.copyOf显式的新数组类型复制为Object[]
所以在JDK 8Arrays.asList("a", "b").toArray().getClass()返回String[],并在JDK 9+中返回Object[],因此在JDK 9+中,String[].class == Arrays.asList("a", "b").toArray().getClass() 结果为false。

3、toArray()方法用法

public static void main(String[] args) {    
    List<String> list = new ArrayList<String>(); 
    list.add("1");  
    list.add("2");  
    String[] tt = (String[]) list.toArray(new String[0]);    
}