如何正确的将数组转换为ArrayList?
常见方式:Arrays.asList()
Arrays.asList()
在平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合,就像:
@Test
public void testAsList() {
String[] strArrays = {"Apple", "Banana", "Orange"};
List<String> strList = Arrays.asList(strArrays);
strList.forEach(System.out::println);
//
List<String> str1List = Arrays.asList("Apple", "Banana", "Orange");
str1List.forEach(System.out::println);
}
asList() 存在的问题
但是使用Arrays.asList()
有个坑需要注意: 使用Arrays.asList()
把数组转成集合时,不能使用其修改集合相关方法,其add/remove/clear方法会抛出异常UnsupportedOperationException
:
@Test
public void testUpdateAsList() {
List<String> strList = Arrays.asList("Apple", "Banana", "Orange");
strList.forEach(System.out::println);
// 添加
strList.add("Grape");
System.out.println(strList);
}
结果:
那为什么会抛出异常UnsupportedOperationException
呢? 因为asList()
返回的对象是一个Arrays
内部类,这个内部类并没有实现集合的修改方法, 其源码:
我们再看一下java.util.AbstractList
的remove()
方法,这样我们就明白为什么会抛出UnsupportedOperationException
:
/**
* {@inheritDoc}
*
* <p>This implementation always throws an
* {@code UnsupportedOperationException}.
*
* @throws UnsupportedOperationException {@inheritDoc}
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E remove(int index) {
throw new UnsupportedOperationException();
}
那当我们需要将数组转成ArrayList
,并且后续需要对这个List进行修改,那该如何处理?
使用new ArrayList(最简便)
@Test
public void testNewList() {
String[] strArrays = {"Apple", "Banana", "Orange"};
List<String> stringList = new ArrayList<>(Arrays.asList(strArrays));
System.out.println(stringList);
stringList.add("Grape");
System.out.println(stringList);
}
使用 Java8 的Stream(推荐)
@Test
public void testStream() {
String[] strArrays = {"Apple", "Banana", "Orange"};
List<String> stringList = Arrays.stream(strArrays).collect(Collectors.toList());
System.out.println(stringList);
stringList.add("Grape");
System.out.println(stringList);
}
使用 Guava
对于可变集合,使用Lists
类及其newArrayList()
工厂方法
@Test
public void testGuava() {
// 1
List<String> strList1 = Lists.newArrayList("Apple", "Banana", "Orange");
System.out.println(strList1);
strList1.add("Grape");
// 2
String[] strArrays = {"Apple", "Banana", "Orange"};
List<String> strList2 = Lists.newArrayList(strArrays);
System.out.println(strList2);
strList2.add("Grape");
}
使用 Apache Commons Collections
@Test
public void testApacheCC() {
String[] strArrays = {"Apple", "Banana", "Orange"};
List<String> stringList = new ArrayList<>();
CollectionUtils.addAll(stringList, strArrays);
System.out.println(stringList);
stringList.add("Grape");
System.out.println(stringList);
}