java - 将字符串列表转换为字符串数组时的不同行为

标签 java arrays arraylist collections

我在使用 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 

最佳答案

ArrayListObject[] 支持。该数组的副本随 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/

相关文章:

java - CXF wsdl2java 导致 BINDING_MISSING_TYPE

java - 如何解决Apache jmeter安装错误?

java - 堆外缓存 DirectMemory 是否已准备好投入生产?活跃吗?

java - ArrayList 中的重复元素 (java)

java - 组合类中的属性

java - 数组列表和链表的区别

java - 如何创建在java中的另一个按钮上运行单击事件的按钮?

java - 为什么我不能在类之外的方法中使用数组?

java - 使用静态字典作为缓存可能会导致泄漏问题?

arrays - perl中的$ {…}到底是什么意思?