大家好,欢迎来到IT知识分享网。
一、集合转数组
【强制】使用集合转数组的方法,必须使用集合的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); }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/122431.html