这篇文章来分享一下将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)使用Arrays
的asList(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.csdn.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之间的相互转化,所做的分享,希望各位可以提出其他更好的方法,一起来分享。