数组和集合的相互转换那些事-看这一篇就够了

本文讲述了Java中集合转数组的正确方法,包括toArray的参数选择以及避免ClassCastException;并强调了Arrays.asList用于数组转集合时的局限性,指出其不支持修改操作。
摘要由CSDN通过智能技术生成

一、集合转数组

【强制】使用集合转数组的方法,必须使用集合的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);
}
  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值