一、数组转List
方式一
通过 Arrays.asList(strArray)
方式,将数组转换List
,但不能对List
增删,只能查改,否则抛异常,例子如下:
public static void main(String[] args) {//创建一个字符串数组String[] strArray = new String[]{"a","b","c"};//数组转化成ListList<String> strList = Arrays.asList(strArray);System.out.println("转化后的List:"+strList);//向List中添加内容strList.add("d");System.out.println(strList);
}
输出结果:
转化后的List:[a, b, c]
Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at com.example.container.d.TestList.main(TestList.java:16)
为什么会抛异常呢?
这是因为通过Arrays.asList(strArray)
,返回的对象是java.util.Arrays.ArrayList
,并非是java.util.ArrayList
,因为java.util.Arrays.ArrayList
并没有add()
、remove()
方法,所以调用add()
方法会报错!
方式二
既然java.util.Arrays.ArrayList
和java.util.ArrayList
不一样,那么就将java.util.Arrays.ArrayList
转为java.util.ArrayList
,方法如下:
public static void main(String[] args) {//创建一个字符串数组String[] strArray = new String[]{"a","b","c"};//通过构造方法,将数组转化成ListList<String> strList = new ArrayList<String>(Arrays.asList(strArray));System.out.println("转化后的List:"+strList);//向List中添加内容strList.add("d");System.out.println(strList);
}
输出结果:
转化后的List:[a, b, c]
[a, b, c, d]
此时就没啥问题了。
方式三(推荐使用)
除了方式二以外,还有一种方法,通过Collections.addAll()
进行操作,也如下:
public static void main(String[] args) {//创建一个字符串数组String[] strArray = new String[]{"a","b","c"};//创建一个固定大小的ListList<String> strList = new ArrayList<String>(strArray.length);//通过Collections类将数组转化成ListCollections.addAll(strList,strArray);System.out.println("转化后的List:"+strList);//向List中添加内容strList.add("d");System.out.println(strList);
}
输出结果:
转化后的List:[a, b, c]
[a, b, c, d]
打开Collections.addAll
底层源码,如下:
public static <T> boolean addAll(Collection<? super T> c, T... elements) {boolean result = false;for (T element : elements)result |= c.add(element);return result;
}
其实就是遍历数组,然后添加到集合中,最高效的一种方法,推荐使用!
方式四(推荐使用)
使用Stream
中的Collector
收集器来转化,需要jdk1.8支持,内容如下:
public static void main(String[] args) {//创建一个字符串数组String[] strArray = new String[]{"a","b","c"};//转换后的List 属于 java.util.ArrayList 能进行正常的增删查操作List<String> strList = Stream.of(strArray).collect(Collectors.toList());System.out.println("转化后的List:"+strList);//向List中添加内容strList.add("d");System.out.println(strList);
}
输出结果:
转化后的List:[a, b, c]
[a, b, c, d]
这种方式,也比较推荐,前提是jdk需要升级到1.8!
二、List转数组
方式一
使用list.toArray
不带参数的方法,转化后的返回值类型为Object
,如果强转会抛异常!
public static void main(String[] args) {//创建一个ListList<String> strList = new ArrayList<String>();strList.add("a");strList.add("b");strList.add("c");//将List转换成数组Object[] objArray = strList.toArray();System.out.println("objArray:" + JSONArray.toJSON(objArray));//将List强制转换成StringString[] strArray = (String[])strList.toArray();System.out.println("strArray:" + JSONArray.toJSON(strArray));
}
输出结果:
objArray:["a","b","c"]
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;at com.example.container.d.Test2List.main(Test2List.java:24)
使用ArrayList.toArray
不带参数的方法,默认返回的是Object
类型,如果强制转换会抛java.lang.ClassCastException
异常!
ArrayList.toArray()
,源码如下:
public Object[] toArray() {return Arrays.copyOf(elementData, size);
}
方式二(推荐使用)
使用list.toArray
带参数进行转换,内容如下:
public static void main(String[] args) {//创建一个ListList<String> strList = new ArrayList<String>();strList.add("a");strList.add("b");strList.add("c");//将List转换成String,指定返回数组类型并指定大小String[] strArray = strList.toArray(new String[strList.size()]);System.out.println("strArray:" + JSONArray.toJSON(strArray));
}
输出结果:
strArray:["a","b","c"]
ArrayList.toArray()
的带参方法,在创建数组的时候指定数组的长度,最好与集合size
保持一致,jdk 源码如下:
public <T> T[] toArray(T[] a) {if (a.length < size)// Make a new array of a's runtime type, but my contents:return (T[]) Arrays.copyOf(elementData, size, a.getClass());System.arraycopy(elementData, 0, a, 0, size);if (a.length > size)a[size] = null;return a;
}
三、写到最后
最近无意间获得一份阿里大佬写的技术笔记,内容涵盖 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多线程、JPA、MyBatis、MySQL 等技术知识。需要的小伙伴可以点击如下链接获取,资源地址:技术资料笔记。
不会有人刷到这里还想白嫖吧?点赞对我真的非常重要!在线求赞。加个关注我会非常感激!