在Java编程中,集合和数组是我们常用的数据结构,它们各有优点,有时我们需要在两者之间进行转换。这篇文章将详细介绍如何在Java中将集合转换为数组,以及如何将数组转换为集合。
集合转数组
使用集合转数组的方法,必须使用集合的 toArray(T[] array)
,传入的是类型完全一致、长度为 0 的空数组。
toArray(T[] array)
方法的参数是一个泛型数组,如果 toArray
方法中没有传递任何参数的话返回的是 Object
类 型数组。
String [] s= new String[]{
"dog", "lazy", "a", "over", "jumps", "fox", "brown", "quick", "A"
};
List<String> list = Arrays.asList(s);
Collections.reverse(list);
//没有指定类型的话会报错
s=list.toArray(new String[0]);
由于 JVM 优化,new String[0]
作为Collection.toArray()
方法的参数现在使用更好,new String[0]
就是起一个模板的作用,指定了返回数组的类型,0 是为了节省空间,因为它只是为了说明返回的类型。
数组转集合
使用
Arrays.asList()
转数组的坑
使用工具类 Arrays.asList()
把数组转换成集合时,不能使用其修改集合相关的方法, 它的 add/remove/clear
方法会抛出 UnsupportedOperationException
异常。
1、Arrays.asList()
是泛型方法,传递的数组必须是对象数组,而不是基本类型。
int[] myArray = {1, 2, 3};
List myList = Arrays.asList(myArray);
System.out.println(myList.size());//1
System.out.println(myList.get(0));//数组地址值
System.out.println(myList.get(1));//报错:ArrayIndexOutOfBoundsException
int[] array = (int[]) myList.get(0);
System.out.println(array[0]);//1
当传入一个原生数据类型数组时,Arrays.asList()
的真正得到的参数就不是数组中的元素,而是数组对象本身!此时 List
的唯一元素就是这个数组。
所以要使用包装类数组
2、使用集合的修改方法: add()
、remove()
、clear()
会抛出异常。
在使用修改方法的时候,会抛出UnsupportedOperationException
异常。
原因:
Arrays.asList()
方法返回的并不是 java.util.ArrayList
,而是 java.util.Arrays
的一个内部类,这个内部类并没有实现集合的修改方法或者说并没有重写这些方法。
如何正确的将集合转换为数组呢?
1、手动实现工具类
遍历数组中的元素,将数组转换为集合。
2、使用Java 8中的stream(推荐使用)
Integer [] myArray = { 1, 2, 3 };
List myList = Arrays.stream(myArray).collect(Collectors.toList());
//基本类型也可以实现转换(依赖boxed的装箱操作)
int [] myArray2 = { 1, 2, 3 };
List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList());
3、使用 Guava
对于不可变集合,可以使用ImmutableList
类及其of
和copyOf
方法
List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
对于可变集合,使用Lists
类,及其NewArrayList
方法
List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
4、 使用Java 9的List.of()
方法
Integer[] array = {1, 2, 3};
List<Integer> list = List.of(array);
总的来说,集合和数组在Java中都是非常重要的数据结构,理解如何在两者之间进行转换是非常重要的。希望这篇文章能帮助你更好地理解和使用这两种数据结构。
如文章有任何问题,欢迎提出!
欢迎大家访问我的个人博客 无限进步的博客