ChatGPT解决这个技术问题 Extra ChatGPT

在Java中将列表转换为数组[重复]

这个问题在这里已经有了答案:Converting 'ArrayList to 'String[]' in Java (16 answers) Closed 3 years ago。

如何在 Java 中将 List 转换为 Array

检查下面的代码:

ArrayList<Tienda> tiendas;
List<Tienda> tiendasList; 
tiendas = new ArrayList<Tienda>();

Resources res = this.getBaseContext().getResources();
XMLParser saxparser =  new XMLParser(marca,res);

tiendasList = saxparser.parse(marca,res);
tiendas = tiendasList.toArray();

this.adaptador = new adaptadorMarca(this, R.layout.filamarca, tiendas);
setListAdapter(this.adaptador);  

我需要用 tiendasList 的值填充数组 tiendas

ArrayList 不是数组。 Tienda[] 将是一个数组。

E
Eng.Fouad

任何一个:

Foo[] array = list.toArray(new Foo[0]);

或者:

Foo[] array = new Foo[list.size()];
list.toArray(array); // fill the array

请注意,这仅适用于引用类型的数组。对于原始类型的数组,使用传统方式:

List<Integer> list = ...;
int[] array = new int[list.size()];
for(int i = 0; i < list.size(); i++) array[i] = list.get(i);

更新:

现在建议使用 list.toArray(new Foo[0]);,而不是 list.toArray(new Foo[list.size()]);

来自 JetBrains Intellij Idea 检查:

将集合转换为数组有两种方式:使用预先确定大小的数组(如 c.toArray(new String[c.size()]))或使用空数组(如 c.toArray(new String[ 0]). 在较旧的 Java 版本中,建议使用预先确定大小的数组,因为创建适当大小的数组所必需的反射调用非常慢。但是,由于 OpenJDK 6 的更新较晚,这个调用被内化了,使得与预调整大小的版本相比,空数组版本相同,有时甚至更好。此外,传递预调整大小的数组对于并发或同步收集是危险的,因为在 size 和 toArray 调用之间可能存在数据竞争,这可能会导致额外的如果集合在操作期间同时收缩,则数组末尾的空值。此检查允许遵循统一的样式:使用空数组(在现代 Java 中推荐)或使用预先确定大小的数组(可能在较旧的 Java 版本或非 HotSpot 中更快基于 JVM)。


对于第一种形式,我更喜欢 list.toArray(new Foo[0]),因为这清楚地表明参数仅用于类型信息,大小无关紧要。
@MarcusJuniusBrutus 不,你错了。如果您使用的是 new Foo[0],那么您正在创建一个额外的无用数组。检查源代码以进行验证。
为什么它不只是 Foo[] array = list.toArray(); 超出了我的范围。
@Diederik 因为 list.toArray() 返回 Object[] 而不是 Foo[]
@Diederik 不幸的是,Java 的泛型集合与其非泛型集合共享类的副作用。 Collection.toArray() 早在 Java 1.0 或 1.1 中就被定义为返回 Object[],现在更改它为时已晚。 Kinda 让我希望 Java 使用不同的泛型集合,例如 .NET,以避免这种疯狂。
J
Jacob van Lingen

Java 8 中的替代方案:

String[] strings = list.stream().toArray(String[]::new);

从 Java 11 开始:

String[] strings = list.toArray(String[]::new);

但是在这种特殊情况下使用 Stream 更好吗?
此问题已标记为 android,也许您想在 stackoverflow.com/questions/4042434/… 中写下纯 java 问题的答案
@PhoneixS 与 gradle-retrolambda 现在可以使用 java 8 功能。
在 C# 中:list.ToArray(); //没有更多评论:/
比 Java 8 之前的解决方案更详细。伤心。
O
Ondrej Slinták

我认为这是最简单的方法:

Foo[] array = list.toArray(new Foo[0]);

也许设置正确的数组大小,正如您显然知道的那样
如果这是预期的样式,则无需设置数组的大小。 toArray(T[] a) 的文档:If the list fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this list.
@苏张If the list fits in the specified array。确保列表不适合传递的数组 new Foo[0](除非列表本身为空),并且将创建一个新数组来保存列表项。您只是传递数组的类型(而对象本身是无用的)。
@Eng.Fouad 我应该明确表示我正在回复 Oskar Kjellin:P
如果传入的数组太小,则 toArray() 方法必须使用反射构造一个正确大小的新数组。与传递至少与集合本身大小相同的数组相比,这具有明显更差的性能。资料来源:Intellij 的检查:git.jetbrains.org/?p=idea/community.git;a=blob;f=plugins/…
p
pandre

在没有 Java 8 的情况下,我想到的最好的事情是:

public static <T> T[] toArray(List<T> list, Class<T> objectClass) {
    if (list == null) {
        return null;
    }

    T[] listAsArray = (T[]) Array.newInstance(objectClass, list.size());
    list.toArray(listAsArray);
    return listAsArray;
}

如果有人有更好的方法,请分享:)


