Bagaimana cara menginisialisasi objek Daftar <String> di Jawa?

405

Saya tidak dapat menginisialisasi Daftar seperti pada kode berikut:

List<String> supplierNames = new List<String>();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));

Saya menghadapi kesalahan berikut:

Tidak dapat membuat instantiate jenisnya List<String>

Bagaimana saya bisa instantiate List<String>?

ahmednabil88
sumber

Jawaban:

733

Jika Anda memeriksa API untuk ListAnda akan melihat isinya:

Interface List<E>

Menjadi interfacesarana itu tidak bisa dipakai (tidak new List()mungkin).

Jika Anda memeriksa tautan itu, Anda akan menemukan beberapa classes yang menerapkan List:

Semua Kelas Pelaksana yang Dikenal:

AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack,Vector

Itu bisa dipakai. Gunakan tautan mereka untuk mengetahui lebih banyak tentang mereka, IE: untuk mengetahui mana yang lebih sesuai dengan kebutuhan Anda.

3 yang paling umum digunakan mungkin adalah:

 List<String> supplierNames1 = new ArrayList<String>();
 List<String> supplierNames2 = new LinkedList<String>();
 List<String> supplierNames3 = new Vector<String>();

Bonus:
Anda juga dapat instantiate dengan nilai-nilai, dengan cara yang lebih mudah, menggunakan Arrays class, sebagai berikut:

List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));

Tetapi perhatikan, Anda tidak diizinkan menambahkan lebih banyak elemen ke daftar itu, karena hal itu fixed-size.

PENJARA
sumber
1
Arrays.asList sangat bagus, tetapi seperti yang seharusnya Anda perhatikan sekarang gagal melakukan apa yang diharapkan dalam kasus sepertiint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D
1
@ JILIL Bukan itu yang terjadi. Itu daftar satu elemen, di mana satu elemen adalah array int. Perilaku yang diinginkan mungkin adalah daftar tiga elemen 1, 2, dan 3.
Christoffer Hammarström
1
@Christoffer Hammarström untuk mencetak daftar atau larik, Anda bisa menggunakan java.util.Arrays.toString (array) ;, jadi fitur ini sudah diberikan ..
Maxr1998
1
Beberapa penggunaan Vektor seperti ini dan di sini diabaikan . Karena masalah threading
Nuno Rafael Figueiredo
3
Jika Anda ingin daftar yang dihasilkan adalah ArrayList, gunakannew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F
114

Tidak dapat membuat instance antarmuka tetapi ada beberapa implementasi:

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

// creates immutable lists, so you can't modify such list 
List<String> immutableList = List.of("one", "two", "three");

// if we want mutable list we can copy content of immutable list 
// to mutable one for instance via copy-constructor (which creates shallow copy)
List<String> mutableList = new ArrayList<>(List.of("one", "two", "three"));

Plus ada banyak cara lain yang disediakan oleh perpustakaan lain seperti Jambu .

List<String> list = Lists.newArrayList("one", "two", "three");
LazerBanana
sumber
38

Daftar adalah Antarmuka , Anda tidak dapat membuat instance Antarmuka, karena antarmuka adalah konvensi, metode apa yang harus dimiliki kelas Anda. Untuk instantiate, Anda memerlukan beberapa realisasi (implementasi) dari antarmuka itu. Coba kode di bawah ini dengan implementasi Daftar antarmuka yang sangat populer:

List<String> supplierNames = new ArrayList<String>(); 

atau

List<String> supplierNames = new LinkedList<String>();
Doseke
sumber
14

Anda harus menggunakan ArrayList<String>atau semacamnya.

List<String> adalah sebuah antarmuka.

Gunakan ini:

import java.util.ArrayList;

...

List<String> supplierNames = new ArrayList<String>();
Ofir Farchy
sumber
13

Daftar adalah antarmuka, dan Anda tidak dapat menginisialisasi antarmuka. Instantiate kelas implementasi sebagai gantinya.

Suka:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();
Ankit
sumber
9

Daftar hanyalah sebuah antarmuka, definisi dari beberapa daftar generik. Anda perlu menyediakan implementasi antarmuka daftar ini. Dua yang paling umum adalah:

