一、数组转List
方式一
通过 Arrays.asList(strArray)
方式,将数组转换List
,但不能对List
增删,只能查改,否则抛异常,例子如下:
public static void main(String[] args) {
//创建一个字符串数组
String[] strArray = new String[]{"a","b","c"};
//数组转化成List
List<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.UnsupportedOperationException
at 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"};
//通过构造方法,将数组转化成List
List<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"};
//创建一个固定大小的List
List<String> strList = new ArrayList<String>(strArray.length);
//通过Collections类将数组转化成List
Collections.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) {
//创建一个List
List<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强制转换成String
String[] 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) {
//创建一个List
List<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 等技术知识。需要的小伙伴可以点击如下链接获取,资源地址:技术资料笔记。
不会有人刷到这里还想白嫖吧?点赞对我真的非常重要!在线求赞。加个关注我会非常感激!