gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:38:10 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com