How might I convert an ArrayList<String>
object to a String[]
array in Java?
List<String> list = ..;
String[] array = list.toArray(new String[0]);
For example:
List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);
The toArray()
method without passing any argument returns Object[]
. So you have to pass an array as an argument, which will be filled with the data from the list, and returned. You can pass an empty array as well, but you can also pass an array with the desired size.
Important update: Originally the code above used new String[list.size()]
. However, this blogpost reveals that due to JVM optimizations, using new String[0]
is better now.
-
13
-
34
-
48Turns out that providing a zero-length array, even creating it and throwing it away, is on average faster than allocating an array of the right size. For benchmarks and explanation see here: shipilev.net/blog/2016/arrays-wisdom-ancients – Stuart Marks Jan 21 '16 at 8:29
-
2(Sorry. Rhetorical question. The answer is, of course, because Java doesn't do real generics; it mostly just fakes them by casting Object) – Nyerguds May 19 '16 at 11:05
-
2@lyuboslavkanev The problem is that having the generic type in Java isn't enough to actually create objects based on that type; not even an array (which is ridiculous, because that should work for any type). All that can be done with it, as far as I can see, is casting. In fact, to even create objects of the type, you need to have the actual
Class
object, which seems to be completely impossible to derive from the generic type. The reason for this, as I said, is that the whole construction is fake; it's all just stored as Object internally. – Nyerguds Nov 3 '17 at 7:52
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
array[i++] = s;
}
-
12This works, but isn't super efficient, and duplicates functionality in the accepted answer with extra code. – Alan Delimon Feb 8 '13 at 15:26
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray = Arrays.copyOf(objectList,objectList.length,String[].class);
Using copyOf, ArrayList to arrays might be done also.
-
3Suggest camelcase so "objectList =..." and "stringArray". Also, it is Arrays.copyOf...capital O. – Jason Weden Aug 28 '14 at 15:18
-
1
This is enough:
int[] d = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
d[i] = list.get(i);
}
-
13
By using toArray()
method of ArrayList you can get 0bject[]
.
Cast that Object[]
to String[]
Here the sample code:
ArrayList<String> arr_List=new ArrayList<String>();
Object[] str_Arr=arr_List.toArray();
-
15
-
1As @VolkerSeibt said,you can't cast an object array to string array,it will results in a java.lang.ClassCastException – ShihabSoft Dec 2 '15 at 11:05
An alternative in Java 8:
String[] strings = list.stream().toArray(String[]::new);
-
27
-
18
-
1I would prefer that syntax, but IntelliJ displays a compiler error with that, complains "T[] is not a functional interface." – Glen Mazza Jul 25 '16 at 16:11
-
3@GlenMazza you can only use
toArray
on aStream
object. This compilation error may occur if you reduce the stream using aCollectors
and then try to applytoArray
. – Udara Bentota Nov 16 '16 at 7:29
You can use the toArray()
method for List
:
ArrayList<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
String[] array = list.toArray(new String[list.size()]);
Or you can manually add the elements to an array:
ArrayList<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
String[] array = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i);
}
Hope this helps!
In Java 8:
String[] strings = list.parallelStream().toArray(String[]::new);
-
12This is really already contained in this answer. Perhaps add it as an edit to that answer instead of as an entirely new one. – River Feb 5 '16 at 16:17
-
6
in case some extra manipulation of the data is desired, for which the user wants a function, this approach is not perfect (as it requires passing the class of the element as second parameter), but works:
import java.util.ArrayList; import java.lang.reflect.Array;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList<>();
al.add(1);
al.add(2);
Integer[] arr = convert(al, Integer.class);
for (int i=0; i<arr.length; i++)
System.out.println(arr[i]);
}
public static <T> T[] convert(ArrayList<T> al, Class clazz) {
return (T[]) al.toArray((T[])Array.newInstance(clazz, al.size()));
}
}
Generics solution to covert any List<Type>
to String []
:
public static <T> String[] listToArray(List<T> list) {
String [] array = new String[list.size()];
for (int i = 0; i < array.length; i++)
array[i] = list.get(i).toString();
return array;
}
Note You must override toString()
method.
class Car {
private String name;
public Car(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
final List<Car> carList = new ArrayList<Car>();
carList.add(new Car("BMW"))
carList.add(new Car("Mercedes"))
carList.add(new Car("Skoda"))
final String[] carArray = listToArray(carList);
You can use Iterator<String>
to iterate the elements of the ArrayList<String>
:
ArrayList<String> list = new ArrayList<>();
String[] array = new String[list.size()];
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
array[i] = iterator.next();
}
Now you can retrive elements from String[]
using any Loop.
-
I downvoted because: 1. no use of generics which force you into 2. using
.toString()
where no explicit cast would be needed, 3. you don't even incrementi
, and 4. thewhile
would be better off replaced by afor
. Suggested code:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
– Olivier Grégoire Aug 28 '17 at 9:05 -
-
Well, ideally, you should edit your code to include those comments (that is... if you think they're good for your answer!). I won't consider removing my downvote while the code remains unchanged. – Olivier Grégoire Aug 28 '17 at 13:58
-
I am new here, so I don't know yet how things work here. Although, appreciate your help mate. – Vatsal Chavda Aug 28 '17 at 14:18
-
This is much better! I've edited just a bit, but you've just experienced how it works: provide answer, improve them, get the laurels ;) – Olivier Grégoire Aug 28 '17 at 14:22
private String[] prepareDeliveryArray(List<DeliveryServiceModel> deliveryServices) {
String[] delivery = new String[deliveryServices.size()];
for (int i = 0; i < deliveryServices.size(); i++) {
delivery[i] = deliveryServices.get(i).getName();
}
return delivery;
}
If your application is already using Apache Commons lib, you can slightly modify the accepted answer to not create a new empty array each time:
List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);
There are a few more preallocated empty arrays of different types in ArrayUtils
.
Also we can trick JVM to create en empty array for us this way:
String[] array = list.toArray(ArrayUtils.toArray());
// or if using static import
String[] array = list.toArray(toArray());
But there's really no advantage this way, just a matter of taste, IMO.
You can convert List to String array by using this method:
Object[] stringlist=list.toArray();
The complete example:
ArrayList<String> list=new ArrayList<>();
list.add("Abc");
list.add("xyz");
Object[] stringlist=list.toArray();
for(int i = 0; i < stringlist.length ; i++)
{
Log.wtf("list data:",(String)stringlist[i]);
}
Starting from JDK/11, one can alternatively use the API Collection.toArray(IntFunction<T[]> generator)
to achieve the same as:
List<String> list = List.of("x","y","z");
String[] arrayBeforeJDK11 = list.toArray(new String[0]);
String[] arrayAfterJDK11 = list.toArray(String[]::new); // similar to Stream.toArray
In Java 8, it can be done using
String[] arrayFromList = fromlist.stream().toArray(String[]::new);
In Java 11, we can use the Collection.toArray(generator)
method. The following code will create a new array of strings:
List<String> list = List.of("one", "two", "three");
String[] array = list.toArray(String[]::new)
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String [] strArry= list.stream().toArray(size -> new String[size]);
First, List is converted to a String stream. Then it uses Stream.toArray to return an array containing the elements of the String stream. "size -> new String[size]" is an IntFunction function that allocates a String array with size of the String stream. It can be rearranged as
IntFunction<String []> allocateFunc = size -> {
return new String[size];
};
String [] strArry= list.stream().toArray(allocateFunc);
-
2What value does this answer add? It appears to just repeat other answers without explaining why it answers the question. – Richard Feb 21 at 7:56
protected by user207421 Dec 19 '17 at 22:25
Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?
toArray(T[])
and similar in syntax toStream.toArray
. – Naman Jul 26 '18 at 18:40