关于Java.util包中的Arrays的源码探索

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作为条件传入

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章