文章目录
开发中不免碰到List与数组类型之间的相互转换,对此做出如下总结
一、ArrayList 转换为数组
方法一: 循环遍历
循环遍历,将 ArrayList 中的元素使用 get() 方法存入数组
package Packger;
import java.util.ArrayList;
import java.util.List;
public class Array_list {
public static void main(String[] args) {
// TODO Auto-generated method stub
List list=new ArrayList();
list.add("a");
list.add("b");
list.add("c");
int size=list.size(); // 获取 ArrayList 中元素的个数
String[] array=new String[size];
for(int i=0;i<list.size();i++){ // 循环遍历将 ArrayList 中的数组存入数组
array[i]=(String)list.get(i); // Returns the element at the specified position in this list.
}
for(int i=0;i<array.length;i++){ // 将数组循环遍历输出
System.out.println(array[i]);
}
}
}
正如上面所列举的,当要将ArrayList类型的数据转换为String[]的时候,必须对List类型进行遍历,其实没有这种必要,List提供给我们一个很好的方法解决List转换成为数组的问题,不防再看一个例子:
方法二:ArrayList 的 toArray() 方法(推荐)
ArrayList提供public T[] toArray(T[] a)方法返回一个按照正确的顺序包含此列表中所有元素的数组,返回数组的运行时类型就是指定数组的运行时类型。
package Packger;
import java.util.ArrayList;
import java.util.List;
public class Array_list_f {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
int size=list.size();
String[] array = (String[])list.toArray(new String[size]);
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
}
或者:al.stream().mapToInt(k -> k).toArray();
al.stream().mapToInt(k -> k).toArray()
ArrayList<Integer> al = new ArrayList<>();
al.add(1);
al.add(3);
al.add(5);
int[] arr = al.stream().mapToInt(k->k).toArray();
for(int a:arr)
System.out.print(a+" ");
二、数组转换为List
方法一:循环遍历
package Packger;
import java.util.ArrayList;
import java.util.List;
public class List_array {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] array=new String[3];
array[0]="a";
array[1]="b";
array[2]="c";
List<String> list=new ArrayList<String>();
for(int i=0;i<array.length;i++){
list.add(array[i]);
}
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
方法二:Arrays 对象的 asList() 方法
其实数组转换成为List的问题,Arrays对象也提供给我们 public static List asList(T… a) 供我们调用
用法一:
package Packger;
import java.util.Arrays;
import java.util.List;
public class List_array_f {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] array=new String[3];
array[0]="a";
array[1]="b";
array[2]="c";
List<String> list=Arrays.asList(array);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
asList方法返回一个受指定数组支持的固定大小的列表,此方法同 Collection.toArray 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。除此之外, 此方法还提供了一个创建固定长度的列表的便捷方法,该列表被初始化为包含多个元素:
package Packger;
import java.util.Arrays;
import java.util.List;
public class List_array_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = Arrays.asList("a","b","c");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
用法二:
这不是最好的,因为asList()返回的列表的大小是固定的。事实上,返回的列表不是java.util.ArrayList,而是定义在java.util.Arrays中一个私有静态类。我们知道ArrayList的实现本质上是一个数组,而asList()返回的列表是由原始数组支持的固定大小的列表。这种情况下,如果添加或删除列表中的元素,程序会抛出异常UnsupportedOperationException。
推荐:
ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array));
package Packger;
import java.util.ArrayList;
import java.util.Arrays;
public class List_array_3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] array=new String[3];
array[0]="a";
array[1]="b";
array[2]="c";
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(array));
for(int i=0;i<arrayList.size();i++){
System.out.println(arrayList.get(i));
}
}
}
ArrayList的构造方法
ArrayList(Collection < ? extends E > c) : 构造一个包含特定容器的元素的列表,并且根据容器迭代器的顺序返回。
所以构造方法所做的事情如下:
1.将容器c转换为一个数组
2.将数组拷贝到ArrayList中称为”elementData”的数组中
ArrayList的构造方法的源码如下:
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
参考博客: