ARTS Share2 java中的数组和list之间的转换

这篇文章来分享一下将java中的list转为数组或者将数组转为list的方法,对于集合List和数组在我们平常开发中会经常用到,频率挺高,算法中也是常用的数据结构,所以我们应该熟悉并掌握这两种数据结构以及相关的方法等。

1.将list转为数组,我们通常有两种办法:

//返回一个Object类型的数组
Object[] toArray()  
//返回一个类型为T的数组
T[] toArray(T[] array)

toArray(T [] array)方法接受并返回一个数组。 传入数组的主要目的是通知要返回的数组的类型:

示例代码:

List<Integer> list = Arrays.asList(1,2,3,4,5,6);
Object[] objects = list.toArray();
Integer[] integers = list.toArray(new Integer[list.size()]);
//length = 6
System.out.println(objects.length);
//length = 6
System.out.println(integers.length);
/**
 * 返回一个数组,该数组包含了这个list中的所有元素并且以合适的顺序存储,从第一个元素到最后一个元素。
 * 这个方法必须分配一个新的数组,即使列表由数组支持。因此调用者可以*修改返回的数组.
 * 这个方法就是数组和集合之间API的桥梁,可以进行转换。
 */
Object[] toArray();
T[] toArray(T[] array)
/**
 * (1)如果传入的数组有足够的空间,则元素存储在同一个数组中,并返回对该数组的引用;
 * (2)如果它的空间大于元素个数,则首先使用list的元素填充数组,最后将该数组的其余值填充为null;
 * (3)如果它没有足够的空间来存储元素,则会创建一个相同类型和足够大小的新数组,填充并返回。
 */
<T> T[] toArray(T[] a);

2.将数组转为List:

(1)采用传统的方法,将数组循环然后将数组的每个元素都add到list中,示例代码如下:

Integer[] arr = {1,2,3};
List<Integer> integerList = new ArrayList<>();
for(Integer i:arr){
    integerList.add(i);
}
//[1, 2, 3]
System.out.println(integerList);

(2)使用ArraysasList(T...a)方法

代码示例:

List<Integer> list = Arrays.asList(1,2,3,4,5,6);
//[1, 2, 3, 4, 5, 6]
System.out.println(list);

关于Arrays.asList方法的解释和使用注意点
https://blog.****.net/u012934325/article/details/88528582

(3)使用Collections.addAll(Collection<? super T> c, T... elements)将数组元素转为集合:
示例代码:

Integer[] arr1 = {1,2,3};
List<Integer> list1 = new ArrayList<>();
Collections.addAll(list1,arr1);
//[1, 2, 3]
System.out.println(list1);
@SafeVarargs
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
    boolean result = false;
    for (T element : elements)
        result |= c.add(element);
    return result;
}

上述源码,第一眼看,就是将数组循环,然后往集合c中添加每个数组元素。但是需要特别注意的是该方法中有一个boolean型的变量result,需要注意的是result |= c.add(element);,这条语句表示将c.add(element)的结果与result的值做或的计算,得到最后的答案,解释如下:

Integer[] a = {1,2};
List<Integer> list2 = new ArrayList<>();
boolean flag = false;
for(Integer num:a){
    flag |= list2.add(num);
    //1=====true
    //2=====true
    System.out.println(num + "=====" + flag);
}

这里有个思考,什么时间它result的值会是false,也就是说添加不成功的情况是什么?
解释如下:
如果要添加的所有元素都已经在Collection中(在调用addAll之前),并且Collection不允许重复,则它将返回false,因为所有单独的add方法调用都将返回false。 对于诸如Set之类的集合也是如此。
对于其他集合,add始终返回true,因此addAll将返回true,除非您使用要添加的空元素列表调用它。

(4)利用java8中的方法:

 Arrays.stream(a).collect(Collectors.toList()).stream().forEach(System.out::print);

以上就是我对于list和array之间的相互转化,所做的分享,希望各位可以提出其他更好的方法,一起来分享。

ARTS Share2 java中的数组和list之间的转换