首页 > 编程知识 正文

集合转换成数组,java字符串数组转换成字符串

时间:2023-05-05 14:03:25 阅读:18323 作者:4162

1 .从集合到类型匹配的数组的转换从集合到数组的转换方法必须使用集合的toarray[]array]方法,其中传递类型完全匹配且长度为0的空数组。

反例:

直接使用没有toArray参数的方法会有问题。 此方法的返回值只有Object[]类,如果用力旋转其他类型的数组,则会发生ClassCastException错误。

ListString list=new ArrayList (; list.add(aa ); list.add('bb ); list.add (抄送); //无引用的toArray (使用方法,默认返回类型为object [ ] object [ ] objects=list.to array );正例:

liststringlist=newArraylist(2; list.add('guan ); list.add('Bao ); string [ ] array=list.to array (new string [0] ); 说明:使用带toArray参数的方法指定数组空间大小的长度:

1 )为0,动态创建与size相同的数组性能最好。

2 )大于0但小于size时,重新建立大小等于size的数组,增加GC的负担。

3 )等于size,高并发时,序列完成后size增大时,负面影响与2相同。

4 )大于size、浪费空间且在size中插入null值时,有NPE的危险性

2 .转换为数组类型匹配的集合场景:当前有一个int [] arr,想转换为一个List。

//数组是类型一致的集合int [ ] arr1={ 1,2,3 }; //注意:此处直接传递int []数组,返回的列表的泛型参数为integerlistint [ ] list1=int (而不是arrays.as list (arr1) )。 integer [ ] arr2={ 1,2,3 }; //如果传递的参数类型为Integer,则返回泛型参数的是integerlistintegerlist2=arrays.as list (arr2);注意:

一个常见错误是使用Arrays.asList ) )传递到int []数组,由List Integer接收,并报告类型不匹配。

Arrays.asList的返回值:

如上所述,Arrays.asList ()返回List。 现在,当您尝试使用此列表在添加(或移除) )中操作时,发现报告了错误。

让我们看看Arrays.asList ()的源代码。

返回的ArrayList,但此ArrayList是Arrays的内部类,而不是java.util.ArrayList。

内部阵列列表结构:

可以看到,add ()、remove )和改变数据结构的两个方法都没有被重写。 因此,如果直接使用返回的List去add或remove,则实际上会调用AbstractList的add/remove方法,该方法是他的父类。

可见这里的实现直接抛出了异常!

总结:

Arrays.asList ()返回的实际上是不允许修改其结构的List(注: set(index,val )不是改变结构的方法。 当前,想对返回的List进行结构变更操作时,可以:

integer [ ] arr2={ 1,2,3 }; //如果传递的参数类型为Integer,则返回泛型参数的是integerlistintegerlist2=arrays.as list (arr2); 如果创建java.util包下的新List实现类,则listintegerlist=new ArrayList (list2); list.add(4; system.out.println (列表;注意:

请看下面代码的执行结果。

integer [ ] arr2={ 1,2,3 }; //如果传递的参数类型为Integer,则返回泛型参数的是integerlistintegerlist2=arrays.as list (arr2); list2. set (0,111; system.out.println(arr2[0]; arr2[1]=222; system.out.println (列表2;

OK,也就是说,返回的List使用与原始数组Integer [] arr2的基础相同的数据。 其实之前的源代码已经看到了这个:

可以看出,调用arrays.aslist(arr )后,在new内部的ArrayList的情况下,将数组arr直接代入内部变量E [] a,之后再调用get ) )时也是直接操作的该内部变量a。

3 .另一个“对于假列表”: publicstaticvoidmain (字符串[ ] args ) {列表integer list=new ArrayList ); list.add(0; list.add(1; list.add(2; list.add(3; list.add(4; //左闭右开的子listlistintegersub=list.sublist (1,3 ); system.out.println(sub; //out : [ 1,2 ] sub.add (555 ); system.out.println(sub; //out : [ 1,2,555 ] system.out.println (list ); //out : [ 0,1,2,555,3,4 ] list.add (666 ); system.out.println (列表; //out : [ 0,1,2,555,3,4,666 ]//发生快速故障的system.out.println(sub ); } List:subList ()返回List。

此List的实际类型是ArrayList的内部类:

因为此类是AbstractList的子类,也是实现add/remove方法的List的实现类,所以可以调用add/remove方法。 *但是,**add和remove的实现逻辑与ArrayList不同,从上面的测试示例和源代码说明中可以看到,返回的SubList与父List共享基础存储数组,因此修改了SubList的结构

另外:

list.add(666; system.out.println (列表; //out : [ 0,1,2,555,3,4,666 ]//发生快速故障的system.out.println(sub ); 对父List进行结构修正后,再次访问SubList时,会发生快速故障。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。