作用:将列表List中的元素导出为数组
toArray()
toArray()方法导出的是Object[]
返回的数组是一个新数组,多次运行toArray方法会生成多个数组对象(存储的引用地址是不同的),但是这些数组中的内容是一样的。
toArray返回的数组是安全的,可以对生成的数组做任意的修改。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
Object[] objects1 = list.toArray();
Object[] objects2 = list.toArray();
System.out.println(objects1 == objects2);
// false 说明生成的数组对象是两个不同的,所以修改其中的一个数也不会影响另一个数组
}
toArray(T[] a)
toArray(T[] a)方法导出的是指定类型的数组
toArray(T[] a)使用了泛型参数,可以返回指定类型数组,但是这个泛型在确定的时候必须是list中元素类型的父类或本身。
如果传递进去的参数是一个空数组,那么toArray(T[] a)和toArray()相同。
List<String> list = new ArrayList<>();
String[] y = list.toArray(new String[0]);
通过源码我们可以看到,如果传递进来的数组a空间大于list的话,就不会直接生成一个新数组来装list原来的元素对象,而是直接往a中填,并且将最后一个设置为null,这样设置的目的是为了toArray(T[] a)方法调用者从返回的数组中检测到null时就知道后面已经没有list元素对象了。
补充:
Arrays.copyOf(elementData, size);
-
第一个参数是传入的元素数据,第二个参数是生成新的数组的长度。如果新数组的长度超过原有的数组的长度,则保留数组默认值。
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
-
用于复制指定的数组内容以达到扩容的目的,该方法对不同的基本数据类型都有对应的重载方法。
-
Array.copy方法返回的数组是新的数组对象,拷贝不会影响原来的数组。
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
System.arraycopy(Object src,int srcPos, Object dest, int destPos,int length);
- src:源对象,srcPos:源数组中的起始位置,dest:目标数组对象,destPos:目标数据中的起始位置,length:要拷贝的数组元素的数量。
总结
- toArray()方法是直接调用Arrays.copyOf()方法,将list中的元素对象的引用装在一个新的生成的数组中。
- toArray([] a)带有泛型,会返回指定泛型的数组对象,并且:如果a.length小于list元素个数,就直接调用copyOf()方法进行拷贝并且返回数组对象,新数组也是装list元素对象的引用。否则就先调用System.arrayCopy(),将list对象的引用装在a数组中,如果a数组还有剩余的空间,则将a[size]设置为null。