ArrayList - daftar yang diimplementasikan pada array

List<String> supplierNames = new ArrayList<String>();

LinkedList - daftar yang diimplementasikan seperti rantai elemen yang saling berhubungan

List<String> supplierNames = new LinkedList<String>();
Jakub Zaverka
sumber
9

Dalam kebanyakan kasus, Anda ingin sederhana ArrayList- sebuah implementasi dariList

Sebelum JDK versi 7

List<String> list = new ArrayList<String>();

JDK 7 dan kemudian Anda dapat menggunakan operator berlian

List<String> list = new ArrayList<>();

Informasi lebih lanjut ditulis di sini dokumentasi Oracle - Koleksi

Daniel Perník
sumber
7

Tergantung pada jenis Daftar yang ingin Anda gunakan, sesuatu seperti

List<String> supplierNames = new ArrayList<String>();

harus membuat Anda pergi.

Daftar adalah antarmuka, ArrayList adalah salah satu implementasi dari antarmuka Daftar. Lebih banyak implementasi yang mungkin lebih sesuai dengan kebutuhan Anda dapat ditemukan dengan membaca JavaDocs dari antarmuka Daftar .

Uli
sumber
7

Jika Anda hanya ingin membuat yang tidak dapat diubahList<T> dengan hanya satu objek di dalamnya, Anda dapat menggunakan API ini:

List<String> oneObjectList = Collections.singletonList("theOnlyObject”);

Info lebih lanjut: dokumen

Sakiboy
sumber
5

Daftar adalah Antarmuka. Anda tidak dapat menggunakan Daftar untuk menginisialisasi itu.

  List<String> supplierNames = new ArrayList<String>();

Ini adalah beberapa kelas yang diterapkan Daftar,

ArrayList, LinkedList, Vector

Anda dapat menggunakan semua ini sesuai kebutuhan Anda. Masing-masing kelas memiliki fitur sendiri.

some one
sumber
Beberapa penggunaan Vektor seperti ini dan di sini diabaikan . Karena masalah threading
Nuno Rafael Figueiredo
3

Untuk jaga-jaga, ada yang masih ada di sekitar pertanyaan ini. Karena, saya melihat satu atau dua pengguna baru lagi menanyakan pertanyaan yang sama dan semua orang mengatakan, Tidak , Anda tidak dapat melakukannya, Dear Prudence , Terlepas dari semua jawaban yang diberikan di sini, saya ingin memberikan Informasi tambahan - Ya, Anda sebenarnya dapat lakukan, Daftar daftar = Daftar baru (); Tetapi dengan biaya penulisan implementasi semua metode Antarmuka. Gagasannya bukan hanya Daftar daftar = Daftar baru (); tapi

List<Integer> list = new List<Integer>(){

        @Override
        public int size() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean contains(Object o) {
            // TODO Auto-generated method stub
            return false;
        }

..... dan seterusnya (Cant menulis semua metode.)

Ini adalah contoh kelas Anonim . Itu benar ketika seseorang menyatakan, Tidak , Anda tidak dapat membuat instance antarmuka, dan itu benar. Tetapi Anda tidak pernah bisa mengatakan, Anda TIDAK BISA menulis Daftar daftar = Daftar baru (); tetapi, jelas Anda bisa melakukan itu dan itu pernyataan sulit untuk membuat Anda tidak bisa melakukannya .

kenobiwan
sumber
Untuk lebih jelasnya, ini tidak membuat objek yang tipe sebenarnya List. Sebaliknya, ia mendeklarasikan kelas baru yang tidak memiliki nama dan implementasi List, dan pada saat run-time membuat objek baru dari kelas yang baru dideklarasikan.
Radiodef
0

Kami membuat soyuz-to untuk menyederhanakan 1 masalah: cara mengonversi Xke Y(misalnya Stringke Integer). Membangun suatu objek juga jenis konversi sehingga memiliki fungsi sederhana untuk membangun Map, List, Set:

import io.thedocs.soyuz.to;

List<String> names = to.list("John", "Fedor");

Silakan periksa - ia memiliki banyak fitur berguna lainnya

fedor.belov
sumber