İlkel int listesi oluşturulsun mu?


97

Java'da aşağıdaki gibi ilkel int veya herhangi bir ilkel liste oluşturmanın bir yolu var mı?

List<int> myList = new ArrayList<int>();

Yapabilirim gibi görünüyor List myList = new ArrayList();

ve bu listeye "int" ekleyin. Ama bu, bu listeye her şeyi ekleyebileceğim anlamına gelir.

Tek seçeneğim, bir int dizisi oluşturmak ve onu bir listeye dönüştürmek mi yoksa bir Tamsayı nesneleri listesi oluşturmak mı?


Performans endişenizse, hazine yardımcı olmalıdır.
assylias

Temel bir dizi kullanarak bir liste oluşturmak mümkündür, ancak başlamak için dizinin boyutunu bilmeniz gerekir ve Koleksiyonlar nesnesiyle birlikte gelen diğer birçok işlevi kaybedersiniz. Ama şöyle bir şey yapabilirsiniz: int [] dizi = new int [10];
Taylor

Yanıtlar:


144

Java'da herhangi bir değişkenin türü ya ilkel bir tür ya da bir başvuru türüdür. Genel tür bağımsız değişkenleri başvuru türü olmalıdır. İlkeller genişlemedikleri Objectiçin, parametrik bir tip için genel tip argümanları olarak kullanılamazlar.

Bunun yerine, Integeraşağıdakiler için bir sarmalayıcı olan sınıfı kullanın int:

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

Java 7 kullanıyorsanız, elmas operatörünü kullanarak bu bildirimi basitleştirebilirsiniz:

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

Java'da otomatik kutulama ile ilkel tür int, Integergerektiğinde bir haline gelecektir .

Otomatik kutu oluşturma, Java derleyicisinin ilkel türler ve bunlara karşılık gelen nesne sarmalayıcı sınıfları arasında yaptığı otomatik dönüştürmedir.

Yani şu geçerlidir:

int myInt = 1;
List<Integer> list = new ArrayList<Integer>();
list.add(myInt);

System.out.println(list.get(0)); //prints 1

1
Dolayısıyla, setSelectedIndices JTable yöntemi bir anlamsızdır: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez

25

Java Collection Framework kullanılırken ilkel türleri içerebilecek herhangi bir koleksiyon yoktur.

Ancak, Trove , Colt , Fastutil , Guava gibi ilkel türleri destekleyen başka java koleksiyonları da vardır.

Trove Kitaplığı kullanıldığında tamsayı içeren bir dizi listesinin nasıl olacağına bir örnek aşağıdaki gibidir:

 TIntArrayList list= new TIntArrayList();

Bu listenin performansı, Java Koleksiyonlarındaki Tamsayılar ArrayList ile karşılaştırıldığında çok daha iyidir çünkü karşılık gelen Tamsayı Sarmalayıcı Sınıfına otomatik kutulama / kutudan çıkarma işlemine gerek yoktur.


1
Guava'da ilkel bir koleksiyon uygulaması bulamadım. Lütfen bir bağlantı verebilir misiniz?
nimcap

9

Java'da ilkel int veya herhangi bir ilkel liste oluşturmanın bir yolu var mı

Hayır yapamazsın. Yalnızca gibi referans türlerinin listesi oluşturabilir Integer, Stringveya özel tip.

Görünüşe göre List myList = new ArrayList();bu listeye "int" ekleyebilirim.

intBu listeye eklediğinizde , otomatik olarak Integersarmalayıcı türüne göre kutulanır . Ancak daha yeni kodda ham tür listeleri veya bu konuda herhangi bir genel tür için kullanmak kötü bir fikirdir .

Bu listeye her şeyi ekleyebilirim.

Tabii ki, ham tip kullanmanın dezavantajı budur. Tek bir kapta Kedi , Köpek , Kaplan , Dinozor olabilir .

Tek seçeneğim, bir dizi int dizisi oluşturmak ve onu bir listeye dönüştürmek

Bu durumda da bir List<Integer>only alacaksınız . List<int>Herhangi bir ilkel yaratmanın hiçbir yolu yok .

