协慌网

登录 贡献 社区

将 ArrayList <String> 转换为 String [] 数组

我正在 android 环境中工作,并尝试了以下代码,但它似乎没有工作。

String [] stockArr = (String[]) stock_list.toArray();

如果我定义如下:

String [] stockArr = {"hello", "world"};

有用。有什么东西我不见了吗?

答案

像这样使用。

List<String> stockList = new ArrayList<String>();
stockList.add("stock1");
stockList.add("stock2");

String[] stockArr = new String[stockList.size()];
stockArr = stockList.toArray(stockArr);

for(String s : stockArr)
    System.out.println(s);

试试这个

String[] arr = list.toArray(new String[list.size()]);

发生的事情是stock_list.toArray()正在创建一个Object[]而不是String[] ,因此类型转换失败1

正确的代码是:

String [] stockArr = stockList.toArray(new String[stockList.size()]);

甚至

String [] stockArr = stockList.toArray(new String[0]);

有关更多详细信息,请参阅List.toArray的两个重载的List.toArray

后一版本使用零长度数组来确定结果数组的类型。 (令人惊讶的是,执行此操作要比预先分配... 至少对于最近的 Java 版本更快。有关详细信息,请参阅https://stackoverflow.com/a/4042464/139985 。)

从技术角度来看,这种 API 行为 / 设计的原因是List<T>.toArray()方法的实现没有<T>在运行时的信息。它只知道原始元素类型是Object 。相反,在另一种情况下,数组参数给出了数组的基本类型。 (如果提供的数组大到足以容纳列表元素,则使用它。否则将分配相同类型和更大大小的新数组并作为结果返回。)


1 - 在 Java 中, Object[]String[]赋值不兼容。如果是,那么你可以这样做:

Object[] objects = new Object[]{new Cat("fluffy")};
    Dog[] dogs = (Dog[]) objects;
    Dog d = dogs[0];     // Huh???

这显然是无稽之谈,这就是为什么数组类型通常不是赋值兼容的原因。