ChatGPT解决这个技术问题 Extra ChatGPT

Convert list to array in Java [duplicate]

This question already has answers here: Converting 'ArrayList to 'String[]' in Java (16 answers) Closed 3 years ago.

How can I convert a List to an Array in Java?

Check the code below:

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);  

I need to populate the array tiendas with the values of tiendasList.

ArrayList isn't an array. Tienda[] would be an array.

E
Eng.Fouad

Either:

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

or:

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

Note that this works only for arrays of reference types. For arrays of primitive types, use the traditional way:

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

Update:

It is recommended now to use list.toArray(new Foo[0]);, not list.toArray(new Foo[list.size()]);.

From JetBrains Intellij Idea inspection:

There are two styles to convert a collection to an array: either using a pre-sized array (like c.toArray(new String[c.size()])) or using an empty array (like c.toArray(new String[0]). In older Java versions using pre-sized array was recommended, as the reflection call which is necessary to create an array of proper size was quite slow. However since late updates of OpenJDK 6 this call was intrinsified, making the performance of the empty array version the same and sometimes even better, compared to the pre-sized version. Also passing pre-sized array is dangerous for a concurrent or synchronized collection as a data race is possible between the size and toArray call which may result in extra nulls at the end of the array, if the collection was concurrently shrunk during the operation. This inspection allows to follow the uniform style: either using an empty array (which is recommended in modern Java) or using a pre-sized array (which might be faster in older Java versions or non-HotSpot based JVMs).


for the first form I prefer list.toArray(new Foo[0]) as that makes it clear that the parameter is passed for the type information only and the size is irrelevant.
@MarcusJuniusBrutus No, you are wrong. if you are using new Foo[0] then you are creating an extra useless array. Check the source code to verify.
Why it isn't just Foo[] array = list.toArray(); is beyond me.
@Diederik Because list.toArray() returns Object[] not Foo[].
@Diederik It's an unfortunately side effect of Java's Generics collections sharing classes with its non-Generic collections. Collection's .toArray() was defined way back in Java 1.0 or 1.1 as returning Object[] and it's far too late to change that now. Kinda makes me wish Java used different collections for generics like .NET did to avoid this insanity.
J
Jacob van Lingen

An alternative in Java 8:

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

Since Java 11:

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

But is using Stream better in this particular case?
This question is tagged for android, maybe you like to write your answer for the pure java question in stackoverflow.com/questions/4042434/…
@PhoneixS with gradle-retrolambda it's possible to use java 8 functionality now.
In C#: list.ToArray(); //no further comment :/
More verbose than the pre Java 8 solution. Sad.
O
Ondrej Slinták

I think this is the simplest way:

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

Maybe set the correct size of the array, as you obviously know it
^ No need to set the size of the array if this is the intended style. Documentation for 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.
@SuZhang If the list fits in the specified array. For sure the list does not fit into the passed array new Foo[0] (unless the list itself is empty), and a new array will be created for holding the list items. You are just passing the type of the array (while the object itself is useless).
@Eng.Fouad I should have made it clear that I was replying Oskar Kjellin :P
When passing in an array if too small size, the toArray() method has to construct a new array of the right size using reflexion. This has significantly worse performance than passing in an array of at least the size of the collection itself. Source: Intellij's inspection: git.jetbrains.org/?p=idea/community.git;a=blob;f=plugins/…
p
pandre

Best thing I came up without Java 8 was:

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;
}

If anyone has a better way to do this, please share :)


A
Armed10

I came across this code snippet that solves it.

//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]);

The conversion works as follows:

It creates a new Long array, with the size of the original list It converts the original ArrayList to an array using the newly created one It casts that array into a Long array (Long[]), which I appropriately named 'array'


Posting someone else's code that works without any code comments or explanation is not a very compelling answer (but no -1 since it's technically correct).
Your comment however causes others to downvote my answer anyway.
While technically correct, this solution is redundant; you need either the (Long[]) cast, or the new Long[list.size()] argument to toArray, but not both!
J
John S.

This is works. Kind of.

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;
}

Then the main method.

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

For ArrayList the following works:

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

//... add values

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

S
Sk93

Example taken from this page: 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

Please don't just copy other people's work as your own, without attribution. java-examples.com/…
j
jpaugh

You can use toArray() api as follows,

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

Values from the array are,

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

M
Manny Vellon

This (Ondrej's answer):

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

Is the most common idiom I see. Those who are suggesting that you use the actual list size instead of "0" are misunderstanding what's happening here. The toArray call does not care about the size or contents of the given array - it only needs its type. It would have been better if it took an actual Type in which case "Foo.class" would have been a lot clearer. Yes, this idiom generates a dummy object, but including the list size just means that you generate a larger dummy object. Again, the object is not used in any way; it's only the type that's needed.


You need to check the source code. If you use new Foo[0] then the array new Foo[0] will be ignored and a new array of a proper size will be created. If you use new Foo[list.size()] then the array new Foo[list.size()] will be filled and no other array will be created.
u
user

Try this:

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

Object[] ol = list.toArray();

Not useful, since one normally operates with generic types.