List<Integer> list = Arrays.asList(1,2,3); Integer[] array =new Integer[1];//长度为1 <list.size Integer[] integers = list.toArray(array); System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(integers)); System.out.println(array == integers); Integer[] is = new Integer[]{1}; Integer[] is1 = new Integer[]{1}; System.out.println(is == is1);
输出结果:
[null]
[1, 2, 3]
false
false
List<Integer> list = Arrays.asList(1,2,3); Integer[] array =new Integer[4];//长度4 >list.size Integer[] integers = list.toArray(array); System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(integers)); System.out.println(array == integers);//这一行,实际上证明了,参数array,和copy方法返回的数组引用指向的是同一个数组对象。内存地址相同。
输出结果:
[1, 2, 3, null]
[1, 2, 3, null]
true
false
以上是我编写的代码测试
通过源码可以看出来,toarray()是直接返回object数组,但是不能强转成我们要的类型:
这样写是错的,Integer[] ins = (Integer[])toarray();
我们可以使用
<T> T[] toArray(T[] a);指定类型
源码显示,如果指定的数组长度小于list.size,直接返回一个list对应的类型的,长度为size,元素为list元素的新的copy,实际上就是原封不动的产生了一个新的数组,只不过比toarray()多了类型,不是object[]
如果指定的数组长度>list.size 那么,源码显示 调用的是
System.arraycopy(elementData, 0, a, 0, size);//调用system.arraycopy进行复制,源码注释可以看出每个参数的意思,分别是原始数据,copy的起始位置,新的数组,copy开始的位置,总共copy的长度 if (a.length > size) a[size] = null;//数组长度4,list.size=3,数组还有位置,多出来的位置往后都赋值为null,并返回这个数组 return a;//返回数组对象的地址引用
除此之外,Arrays里面还有很多实用的方法,sort方法重载(可以自定义排序规则),asList转集合
除此之外,java.util里面还有很多的实用类,包括function包下面的consumer,用于lambada方法
Consumer<Integer> consumer = x->{ System.out.println(x); // if(x>2){ 做一些操作 //list2.add(x);// // } }; list.forEach(consumer);//这里相当与把for循环里做的判断和一些操作全部放入consumer,然后consumer作为条件传入