What is the shortest way to initialize List of strings in java?
Solution 1
There are various options. Personally I like using Guava:
List<String> strings = Lists.newArrayList("s1", "s2", "s3");
(Guava's a library worth having anyway, of course :)
Using just the JDK, you could use:
List<String> strings = Arrays.asList("s1", "s2", "s3");
Note that this will return an ArrayList
, but that's not the normal java.util.ArrayList
- it's an internal one which is mutable but fixed-size.
Personally I prefer the Guava version as it makes it clear what's going on (the list implementation which will be returned). It's also still clear what's going on if you statically import the method:
// import static com.google.common.collect.Lists.newArrayList;
List<String> strings = newArrayList("s1", "s2", "s3");
... whereas if you statically import asList
it looks a little odder.
Another Guava option, if you don't want a modifiable-in-any-way list:
ImmutableList<String> strings = ImmutableList.of("s1", "s2", "s3");
I typically want to either have a completely mutable list (in which case Lists.newArrayList
is best) or a completely immutable list (in which case ImmutableList.of
is best). It's rare that I really want a mutable-but-fixed-size list.
Solution 2
Java 9+
Java 9 introduces a convenience method List.of
used as follows:
List<String> l = List.of("s1", "s2", "s3");
Java 8 and older
Here are a few alternatives:
// Short, but the resulting list is fixed size.
List<String> list1 = Arrays.asList("s1", "s2", "s3");
// Similar to above, but the resulting list can grow.
List<String> list2 = new ArrayList<>(Arrays.asList("s1", "s2", "s3"));
// Using initialization block. Useful if you need to "compute" the strings.
List<String> list3 = new ArrayList<String>() {{
add("s1");
add("s2");
add("s3");
}};
When it comes to arrays, you could initialize it at the point of declaration like this:
String[] arr = { "s1", "s2", "s3" };
If you need to reinitialize it or create it without storing it in a variable, you do
new String[] { "s1", "s2", "s3" }
If the string constants are may though, it would look like
String[] arr = { "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
"s11", "s12", "s13" };
In these cases I usually prefer writing
String[] arr = "s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13".split(",");
Solution 3
List<String> stringList = Arrays.asList("s1", "s2", "s3");
All these objects exists in the JDK.
PS: As aioobe stated, this makes the list fixed-sized.
Solution 4
JDK2
List<String> list = Arrays.asList("one", "two", "three");
JDK7
//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
JDK8
List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());
JDK9
List<String> list = List.of("one", "two", "three");
Plus there are lots of other ways supplied by other libraries like Guava.
Solution 5
You can use the Arrays
class in the standard Java API: http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T...)
List<String> strings = Arrays.asList("s1", "s2", "s3");
Be aware that the resultning list is fixed-size (you cannot add to it).
Vladimir
Updated on July 08, 2022Comments
-
Vladimir almost 2 years
I am searching for the shortest way (in code) to initialize list of strings and array of strings, i.e. list/array containing "s1", "s2", "s3" string elements.
-
BegemoT almost 13 yearswhy not just Arrays.asList("s1", "s2", "s3")?
-
Jon Skeet almost 13 years@BegemoT: I was adding that - personally I prefer the explicit nature of the Guava version.
-
aioobe almost 13 yearsThe resulting list is fix-sized though.
-
Mathias Schwarz almost 13 years@The Elite Gentleman: The result of Arrays.asList is immutable. If a new ArrayList is constructed as in
str2
then it is possible to add to the list afterwards. -
aioobe almost 13 years@Mathias Schwarz, not immutable, fixed sized.
-
Mathias Schwarz almost 13 years@aioobe: You are right! It is possible to overwrite existing entries.
-
aioobe almost 13 yearswhich is unmodifiable -- It's actually modifiable (but fixed-sized).
-
Paŭlo Ebermann almost 13 yearsYou should note that the initialization block variant creates an anonymous subclass of the ArrayList class.
-
Jon Skeet almost 13 years@Matt: No problem. I'll delete the one replying to you, and then delete this one soon, if you want to delete your second one too :)
-
Ashish Lohia over 6 yearsWith all respect to Jon Skeet. Isn't it better to use Arrays.asList() instead of ImmutableList.of(), as the later, will maintain the copied array. Can you please share some light on this?
-
Jon Skeet over 6 years@AshishLohia: Not if you want the list to be immutable. That's why I give multiple options - the best approach depends on what you want the result to be.
-
Ashish Lohia over 6 yearsI completely agree with you @JonSkeet . Thanks for clarifying.