Basit cevap
In Java 9 veya üstü, sonra List.of()eklendi:
List<String> strings = List.of("foo", "bar", "baz");
İle Java 10 üstü veya bununla kısaltılabilir varanahtar kelime.
var strings = List.of("foo", "bar", "baz");
Bu size değişmez bir şey verecektir List, bu yüzden değiştirilemez.
Önceden doldurduğunuz çoğu durumda istediğiniz şey budur.
Java 8 veya öncesi:
List<String> strings = Arrays.asList("foo", "bar", "baz");
Bu size Listbir dizi tarafından desteklenir, böylece uzunluğu değiştiremez.
Ama arayabilirsiniz List.set, bu yüzden hala değişebilir .
Sen yapabilir Arrays.asListstatik ithalat ile daha kısa:
List<String> strings = asList("foo", "bar", "baz");
Statik içe aktarma:
import static java.util.Arrays.asList;
Hangi herhangi bir modern IDE sizin için önerecek ve otomatik olarak yapacak.
Örneğin IntelliJ IDEA içinde tuşuna Alt+Enterbasıp seçin Static import method....
Ancak, List.ofyöntemin kısaltılmasını önermiyorum of, çünkü bu kafa karıştırıcı hale geliyor.
List.ofzaten yeterince kısa ve iyi okuyor.
kullanılması Streams
Neden bir olmak zorunda List?
Java 8 veya daha yenisi Streamile daha esnek olanı kullanabilirsiniz :
Stream<String> strings = Stream.of("foo", "bar", "baz");
Leri birleştirebilirsiniz Stream:
Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
Stream.of("baz", "qux"));
Ya da bir den gidebilirsiniz Streama List:
import static java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
Ama tercihen, Streama'yı toplamadan kullanın List.
Eğer varsa gerçekten özellikle ihtiyaçjava.util.ArrayList
(Muhtemelen yapmıyorsunuz.) JEP 269'u
alıntılamak için (benimkini vurgulayın):
Önceden tanımlanmış bir değer kümesiyle değiştirilebilir bir toplama örneğini başlatmak için küçük bir kullanım durumu kümesi vardır. Bu önceden tanımlanmış değerlerin değişmez bir koleksiyonda olması ve daha sonra değiştirilebilir koleksiyonun bir kopya oluşturucu aracılığıyla başlatılması genellikle tercih edilir.
Eğer isterseniz hem önceden doldurmak An ArrayList ve (neden?) Sonradan kendisine, kullanımını eklemek
ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");
veya Java 8 veya önceki sürümlerde:
ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");
veya kullanarak Stream:
import static java.util.stream.Collectors.toCollection;
ArrayList<String> strings = Stream.of("foo", "bar")
.collect(toCollection(ArrayList::new));
strings.add("baz");
Ama yine de, Streamdoğrudan bir yerine toplamak yerine doğrudan kullanmak daha iyidir List.
Uygulamalara değil, arayüzlere program
Eğer bir listeyi ilan ettik söyledi ArrayListKodunuzdaki, ama eğer tek bir üyesini kullanıyorsanız arasan ArrayListo burada değil List.
Hangi muhtemelen yapmıyorsun.
Genellikle sadece (örneğin kullanım edeceklerini en genel arayüzü tarafından değişkenleri bildirmek gerekir Iterable, Collectionya da List) ve spesifik uygulamaya onları başlatmaya (örneğin ArrayList, LinkedListya da Arrays.asList()).
Aksi takdirde kodunuzu belirli bir türle sınırlandırırsınız ve istediğiniz zaman değiştirmek daha zor olacaktır.
Örneğin, bir geçiriyorsanız eğer ArrayListbir etmek void method(...):
// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) {
for (String s : strings) { ... }
}
// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
if (!strings.isEmpty()) { strings.stream()... }
}
// List if you also need .get(index):
void method(List<String> strings) {
strings.get(...)
}
// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
??? // You don't want to limit yourself to just ArrayList
}
Başka bir örnek InputStream, genellikle a FileInputStreamveya a olmasına rağmen her zaman değişken bildirmek olacaktır BufferedInputStream, çünkü bir gün yakında siz veya başka biri başka bir tür kullanmak isteyecektir InputStream.
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]