A
Armed10

我遇到了解决它的代码片段。

//Creating a sample ArrayList 
List<Long> list = new ArrayList<Long>();

//Adding some long type values
list.add(100l);
list.add(200l);
list.add(300l);

//Converting the ArrayList to a Long
Long[] array = (Long[]) list.toArray(new Long[list.size()]);

//Printing the results
System.out.println(array[0] + " " + array[1] + " " + array[2]);

转换工作如下:

它创建一个新的 Long 数组,其大小与原始列表相同 它使用新创建的数组将原始 ArrayList 转换为一个数组 它将该数组转换为一个 Long 数组 (Long[]),我将其命名为“array”


在没有任何代码注释或解释的情况下发布其他人的代码并不是一个非常有说服力的答案(但不是-1,因为它在技术上是正确的)。
但是,您的评论无论如何都会导致其他人对我的回答投反对票。
虽然在技术上是正确的,但这个解决方案是多余的;您需要 (Long[]) 强制转换或 toArraynew Long[list.size()] 参数,但不能同时使用!
J
John S.

这是作品。有点儿。

public static Object[] toArray(List<?> a) {
    Object[] arr = new Object[a.size()];
    for (int i = 0; i < a.size(); i++)
        arr[i] = a.get(i);
    return arr;
}

然后是主要方法。

public static void main(String[] args) {
    List<String> list = new ArrayList<String>() {{
        add("hello");
        add("world");
    }};
    Object[] arr = toArray(list);
    System.out.println(arr[0]);
}

H
Hans

对于 ArrayList,以下工作:

ArrayList<Foo> list = new ArrayList<Foo>();

//... add values

Foo[] resultArray = new Foo[list.size()];
resultArray = list.toArray(resultArray);

S
Sk93

取自此页面的示例:http://www.java-examples.com/copy-all-elements-java-arraylist-object-array-example

import java.util.ArrayList;

public class CopyElementsOfArrayListToArrayExample {

  public static void main(String[] args) {
    //create an ArrayList object
    ArrayList arrayList = new ArrayList();

    //Add elements to ArrayList
    arrayList.add("1");
    arrayList.add("2");
    arrayList.add("3");
    arrayList.add("4");
    arrayList.add("5");

    /*
      To copy all elements of java ArrayList object into array use
      Object[] toArray() method.
    */

    Object[] objArray = arrayList.toArray();

    //display contents of Object array
    System.out.println("ArrayList elements are copied into an Array.
                                                  Now Array Contains..");
    for(int index=0; index < objArray.length ; index++)
      System.out.println(objArray[index]);
  }
}

/*
Output would be
ArrayList elements are copied into an Array. Now Array Contains..
1
2
3
4
5

请不要只是复制他人的作品作为自己的作品,而不注明出处。 java-examples.com/…
j
jpaugh

您可以按如下方式使用 toArray() api,

ArrayList<String> stringList = new ArrayList<String>();
stringList.add("ListItem1");
stringList.add("ListItem2");
String[] stringArray = new String[stringList.size()];
stringArray = stringList.toArray(stringList);

数组中的值是,

for(String value : stringList)
{
    System.out.println(value);
}

M
Manny Vellon

这(Ondrej 的回答):

Foo[] array = list.toArray(new Foo[0]);

是我看到的最常见的成语。那些建议您使用实际列表大小而不是“0”的人误解了这里发生的事情。 toArray 调用不关心给定数组的大小或内容——它只需要它的类型。如果它采用实际类型会更好,在这种情况下“Foo.class”会更清晰。是的,这个习惯用法会生成一个虚拟对象,但包含列表大小只是意味着您生成了一个更大的虚拟对象。同样,该对象不以任何方式使用;它只是需要的类型。


您需要检查源代码。如果您使用 new Foo[0],则数组 new Foo[0] 将被忽略并创建一个适当大小的新数组。如果您使用 new Foo[list.size()],则数组 new Foo[list.size()] 将被填充,并且不会创建其他数组。
u
user

尝试这个:

List list = new ArrayList();
list.add("Apple");
list.add("Banana");

Object[] ol = list.toArray();

没用,因为通常使用泛型类型进行操作。