- 集合 ===> 数组
ArrayList<Integer> list = new ArrayList<>();
list.add(123);
list.add(456);
System.out.println(list);//[123, 456]
Object[] arr = list.toArray();
for (Object ele : arr) {
System.out.println(ele);
}
- 数组 ===> 集合
String[] strArr = {"abc", "def"};
List<String> strList = Arrays.asList(strArr);
System.out.println(strList);//[abc, def]
- 考题:下面语句打印结果是什么?
System.out.println(Arrays.asList(new Integer[]{11,22,33}));
System.out.println(Arrays.asList(new int[]{44,55,66}));
提示:数组工具类Arrays中有关的源码
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) {
a = Objects.requireNonNull(array);//如果array为null,则抛出NullPointerException异常
}
...
}
思
考
一
会
儿
,
再
看
打
印
结
果
:
[11, 22, 33]
[ [I@a57993 ]
你答对了吗?
解析:asList(T… a) 的参数是可变参数,可以放入一个参数,也可以放入一个数组,表示多个参数
T表示什么? 表示必须是引用类型
a表示什么? 表示引用类型对象
Arrays.asList(new Integer[]{11,22,33});
参数new Integer[ ]{11,22,33}
是一个数组,
它的样子其实是 Integer[ ] itrArr = {new Integer(11),new Integer(22),new Integer(33)}
也就是这个数组里面是3个Integer对象,数组长度为3。
asList()这个方法会把3个对象元素放进ArrayList集合中,ArrayList集合就有三个对象元素,因为对象元素是 Integer 包装类型,会自动拆箱为 int 类型,看起来简洁,所以打印结果就是[11, 22, 33]
Arrays.asList(new int[]{44,55,66});
参数new int[ ]{44,55,66}
是一个数组,
它的样子其实是int[] iArr = {44,55,66}
,也就是这个数组里面是3个int基本类型的数字,数组长度为3。
和上面的new Integer[]{44,55,66}
对比,人家new Integer[]{44,55,66}
数组元素是对象,而new int[]{44,55,66}
数组元素是基本类型,ArrayList集合里的元素需要的是对象元素,你是int基本类型,尽管可以装箱为Integer对象类型,但是把数组中的每个int类型元素都装箱,Java它可不会这么干,太麻烦太费时了!
接着想呀,int[ ]是引用类型,new int[ ]{44,55,66}
就是一个对象嘛,把这个对象放进ArrayList集合中太顺理成章了,ArrayList集合就你一个元素对象。因为引用类型的值就是内存地址,所以打印结果就是:[ [I@a57993 ]