Zaten rahatsız olmamalısın. İçinde bile ilkel türler List<Integer>ekleyebilirsiniz int. Aşağıdaki örnekte olduğu gibi, otomatik olarak kutulanacaktır:

List<Integer> list = new ArrayList<Integer>();
list.add(5);

Ham tip hakkında iyi tartışma.
Kevin Bowersox

Aslında, açık olmak gerekirse, sadece temel bir dizi kullanarak ilkel türler içeren bir liste oluşturabilirsiniz. int [] dizi = yeni int [10];
Taylor

1
@Taylor Ama bu dinamik olarak artan liste olmayacak. Bu bir dizi. Ve OP'nin bunu zaten bildiğini varsayıyorum.
Rohit Jain


5

Bu mümkün değil. Java belirtimi, ilkellerin jeneriklerde kullanılmasını yasaklar. Ancak oluşturabilir ArrayList<Integer>ve çağrı add(i)eğer iboks bir int sayesinde.


4

Eclipse Koleksiyonlarında bulunan ilkel koleksiyonları kullanabilirsiniz . Eclipse Koleksiyonları vardır List, Set, Bagve Maptüm öncülleri için. İlkel koleksiyonlardaki öğeler ilkel olarak korunur ve kutulama yapılmaz.

Bir IntList'i şu şekilde başlatabilirsiniz :

MutableIntList ints = IntLists.mutable.empty();

Bir dönüştürebilirsiniz List<Integer>için IntListböyle:

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);

Not: Eclipse Koleksiyonlarına katkıda bulunuyorum.


3

Koleksiyonlar, referans türlerini veya kartpostalları destekleyen jenerikler kullanır. Ancak bir Integersarmalayıcı kullanabilirsiniz

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

0

Android geliştirme için Java kullandığınızda SparseIntArray, intve arasında otomatik kutulamayı önlemek için kullanmanız önerilir Integer.

Sen daha ayrıntılı bilgi finde olabilir SparseIntArrayde Android Geliştirici belgelerini ve Android'de Autoboxing için iyi bir açıklama buraya bağlantı açıklama girin


Bu güçlü bir ifade. Kesinlikle SparseIntArraydaha iyi bir seçenektir, ancak farkında olunması gereken bazı ödünler vardır. "Uygulamanın, çok sayıda öğe içerebilen veri yapıları için uygun olması amaçlanmamıştır. Genellikle geleneksel bir HashMap'ten daha yavaştır ..."
Andy Thomas

Evet bu doğru. Bağladığım videoda bu değiş tokuşu oldukça iyi anlatıyorlar. Ancak OP bu özel olasılığı istedi ve ben sadece bunun Android ile mümkün olduğunu ve çoğu kullanım durumu için önerildiğini eklemek istedim. Bu bilgiyi eklediğiniz için teşekkürler!
Stefan Medack

0

Bir Tamsayı [] dizisini int [] dizisine dönüştürmenin bir yolu var mı?

Java çekirdek kitaplıklarındaki bu büyük ihmal, üzerinde çalıştığım hemen hemen her projede ortaya çıkıyor. Trove kitaplığı ne kadar uygun olsa da, bir LGPL kitaplığını statik olarak birbirine bağlayan bir Android uygulaması için LPGL'yi karşılamaya yönelik kesin gereksinimleri ayrıştıramıyorum (önsöz tamam diyor, gövde aynı şeyi söylemiyor gibi görünüyor). Ve bu sınıfları almak için Apache kaynaklarını söküp ayırmak tamamen sakıncalıdır. Daha iyi bir yol olmalı.


-4

Java Koleksiyonu yalnızca Object koleksiyonları olmalıdır.

List<Integer> integerList = new ArrayList<Integer>();

Tamsayı, int ilkel veri türünün sarmalayıcı sınıfıdır.

JAVA sarmalayıcı sınıflarından daha fazlasını burada bulabilirsiniz !

U, int'i doğrudan integerList'e / dan şu şekilde kaydedebilir ve alabilir: integerList.add(intValue); int intValue = integerList.get(i)


1
İlk satır derlenmez ve son iki kod satırı her yerdedir. Lütfen bunu yapmaktan kaçının.
The_Martian
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.