Java ArrayList dan HashMap dengan cepat

Bisakah seseorang memberikan contoh membuat Java ArrayList dan HashMap dengan cepat? Jadi, alih-alih melakukan add() atau put(), sebenarnya menyediakan data awal untuk array/hash di instantiasi kelas?

Sebagai contoh, sesuatu yang mirip dengan PHP misalnya:

$array = array (3, 1, 2);
$assoc_array = array( 'key' => 'value' );

person Steve M    schedule 12.05.2009    source sumber
comment
Apakah Anda menanyakan sintaksis tentang cara melakukan itu, atau contoh dunia nyata mengapa Anda menginginkannya?   -  person Bill the Lizard    schedule 12.05.2009


Jawaban (8)


Cara yang bagus untuk melakukan ini adalah menggunakan List.of() dan Map.of() (sejak Java 8):

List<String> list = List.of("A", "B", "C");
    
Map<Integer, String> map = Map.of(1, "A",
                                  2, "B",
                                  3, "C");

Java 7 dan versi lebih lama dapat menggunakan Google Koleksi:

List<String> list = ImmutableList.of("A", "B", "C");

Map<Integer, String> map = ImmutableMap.of(
  1, "A",
  2, "B",
  3, "C");
person Steve McLeod    schedule 12.05.2009
comment
500kB adalah harga mahal yang harus dibayar hanya untuk melakukan itu. Jika satu-satunya hal yang diinginkan adalah mengisi Koleksi dengan cepat, jawaban yang diterima adalah yang paling bagus menurut IMHO. - person Damien B; 12.05.2009
comment
Alasan lain untuk tidak menyukai pendekatan ini adalah karena ini adalah daftar yang tidak dapat diubah, meskipun saya menduga (tanpa membaca dokumentasi) bahwa ada daftar yang dapat diubah? - person cgp; 12.05.2009
comment
Secara desain, itu tidak dapat diubah! Tapi ya, ada pilihan lain juga. Jika tidak dapat diubah, Anda dapat dengan mudah membagikan satu instance antar thread, dan juga antar permintaan web. 500 Kb adalah harga mahal yang harus dibayar. Namun masih banyak barang lainnya di Google Collectons, layak untuk dibayar. - person Steve McLeod; 12.05.2009
comment
@Damien- Cukup adil, tetapi tidak ada yang menghentikan pengguna untuk menulis versi mereka sendiri dari metode ini. - person Philip Guin; 14.12.2012
comment
Map.of adalah fitur Java 9 bukan 8! - person vahid kh; 20.06.2021

Array dapat dikonversi ke Lists:

List<String> al = Arrays.asList("vote", "for", "me"); //pandering

Perhatikan bahwa ini tidak mengembalikan sebuah ArrayList tetapi sebuah instance List yang sewenang-wenang (dalam hal ini adalah Array.ArrayList)!

Pendekatan Bruno bekerja paling baik dan dapat dipertimbangkan dengan cepat untuk peta. Saya lebih suka metode lain untuk daftar (lihat di atas):

Map<String,String> map = new HashMap<String,String>() {
 {
    put("key1", "value1");
    put("key2", "value2");
 }
};
person cgp    schedule 12.05.2009
comment
berhati-hatilah, Arrays.asList tidak mengembalikan java.util.ArrayList tetapi java.util.Arrays$ArrayList berukuran tetap! - person user85421; 12.05.2009

untuk daftar pendek:

    List<String> ab = Arrays.asList("a","b");
person Andreas Petersson    schedule 12.05.2009
comment
tidak juga.. dari java.util.Arrays.java: public static ‹T› List‹T› asList(T... a) { return new ArrayList‹T›(a); } sehingga hanya mengembalikan ArrayList yang telah diinisialisasi sebelumnya - person Andreas Petersson; 12.05.2009
comment
Lihat lebih jauh di sumbernya. Array memiliki kelas ArrayList internalnya sendiri yang tidak mendukung add() atau delete(). - person Michael Myers; 12.05.2009
comment
dan dari dokumentasi asList: Mengembalikan daftar berukuran tetap yang didukung oleh array yang ditentukan. - person user85421; 12.05.2009

Gunakan penginisialisasi anonim yang bagus:

List<String> list = new ArrayList<String>() {{
    add("a");
    add("b");
}};

Hal yang sama berlaku untuk Peta:

Map<String, String> map = new HashMap<String, String>() {{
    put("a", "a");
    put("b", "b");
}};

Menurut saya ini yang paling elegan dan mudah dibaca.

Metode lain memerlukan pembuatan array terlebih dahulu, kemudian mengubahnya menjadi Daftar - menurut saya terlalu mahal, dan kurang mudah dibaca.

person Yuval Adam    schedule 12.05.2009

