在遇到一些奇奇怪怪的问题时,我总会上网查东西,经常查到大家的博客里,通过大家的帮助最后解决掉,所以我也打算将一些自己遇到并解决的问题,学到的新知识记录下来,记录自己的成长,同时也跟大家分享。
前两天遇到需要将数组转化成集合,在页面上使用freemaker的<#list>遍历的情况。当时使用Arrays.asList(),方法来转换,在页面显示的时候freemaker报出异常。
显然传到页面的集合中的元素不是int型,而是数组类型,然后我就用for each()解决了这个问题,今天又研究了一下这个问题,有所收获,便记录下来。
数组转集合有三种方法:
- Arrays.asList().
- Collections.addAll().
- for each().
我们分别来分析这三种方法:
1.Arrays.asList().
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* author T
* 2016/12/4
*/
public class ArrayToList {
public static void main(String[] args){
String[] strArr = {"1","2","3","4"};
List intList = Arrays.asList(strArr);
System.out.println(intList);
}
}
得到了我们预计的结果,集合中有四个元素,输出 [1, 2, 3, 4]。
接着我们使用之前出错的int型数组,观察输出结果。
输出结果是: [[I@5a1cfb56]
显然这是一个地址,因为intList中只有一个元素,这个元素是一个int类型的数组,所以输出了他引用的地址。
查看一下源码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
asList()方法的参数是一个泛型参数,所以他只能是引用类型(如果我们传入基本类型数据,它会自动变成对应的包装类型),int型是基本类型,int型数组是引用类型,所以这里传入的实参a是intArr这个数组,而不是1,2,3,4 这几个整数,所以返回的集合中的元素就是intArr这个数组。
想要返回[1, 2, 3, 4],我们要使用基本类型对应的包装类型
Integer[] intArr = {1,2,3,4};
List intList = Arrays.asList(intArr);
System.out.println(intList);
这样返回的就是我们想要的结果。
2.Collections.addAll().
这个方法跟Arrays.asList()方法分析起来一样,不再详述。
3.for each()
什么是for each。。。。