Collection和数组虽然都能用于存储一序列数据,但它们的适用范围却不相同,当需要保存的数据长度不固定时,用Collection比较合适,而数组长度固定,适用于长度固定的数据。有时,我们需要它们相互转换,以满足不同的需求。
一、Collection转数组
有时为了限定对元素的操作,需要将Collection转换为数组,从而不让使用数据的对象随意改变原有结构。
Collection转数组需要用到java.util中的Arrays.asList()方法,用以下例子演示。
@Test
public void test01(){
Integer [] arr = {1,2,3};
//数组中保存的是引用型数据类型时,数组元素作为集合中的元素保存
List<Integer> list = Arrays.asList(arr);
System.out.println(list);
}
输出结果为:[1, 2, 3]
这个例子很简单,但是我们要注意下面的情形:
@Test
public void test02(){
int [] arr = {1,2,3};
//数组中保存的是基本数据类型时,数组会作为集合中的元素保存
List list = Arrays.asList(arr);
System.out.println(list);
}
输出结果为:[I@53fd8f9c
分析结果, [ 表明这是一维数组,I 则表示数组保存的是基本数据类型,所以list中只有一个元素,即一个一维数组。为什么会出现这种情况呢?由于泛型只支持引用型数据类型,而arr中的元素是基本数据类型,所以arr是作为一个引用保存进了list。
我们还需要注意的一个情况是,数组被转换为Collection后,不能使用Collection中的增加或删除类的方法,如add方法和remove方法.
@Test
public void test03(){
int [] arr = {1,2,3};
List list = Arrays.asList(arr);
list.add(1);
System.out.println(list);
}
以上代码运行后会出现 java.lang.UnsupportedOperationException 的错误,这是因为数组长度是固定的,不可能被list改变长度。
二、数组转Collection
数组转换为Collection之后,就可以使用Collection中的常用方法,非常方便,例如要查找数组中的某个元素,无需自己写一个遍历方法,只需调用Collection中的contains方法即可。
Collection中自带的toArray方法可以实现这一功能。
@Test
public void test04(){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Integer [] arr01 =new Integer[5];
Integer[] arr =list.toArray(arr01);
System.out.println(arr01);
System.out.println(arr);
}
输出结果为:
arr01[]-----[Ljava.lang.Integer;@5bb1ce68
arr[]-----[Ljava.lang.Integer;@5bb1ce68
这个结果不难理解,arr01和arr指向的都是同一个内存空间,但是如果我把数组arr01的长度 改为0会怎么样呢?
@Test
public void test04(){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Integer [] arr01 =new Integer[0];
Integer[] arr =list.toArray(arr01);
System.out.println("arr01[]-----"+arr01.toString()+" length==" + arr01.length);
System.out.println("arr[]-----"+arr.toString() + " length==" + arr.length);
}
输出结果为:
arr01[]-----[Ljava.lang.Integer;@206c4fe length==0
arr[]-----[Ljava.lang.Integer;@a6f00bc length==3
可以看出,arr01并没有保存list中的数据,因为虚拟机在发现arr01的长度低于list元素数量时,会new一个新的与之匹配长度的数组来保存数据。