一、集合转数组
【强制】使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一致、长度为0的空数组。
反例:直接使用toArrary无参方法存在问题,此方法返回值只能是Object如类,若强转其它类型数组将出现ClassCastException错误。
正例:
List<String>list=new ArrayList<>(2)
list.add("guan");
list.add("bao");
String[]array = list.toArray(new String [0]);
说明:使用toArray带参方法,数组空间大小的length:
1)等于0,动态创建与size相同的数组,性能最好。
2)大于0但小于size,重新创建大小等于size的数组,增加GC负担。
3)等于siz,在高并发情况下,数组创建完成之后,size正在变大的情况下,负面影响与2相同。
4)大于size, 空间浪费,且在size处插入null值,存在NPE隐患。
二、数组转集合
【强制】使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。原因是返回的返回的是 Arrays.ArrayList 内部类,继承的AbstractList 它的add/remove/clear方法会抛异常。 Arrays.asList() 体现的是适配器模式,只是转换接口,后台的数据仍然是数组。
正确写法的代码
// 集合转为数组
@Test
public void toArray() {
List<String> list = new ArrayList<>(2);
list.add("2");
list.add("1");
System.out.println(list);
/**
*
* list.toArray() 不传参数
* Object[] array = list.toArray();
* String[] array = (String[]) list.toArray();
* java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
*/
Object[] array = list.toArray();
System.out.println(array);
for (Object s : array) {
System.out.println(s);
}
//集合转为数组的正确写法
String[] arrayStr = list.toArray(new String[0]);
System.out.println(arrayStr);
for (String s : arrayStr) {
System.out.println(s);
}//for循环打印可以用这个打印 System.out.println(Arrays.toString(arrayStr));
}
//数组转为集合 Arrays.asList()把数组转换成集合 它的add/remove/clear方法会抛出UnsupportedOperationException异常
@Test
public void testAsList() {
Long[] longs = {12L, 13L, 1L, 23L};
List<Long> arraysList = Arrays.asList(longs);
System.out.println(arraysList); //[12, 13, 1, 23]
longs[0] = 1L; //操作原数组依然能改变list的值, 本质上还是那个数组
System.out.println(arraysList);
arraysList.add(4L); //java.lang.UnsupportedOperationException
System.out.println(arraysList);
}
/**
* 数组to集合的正确写法
* 用方法二的构造方法或方法三
*/
@Test
public void array2list() {
// 方法一:遍历数组,将数组元素添加到List集合中
Integer[] array = {1,2,3,4,5};
System.out.println(Arrays.toString(array));
List<Integer> list = new ArrayList<>();
for (Integer a : array) {
list.add(a);
}
list.add(3);//对集合add操作
System.out.println("list" + list);
//方法二:使用数组工具类的asList()方法
//该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean)
//此种方法转化而来的List集合不支持add和remove方法,会报错,集合和数组一方更新 另一方也是同步改变
List<Integer> originalArray = Arrays.asList(array);
List<Integer> list1 = new ArrayList<>();
list1.addAll(originalArray);
list1.add(3);
System.out.println("list1" + list1);
List<Integer> list2 = new ArrayList<>(originalArray); //构造方法
list2.add(3);
System.out.println("list2" + list2);
//方法三:使用Collections.addAll()方法
List<Integer> list3 = new ArrayList<>();
Collections.addAll(list3, array);
list3.add(3);
System.out.println("list3" + list3);
//方法四:使用java9的新方法List.of()
//此方法为 Java9新增方法,定义在List接口内,并且为静态方法,故可以由类名直接调用
//List<String> resultList = List.of(array);
}