我在使用 Java 开发 Collection 框架时遇到了一个奇怪的问题。 我在 ArrayList 的帮助下制作了 2 个字符串列表 1,而第二个是使用 Arrays.asList(T ...) 制作的。
创建这两个列表后,我尝试使用 list.toArray() 将这些列表转换为字符串数组,
因为 list.toArray() 方法调用返回一个对象数组,所以我不得不显式转换为 String[]。
转换后发生了一些奇怪的行为:
案例#1:(其中列表是使用 ArrayList 创建的),运行时异常为 java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 [Ljava.lang.String;
案例 2:(使用 Arrays.asList(T ... ) 创建的列表)运行良好。
这是代码
String [] str = null ,str1 = null ;
List<String> list = new ArrayList<String>();
list.add("a");
List<String> list1 = Arrays.asList("a");
str = (String[]) list.toArray(); // Runtime Exception
str1 = (String[]) list1.toArray(); // Runs Fine
最佳答案
安ArrayList
由 Object[]
支持。该数组的副本随 toArray()
一起返回。
Returns an array containing all of the elements in this list in proper sequence (from first to last element).
它不保证返回的数组类型。但是我们从异常消息中知道这一点。如果您希望它返回 String[]
,请使用为此提供的重载方法。
str = list.toArray(new String[0]);
类型转换变得不必要了。
Arrays.asList
返回的List
实现维护对作为其变量 arity 参数传递的数组(隐式或显式)的引用。
Returns a fixed-size list backed by the specified array.
调用
List<String> list1 = Arrays.asList("a");
创建一个 String[]
并将其作为参数传递给 asList
。 API 文档并未明确指定这一点,但支持 似乎表明它将返回相同的数组。 (查看实现,它返回一个克隆。)由于它是一个 String[]
,因此在将其转换并分配给该类型的变量时没有错误。
在这两种情况下,适当的解决方案是使用重载的 List#toArray(T[])
.
为了好玩,运行以下命令并检查返回的数组类型。
List<String> list1 = (List) Arrays.<Object> asList("a");
System.out.println(list1.toArray().getClass());
不要做假设。始终依赖 API 文档。如果不清楚,请尝试找到更好的解决方案。
关于java - 将字符串列表转换为字符串数组时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38020766/