Java'da List <String> nesnesi nasıl başlatılır?


405

Aşağıdaki kodda olduğu gibi bir Liste başlatamıyorum:

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

Aşağıdaki hatayla karşılaşıyorum:

Tür somutlaştırılamıyor List<String>

Nasıl başlatabilirim List<String>?

Yanıtlar:


733

Eğer işaretlerseniz API için Listfark edeceğiniz diyor:

Interface List<E>

Bir örnek interfaceolarak somutlaştırılamaz (hayır new List()mümkün değildir).

Bu bağlantıyı kontrol ederseniz class, aşağıdakileri uygulayan bazı es'ler bulacaksınız List:

Bilinen Tüm Uygulayıcı Sınıflar:

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

Bunlar somutlaştırılabilir. Bağlantılarını kullanarak onlar hakkında daha fazla bilgi edinin, IE: hangisinin ihtiyaçlarınıza daha uygun olduğunu bilmek.

En sık kullanılan 3 tanesi muhtemelen:

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

Bonus: Aşağıdaki gibi
kullanarak daha kolay bir şekilde değerlerle başlatabilirsiniz Arrays class:

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

Ancak, bu listeye daha fazla öğe eklemenize izin verilmediğini unutmayın fixed-size.


1
Arrays.asList harika ama şimdiye kadar farketmiş olmanız gerektiği gibi biri gibi durumlarda beklediğini yapamazint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D

1
@JAIL Olanlar bu değil. Bu, bir öğenin, burada bir öğenin bir dizi dizisi olduğu listesidir. İstenen davranış muhtemelen üç unsur 1, 2 ve 3'ün listesiydi.
Christoffer Hammarström

1
@Christoffer Hammarström bir liste veya dizi yazdırmak için java.util.Arrays.toString (dizi) kullanabilirsiniz, bu yüzden bu özellik zaten verilmiştir ..
Maxr1998

1
Gibi Vector Bazı discorage kullanımı bu ve burada . İş parçacığı sorunları nedeniyle
Nuno Rafael Figueiredo

3
Eğer ortaya çıkan listeyi gerekirse bir olmak ArrayList, kullanımnew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F

114

Bir arayüz başlatılamıyor ancak çok az uygulama var:

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"));

Ayrıca Guava gibi diğer kütüphaneler tarafından sağlanan birçok başka yol var .

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

38

Liste bir arabirimdir , bir arabirimi başlatamazsınız, çünkü arabirim bir kuraldır, sınıflarınız hangi yöntemlere sahip olmalıdır. Örneklemek için, bu arayüzün bazı gerçekleştirmelerine (uygulamalarına) ihtiyacınız vardır. Liste arayüzünün çok popüler uygulamalarıyla aşağıdaki kodu deneyin:

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

veya

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

14

Kullanmanız gerekecek ArrayList<String>.

List<String> bir arayüzdür.

Bunu kullan:

import java.util.ArrayList;

...

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

13

Liste bir arabirimdir ve bir arabirimi başlatamazsınız. Bunun yerine bir uygulama sınıfı başlatın.

Sevmek:

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

9

Liste sadece bir arayüzdür, bazı genel listelerin tanımıdır. Bu liste arayüzünün bir uygulamasını sağlamanız gerekir. En yaygın iki tanesi:

ArrayList - bir dizi üzerinden uygulanan bir liste

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

LinkedList - birbirine bağlı eleman zinciri gibi uygulanan bir liste

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

9

Çoğu durumda basit olmak istersiniz ArrayList-List

JDK sürüm 7'den önce

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

JDK 7 ve sonrası elmas operatörünü kullanabilirsiniz

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

Daha fazla bilgi burada yazılmıştır Oracle belgeleri - Koleksiyonlar


7

Ne tür bir Liste kullanmak istediğinize bağlı olarak,

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

gitmene izin vermeli.

Liste arabirimdir, ArrayList Liste arabiriminin bir uygulamasıdır. Liste arayüzünün JavaDoc'larını okuyarak, ihtiyaçlarınıza daha uygun daha fazla uygulama bulunabilir .


7

İçinde yalnızca bir nesne bulunan bir değişmez oluşturmak istiyorsanız, şu API'yı kullanabilirsiniz:List<T>

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

Daha fazla bilgi: dokümanlar


5

Liste bir Arayüzdür. Listeyi başlatmak için kullanamazsınız.

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

Bunlar Listelenen sınıflardan bazılarıdır,

ArrayList, LinkedList, Vector

İhtiyacınıza göre bunlardan herhangi birini kullanabilirsiniz. Bu her sınıfın kendine has özellikleri vardır.


Gibi Vector Bazı discorage kullanımı bu ve burada . İş parçacığı sorunları nedeniyle
Nuno Rafael Figueiredo

3

Her halükarda, hala bu sorunun etrafında kalan herhangi biri. Çünkü, aynı soruyu soran bir veya iki yeni kullanıcı görüyorum ve herkes o zaman söylüyor, Hayır bunu yapamazsınız, Sevgili İhtiyat , Burada verilen tüm cevapların yanı sıra, ek Bilgi vermek istiyorum - Evet aslında do, List list = yeni Liste (); Ancak tüm Arayüz yöntemlerinin uygulamaları yazma pahasına. Kavram basitçe List list = new List () değildir; fakat

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;
        }

..... ve benzeri (tüm yöntemleri yazamıyorum.)

Bu Anonim sınıfın bir örneğidir . Birisi şunu söylediğinde bu doğru, Hayır , bir arayüz başlatamazsınız ve bu doğru. Ama asla şunu söyleyemezsiniz: List'i yazabilirsiniz CANT = new List (); ancak, besbelli bunu yapabilir ve emin olmak için zor bir ifadedir Sen yapamaz .


Açık olmak gerekirse, bu gerçek türü olan bir nesne oluşturmaz List. Bunun yerine, adı olmayan ve uygulayan yeni bir sınıf bildirir Listve çalışma zamanında yeni bildirilen sınıfın yeni bir nesnesini oluşturur.
Radiodef

0

Biz yarattı soyuz-to 1 sorunu basitleştirmek için: dönüştürmek için nasıl Xiçin Y(örn Stringiçin Integer). Bu oluşturmak için basit bir işlevi vardır, böylece bir tür dönüşüm aynı zamanda, bir nesnenin bir oluşturma Map, List, Set:

import io.thedocs.soyuz.to;

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

Lütfen kontrol edin - diğer birçok yararlı özelliğe sahiptir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.