Untuk daftar, Anda dapat menggunakan Arrays.asList seperti ini:

List<String> stringList = Arrays.asList("one", "two");
List<Integer> intList = Arrays.asList(1, 2);

Untuk Maps Anda bisa menggunakan ini:

public static <K, V> Map<K, V> mapOf(Object... keyValues) {
    Map<K, V> map = new HashMap<>();

    K key = null;
    for (int index = 0; index < keyValues.length; index++) {
        if (index % 2 == 0) {
            key = (K)keyValues[index];
        }
        else {
            map.put(key, (V)keyValues[index]);
        }
    }

    return map;
}

Map<Integer, String> map1 = mapOf(1, "value1", 2, "value2");
Map<String, String> map2 = mapOf("key1", "value1", "key2", "value2");

Catatan: di Java 9 Anda dapat menggunakan Map.of
Catatan2: Double Brace Initialization untuk membuat HashMaps seperti yang disarankan dalam jawaban lain memiliki peringatan

person R. Oosterholt    schedule 23.05.2017

Maksudmu seperti ini?

public List<String> buildList(String first, String second)
{
     List<String> ret = new ArrayList<String>();
     ret.add(first);
     ret.add(second);
     return ret;
}

...

List<String> names = buildList("Jon", "Marc");

Atau apakah Anda tertarik dengan konstruktor ArrayList yang membutuhkan Collection<? extends E>? Misalnya:

String[] items = new String[] { "First", "Second", "Third" };
// Here's one way of creating a List...
Collection<String> itemCollection = Arrays.asList(items);
// And here's another
ArrayList<String> itemList = new ArrayList<String>(itemCollection);
person Jon Skeet    schedule 12.05.2009
comment
Sedikit perbaikan pada saran Jon: berfungsi untuk sejumlah item: public List‹String› buildList(String... items) { return new ArrayList‹String›(Arrays.asList(items)); } - person Steve McLeod; 12.05.2009
comment
(Contoh kode dapat disederhanakan sedikit dengan memanfaatkan varags Arrays.asList(); stackoverflow.com/questions/258954/) - person Jonik; 12.05.2009
comment
Saya menunjukkan langkah-langkah terpisah untuk memperjelas bagaimana melakukan sesuatu ketika Anda sudah memiliki array. - person Jon Skeet; 12.05.2009
comment
Mengapa tidak menggunakan var-args sehingga Anda dapat meneruskan sejumlah item? - person sal; 12.05.2009

Bagaimana dengan ini?

ArrayList<String> array = new ArrayList<String>(Arrays.asList("value1", "value2"));

Saya tahu banyak jawaban yang memberikan solusi serupa, tapi menurut saya jawaban ini sedikit lebih tepat dan ringkas. Jika Anda memiliki banyak nilai, Anda mungkin ingin melakukan ini:

ArrayList<String> array = new ArrayList<String>(Arrays.asList(
    "value1",
    "value2",
    "value3",
    ...
));
person ahmadPH    schedule 01.04.2021

person    schedule
comment
Pendekatan-pendekatan ini bagus. Namun isinya dapat diubah setelah dibuat. Pendekatan yang tidak dapat diubah sungguh bagus! - person Steve McLeod; 12.05.2009
comment
ini terkadang berbahaya. Anda akan mendapatkan referensi ke kelas terlampir karena kelas dalam anonim mempertahankan referensi ke objek induknya. hal ini dapat menyebabkan masalah pada pengumpulan sampah dan serialisasi. - person Andreas Petersson; 12.05.2009
comment
Saya tidak suka inisialisasi kurung kurawal ganda sama sekali. Mengapa membuat kelas dalam (non-statis) baru ketika penginisialisasi sederhana juga bisa digunakan? - person Michael Myers; 12.05.2009
comment
Saya selalu berpikir bahwa pendekatan kurung kurawal ganda itu bagus (khususnya untuk konstruksi GUI) - tetapi komentar pada referensi objek induk dibuat dengan sangat baik. Lanjutkan dengan hati-hati di sini. Mungkin lebih baik membuat kelas pembuat Peta kecil yang menerima vararg objek (kunci, nilai, nilai kunci, dll...). - person Kevin Day; 13.05.2009
comment
Apakah ada masalah kinerja? Maksud saya, Anda setiap kali membuat kelas anonim, yang memperluas ArrayList. Jika Anda akan membuat instance daftar array, dan kemudian menambahkan item ke dalamnya, menurut Anda itu akan lebih keren untuk kinerjanya. Atau kelas ini muncul setelah kompilasi? - person degr; 09.07.2015
comment
Kalau dibuat seperti ini maka tidak bisa diserialkan lagi! - person clankill3r; 11.08.2015