İnsanlar neden Java'da hala ilkel türler kullanıyor?


163

Java 5'ten beri, ilkel türlerin boksu / kutudan çıkarılması vardı, böylece intsarılmış java.lang.Integervb.

Son zamanlarda kullanmak için bir sürü yeni Java projesi görüyorum ( kesinlikle en az sürüm 5'in bir JRE'sini gerektirir), intyerine java.lang.Integerkullanmak için çok daha uygun olsa da, dönüştürmek için birkaç yardımcı yöntem olduğu için için longdeğerler ve diğ.

Neden bazıları hala Java'da ilkel türleri kullanıyor? Maddi bir fayda var mı?


49
hiç bellek tüketimi ve performansı hakkında düşündünüz mü?
Tedil

76
Otomatik boks etiketini ekledim ... ve üç kişinin bunu takip ettiğini öğrendim. Gerçekten mi? Kullanıcılar AUTOBOXING etiketini takip ediyor mu?
corsiKa

4
@glowcoder Onlar gerçek insanlar değil, sadece SO'ya cevap vermesi için bir insan formunu kabul eden soyut kavramlar. :)
biziclop

9
@TK Kocheran Çoğunlukla new IntegeR(5) == new Integer(5)kurallar gereği yanlış olarak değerlendirilir.
biziclop

10
İlkel türlerin koleksiyonlarına çözümler için GNU Trove veya Mahout Koleksiyonları veya HPPC veya ... konusuna bakın. Hızı önemseyen bizler zamanımızı daha az değil, daha ilkel türler kullanarak geçiririz .
bmargulies

Yanıtlar:


395

Joshua Bloch'un Etkili Java'sında , Madde 5: "Gereksiz nesneler oluşturmaktan kaçının", aşağıdaki kod örneğini yayınlar:

public static void main(String[] args) {
    Long sum = 0L; // uses Long, not long
    for (long i = 0; i <= Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);
}

ve koşması 43 saniye sürer. Long'u ilkele sokmak onu 6.8 saniyeye indirir ... Bu ilkel neden kullandığımızın bir göstergesi ise.

Yerel değer eşitliğinin olmaması da bir endişe kaynağıdır ( .equals()ile karşılaştırıldığında oldukça ayrıntılıdır ==)

biziclop için:

class Biziclop {

    public static void main(String[] args) {
        System.out.println(new Integer(5) == new Integer(5));
        System.out.println(new Integer(500) == new Integer(500));

        System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
        System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
    }
}

Sonuçlar:

false
false
true
false

EDIT (3) neden geri dönüyor trueve (4) geri dönüyor false?

Çünkü onlar iki farklı nesne. Sıfıra en yakın 256 tam sayı [-128; 127] JVM tarafından önbelleğe alınır, böylece bunlar için aynı nesneyi döndürürler. Bu aralığın ötesinde, önbelleğe alınmazlar, böylece yeni bir nesne oluşturulur. İşleri daha karmaşık hale getirmek için JLS, en az 256 sinek ağırlığının önbelleğe alınmasını talep ediyor . JVM uygulayıcıları istedikleri zaman daha fazlasını ekleyebilirler, yani bu en yakın 1024'ün önbelleğe alındığı ve hepsinin doğru döndüğü bir sistemde çalışabilir ... #awkward


54
Şimdi ide beyan edilmiş olup olmadığını hayal edin Long!
ColinD

14
@TREE - teknik özellik aslında VM'lerin belirli bir aralıkta sinek ağırlıkları oluşturmasını gerektirir . Ancak ne yazık ki bu aralığı genişletmelerine izin veriyor , yani programlar farklı sanal makinelerde farklı davranabilir. Çapraz platform için çok fazla ...
Daniel Earwicker

12
Java gittikçe daha kötü tasarım seçenekleriyle boşa gitti. Otomatik boks tam bir hatadır, sağlam, öngörülebilir veya taşınabilir değildir. Gerçekten ne düşündüklerini gerçekten merak ediyorum ... korkunç ilkel nesne ikilemini düzeltmek yerine ilk etapta olduğundan daha kötü hale getirmeyi başardılar.
Pop Catalin

34
@Catalin Sizinle otomatik boksun tamamen başarısız olduğunu kabul etmiyorum. Kullanılabilecek diğer tasarımlardan (hiçbir şey dahil) farklı olmayan bazı kusurları var. Neleri bekleyebileceğiniz ve bekleyemeyeceğinizi çok açık hale getiriyorlar ve geliştiricilerin sözleşmeleri bilmesini ve bunlara uymasını bekledikleri diğer tüm tasarımlar gibi bu tasarımların.
corsiKa

9
@NaftuliTzviKay Bu bir "başarısızlık" değil. Onlar yapmak çok açık olduğunu ==operatör gerçekleştirdiği üzerinde kimlik karşılaştırmaları başvuru Integerüzerine ifadelerin ve değer eşitliği karşılaştırmalar intifadeler. Integer.equals()bu nedenle var. Sen gerektiğini asla kullanmak ==olmayan herhangi bir ilkel tip değerleri karşılaştırmak için. Bu Java 101.
NullUserException

86

Otomatik kutudan ayrılması zor NPE'lere yol açabilir

Integer in = null;
...
...
int i = in; // NPE at runtime

Çoğu durumda null atama, inyukarıdakinden çok daha az belirgindir.


43

Kutulu tipler daha düşük performansa sahiptir ve daha fazla bellek gerektirir.


40

İlkel tipler:

int x = 1000;
int y = 1000;

Şimdi değerlendirin:

x == y

Öyle true. Çok şaşırtıcı değil. Şimdi kutulu türleri deneyin:

Integer x = 1000;
Integer y = 1000;

Şimdi değerlendirin:

x == y

Öyle false. Muhtemelen. Çalışma zamanına bağlıdır. Bu sebep yeterli mi?


36

Performans ve bellek sorunlarının yanı sıra başka bir sorun daha ortaya çıkarmak istiyorum: ListArayüz olmadan bozulacaktı int.
Sorun aşırı yüklenmiş remove()yöntemdir ( remove(int)vs. remove(Object)). remove(Integer)her zaman ikincisini çağırmaya karar verir, böylece bir öğeyi dizine göre kaldıramazsınız.

Öte yandan, bir eklemeye ve kaldırmaya çalışırken bir tuzak var int:

final int i = 42;
final List<Integer> list = new ArrayList<Integer>();
list.add(i); // add(Object)
list.remove(i); // remove(int) - Ouch!

7
Kırılır, evet. Ancak, remove (int) bir tasarım hatası IMO'dur. Karışımın en ufak bir şansı varsa yöntem adları asla aşırı yüklenmemelidir.
MrBackend

4
@MrBackend Fuarı yeterince. İlginçtir, en başından beri Vectorvardı removeElementAt(int). remove(int)Java 1.2 koleksiyon çerçevesiyle tanıtıldı.
xehpuk

6
@MrBackend: ListAPI tasarlandığında ne Generics ne de Autoboxing yoktu, bu yüzden karıştırma şansı yoktu remove(int)ve remove(Object)
Holger

@Franklin Yu: elbette, ancak uyumluluk kısıtlamaları olmadan yeni bir dil / sürüm tasarlarken, bu talihsiz aşırı yükü değiştirmeyi bırakmazsınız. İlkel ve kutulu değerlerin ayrımından tamamen kurtulursunuz, böylece hangi sorunun kullanılacağı asla ortaya çıkmaz.
Holger

27

Gerçekten hayal edebiliyor musun

  for (int i=0; i<10000; i++) {
      do something
  }

bunun yerine java.lang.Integer ile döngü? Bir java.lang.Integer değişmezdir, bu nedenle döngü etrafındaki her artış, tek bir JVM komutuyla yığıntaki int değerini artırmak yerine yığın üzerinde yeni bir java nesnesi oluşturur. Performans şeytani olur.

Gerçekten java.lang.Integer kullanmak int çok daha uygun olduğunu kabul etmiyorum. Aksine. Otomatik kutulama, int'i aksi halde Tamsayı kullanmaya zorlayabileceğiniz bir yerde kullanabileceğiniz anlamına gelir ve java derleyicisi sizin için yeni Integer nesnesini oluşturmak için kod eklemeyle ilgilenir. Otomatik kutulama, derleyicinin ilgili nesne yapısını ekleyerek bir Tamsayı beklenen yerlerde bir int kullanmanıza izin vermekle ilgilidir. Başlangıçta int ihtiyacını hiçbir şekilde ortadan kaldırmaz veya azaltmaz. Otomatik boks ile her iki dünyanın da en iyisini elde edersiniz. Bir yığın tabanlı java nesnesine ihtiyacınız olduğunda sizin için otomatik olarak oluşturulan bir Tamsayı alırsınız ve yalnızca aritmetik ve yerel hesaplamalar yaparken int'in hızını ve verimliliğini elde edersiniz.


19

İlkel türler çok daha hızlıdır:

int i;
i++;

Tamsayı (tüm Sayılar ve ayrıca bir Dize) değişmez bir türdür: oluşturulduktan sonra değiştirilemez. Eğer idaha Tamsayı oldu i++çok daha pahalı bellek ve işlemci bakımından - Yeni bir Integer nesnesi yaratacak.


Bir değişkenin i++başka bir değişken üzerinde yaparsanız değişmesini istemezsiniz , bu nedenle Integer'ın bunu yapabilmesi için değişmez olması gerekir (veya en azından bunun i++yeni bir Integer nesnesi oluşturması gerekir). (Ve ilkel değerler de değişmezdir - sadece nesne olmadığı için bunu
söylemezsiniz

4
@ Paŭlo: İlkel değerlerin değişmez olduğunu söylemek anlamsızdır. İlkel bir değişkeni yeni bir değere yeniden atadığınızda, yeni bir şey oluşturmazsınız. Herhangi bir bellek ayırma işlemi söz konusu değildir. Peter'ın anlamı şu: Bir ilkel için i ++, bellek ayırma yapmaz, ancak bir nesne için mutlaka gerekir.
Eddie

@Eddie: (Hafıza tahsisine ihtiyaç duymaz, ayrıca önbelleğe alınmış bir değer de döndürebilir. Bazı küçük değerler için, sanırım.) Demek istediğim, Tamsayıların değişmezliğinin karar verme noktası olmaması, yine de değişmezliğe bakılmaksızın başka bir nesneye sahip olmak.
Paŭlo Ebermann

@ Paŭlo: Tek amacım Integer'ın ilkellerden daha yavaş bir büyüklük sırası olmasıydı. Ve bu kutulu tiplerin değişmez olmasından ve her değiştiğinizde yeni bir nesne yaratılmasından kaynaklanmaktadır. Onlarda yanlış bir şey olduğunu veya değişmez olduklarını iddia etmedim. Sadece daha yavaş olduklarını ve bir kodlayıcının bunu bilmesi gerektiğini. Groovy'nin
Peter Knego

1
Değişmezlik ve ++burada kırmızı bir ringa balığı. Java düşünün gerçekten basit bir şekilde aşırı destek operatöre geliştirilmiştir gibi bir sınıf (örneğin eğer Integerbir yöntemi vardır plus, o zaman yazabilirim i + 1yerine i.plus(1). Ve derleyici genişletmek için akıllı yeterli olduğunu da varsayalım i++içine i = i + 1. Şimdi söyleyebiliriz i++ve değişken olarak etkili bir şekilde "i Integerdeğişkenini
artırın

16

Her şeyden önce alışkanlık. Java'da sekiz yıl kod yazdıysanız, kayda değer miktarda atalet biriktirirsiniz. Zorlayıcı bir neden yoksa neden değişsin? Kutulu ilkelleri kullanmanın herhangi bir ekstra avantajı varmış gibi değil.

Diğer neden nullgeçerli bir seçenek olmadığını iddia etmektir. İki sayının veya bir döngü değişkeninin toplamını olarak bildirmek anlamsız ve yanıltıcı olacaktır Integer.

Performans yönü de var, ancak performans farkı birçok durumda kritik olmasa da (oldukça kötü olsa da), kimse zaten daha hızlı bir şekilde daha kolay yazılabilecek bir kod yazmayı sevmiyor alışığım.


15
Katılmıyorum. Performans yönü kritik olabilir. Bunun çok azı muhtemelen eylemsizlik veya alışkanlık gücüdür.
Eddie

7
@Eddie Olabilir, ama çok nadiren. Güven bana, çoğu insan için performans argümanları sadece bir bahane.
biziclop

3
Ben de performans argümanını korumak istiyorum. Dalvik ile Android'de oluşturduğunuz her nesne, GC'nin "riskini" artıracak ve daha fazla nesne duraklatıldığında daha uzun olacaktır. Bu yüzden bir döngüde int yerine Tamsayılar oluşturmak muhtemelen bazı atlanan karelere mal olacaktır.
Igor Čordaš

1
@PSIXO Adil bir nokta, bunu sadece sunucu tarafı Java düşünerek yazdım. Mobil cihazlar tamamen farklı bir hayvandır. Ama benim açımdan, performansa bakılmaksızın korkunç bir kod yazan geliştiriciler bile bunu bir sebep olarak gösterecekti, onlardan bu bir bahane gibi geliyor.
biziclop

12

Bu arada, Smalltalk'ın yalnızca nesneleri (ilkelleri yok) vardır ve yine de küçük tam sayılarını (32 bitin tümünü değil, sadece 27 veya benzeri) kullanarak herhangi bir yığın alanı ayırmayacak, ancak özel bir bit deseni kullanacak şekilde optimize ettiler. Ayrıca diğer ortak nesnelerin (doğru, yanlış, boş) burada özel bit kalıpları vardı.

Bu nedenle, en azından 64 bit JVM'lerde (64 bit işaretçi ad alanı ile), herhangi bir Tamsayı, Karakter, Bayt, Kısa, Boole, Kayan Nokta (ve küçük Uzun) nesnelerinin (bunların oluşturulmuş olanlar dışında) olması mümkün olmamalıdır açık bir şekilde new ...()), sadece normal operatörler tarafından oldukça verimli bir şekilde manipüle edilebilen özel bit kalıpları.


"Bazı uygulamalar" demeliydim, çünkü bu dil şartnameleri tarafından yönetilmiyor. (Ve ne yazık ki burada herhangi bir kaynak gösteremiyorum, sadece bir yerde duyduğumdan.)
Paŭlo Ebermann

ŭlo, JIT zaten işaretçide meta tutar; dahil, işaretçi GC bilgilerini veya Klass'ı tutabilir (Sınıfı optimize etmek, daha az bakım yapabileceğim Tamsayıları optimize etmekten çok daha iyi bir fikirdir). İşaretçiyi değiştirmek, her işaretçi yüklenmesinden önce / cmp / jnz kodunu (veya bunun gibi bir şeyi) kaydırmayı gerektirir. Şube muhtemelen donanım tarafından çok iyi tahmin edilmeyecektir (hem Değer Türü hem de normal Nesne olabileceğinden) ve performans isabetine yol açacaktır.
bestsss

3
Smalltalk'i birkaç yıldır yaptım. Optimizasyon hala oldukça pahalıydı, çünkü int'teki her işlem için bunların maskesini kaldırmak ve yeniden uygulamak zorundaydılar. Şu anda java, ilkel sayıları işlerken C ile eşittir. Maskeyi kaldır + maske ile büyük olasılıkla>% 30 daha yavaş olacaktır.
R.Moeller

9

Kimsenin en önemli sebep olduğunu düşündüğümden bahsetmediğine inanamıyorum: "int" yazmak, "Tamsayı" dan çok daha kolay. Bence insanlar kısa bir sözdiziminin önemini hafife alıyorlar. Performans gerçekten onlardan kaçınmak için bir neden değildir, çünkü çoğu zaman sayıları kullandığınızda döngü dizinlerinde bulunur ve bu maliyetlerin artırılması ve karşılaştırılması önemsiz olmayan herhangi bir döngüde (int veya Integer kullanıyor olsanız da) hiçbir maliyeti yoktur.

Diğer bir neden ise NPE'leri alabilmenizdi, ancak kutulu türlerle kaçınılması son derece kolaydır (ve her zaman null olmayan değerlere başlattığınız sürece kaçınılması garanti edilir).

Diğer neden ise (new Long (1000)) == (new Long (1000)) 'in yanlış olması, ancak bu ".equals" ın kutulu türler için sözdizimsel desteği olmadığını söylemenin başka bir yolu (operatörlerin <,> , =, vb.), "basit sözdizimi" nedenine geri dönüyoruz.

Bence Steve Yegge'in ilkel olmayan döngü örneği benim açımı çok iyi gösteriyor: http://sites.google.com/site/steveyegge2/language-trickery-and-ejb

Şunu düşünün: Runnable ve Callable ve isimsiz sınıflar.


8

İlkellerden kurtulmamak için birkaç neden:

  • Geriye dönük uyumluluk.

Elimine edilirse, eski programlar bile çalışmaz.

  • JVM yeniden yazma.

JVM'nin tamamı bu yeni şeyi desteklemek için yeniden yazılmalıdır.

  • Daha büyük bellek alanı.

Daha fazla bellek kullanan değeri ve referansı saklamanız gerekir. Çok sayıda baytınız varsa, byte's' kullanmak 's' den önemli ölçüde daha küçüktür Byte.

  • Boş gösterici sorunları.

int iSonra bir şeyler yapmak bildirmek sorun yaratmaz i, ancak Integer ibunu bildirmek ve sonra yapmak bir NPE ile sonuçlanır.

  • Eşitlik sorunları.

Bu kodu düşünün:

Integer i1 = 5;
Integer i2 = 5;

i1 == i2; // Currently would be false.

Yanlış olur. Operatörlerin aşırı yüklenmesi gerekecek ve bu da büyük bir yeniden yazma ile sonuçlanacaktır.

  • Yavaş

Nesne sarmalayıcıları ilkel muadillerinden önemli ölçüde yavaştır.


i1 == i2; yalnızca i1> = 128 olduğunda yanlış olur. Dolayısıyla, mevcut örnek yanlış
Geniy

7

Nesneler ilkel tiplerden çok daha ağırdır, bu nedenle ilkel tipler sarıcı sınıf örneklerinden çok daha verimlidir.

İlkel tipler çok basittir: örneğin bir int 32 bittir ve bellekte tam olarak 32 bit alır ve doğrudan manipüle edilebilir. Bir Tamsayı nesnesi, (herhangi bir nesne gibi) öbek üzerinde depolanması gereken ve ona yalnızca bir referans (işaretçi) aracılığıyla erişilebilen tam bir nesnedir. Büyük olasılıkla 32 bit'ten (4 bayt) fazla bellek alır.

Bununla birlikte, Java'nın ilkel ve ilkel olmayan türler arasında bir ayrımı olması, Java programlama dilinin yaşının bir işaretidir. Daha yeni programlama dillerinde bu ayrım yoktur; basit bir değer veya daha karmaşık nesneler kullanıyorsanız, böyle bir dilin derleyicisi kendi başına anlamaya yetecek kadar akıllıdır.

Örneğin, Scala'da ilkel tipler yoktur; tamsayılar için bir Int sınıfı vardır ve bir Int gerçek bir nesnedir (üzerinde yöntemler vs. yapabilirsiniz). Derleyici kodunuzu derlediğinde, sahnelerin arkasında ilkel ints kullanır, bu nedenle Int kullanmak Java'da ilkel int kullanmak kadar etkilidir.


1
JRE'nin Java sargılı ilkellerle de bunu yapmak için yeterince "akıllı" olacağını düşünürdüm. Başarısız.
Naftuli Kay

7

Diğerlerinin söylediklerine ek olarak, ilkel yerel değişkenler öbekten değil, yığına ayrılır. Ancak nesneler öbekten ayrılır ve bu nedenle çöp toplanması gerekir.


3
Üzgünüm, bu yanlış. Akıllı bir JVM, herhangi bir nesne tahsisinde kaçış analizi yapabilir ve kaçamazlarsa bunları yığına tahsis edebilir.
rlibby

2
Evet, bu modern JVM'lerin bir özelliği olmaya başlıyor . Beş yıl içinde, söyledikleriniz çoğu JVM için o zaman kullanımda olacak. Bugün değil. Neredeyse bu konuda yorum yaptım, ama yorum yapmamaya karar verdim. Belki de bir şey söylemeliydim.
Eddie

6

İlkel türlerin birçok avantajı vardır:

  • Yazmak için daha basit kod
  • Değişken için bir nesne somutlaştırmadığınız için performans daha iyidir
  • Bir nesneye yapılan bir referansı temsil etmedikleri için null değerlerini kontrol etmeye gerek yoktur
  • Boks özelliklerinden yararlanmanız gerekmediği sürece ilkel türleri kullanın.

5

Kapakların altında ne tür optimizasyonların yapıldığını bilmek zor.

Yerel kullanım için, derleyici boş değer olasılığı dışında optimizasyon yapmak için yeterli bilgiye sahip olduğunda , performansın aynı veya benzer olmasını beklerim .

Bununla birlikte, ilkel dizileri , kutulu ilkel koleksiyonlarından çok farklıdır . Bu, bir koleksiyon içinde çok az optimizasyonun mümkün olduğu göz önüne alındığında mantıklıdır.

Ayrıca, ile karşılaştırıldığında Integerçok daha yüksek bir mantıksal yüke sahiptir int: şimdi int a = b + c;bir istisna atıp atmama konusunda endişelenmeniz gerekiyor .

İlkelleri olabildiğince çok kullanırdım ve bana ihtiyaç duyduklarında daha semantik olarak güçlü kutulu türleri vermek için fabrika yöntemlerine ve otomatik kutuya güvenirdim.


5
int loops = 100000000;

long start = System.currentTimeMillis();
for (Long l = new Long(0); l<loops;l++) {
    //System.out.println("Long: "+l);
}
System.out.println("Milliseconds taken to loop '"+loops+"' times around Long: "+ (System.currentTimeMillis()- start));

start = System.currentTimeMillis();
for (long l = 0; l<loops;l++) {
    //System.out.println("long: "+l);
}
System.out.println("Milliseconds taken to loop '"+loops+"' times around long: "+ (System.currentTimeMillis()- start));

Uzun: 468 civarında '100000000' kez döngü için alınan milisaniye

Milisaniye '100000000' kez uzun döngü için alınır: 31

Yan not etmek gerekirse, böyle bir şeyin Java'ya dönüştüğünü görmenin sakıncası olmaz.

Integer loop1 = new Integer(0);
for (loop1.lessThan(1000)) {
   ...
}

For döngüsü otomatik olarak loop1 değerini 0'dan 1000'e yükseltirse veya

Integer loop1 = new Integer(1000);
for (loop1.greaterThan(0)) {
   ...
}

For döngüsü otomatik olarak loop1 1000'i 0'a düşürür.


2
  1. Matematiksel işlemler yapmak için ilkellere ihtiyacınız var
  2. Temel öğeler yukarıda yanıtlandığı gibi daha az bellek ve daha iyi performans gösterir

Sınıf / Nesne türünün neden gerekli olduğunu sormalısınız

Nesne türüne sahip olmanın nedeni Koleksiyonlarla uğraşırken hayatımızı kolaylaştırmaktır. Temel öğeler doğrudan Liste / Haritaya eklenemez, bunun yerine bir sarmalayıcı sınıfı yazmanız gerekir. Hazır Integer türü Sınıflar burada size yardımcı olur ve Integer.pareseInt (str) gibi birçok yardımcı yöntem vardır


2

Önceki cevaplara katılıyorum, ilkel sarmalayıcı nesneleri kullanmak pahalı olabilir. Ancak, uygulamanızda performans kritik değilse, nesneleri kullanırken taşmaları önlersiniz. Örneğin:

long bigNumber = Integer.MAX_VALUE + 2;

Değeri bigNumber-2147483647'dir ve 2147483649 olmasını beklersiniz. Bu kodda yaparak düzeltilecek bir hata:

long bigNumber = Integer.MAX_VALUE + 2l; // note that '2' is a long now (it is '2L').

Ve bigNumberbazen cevapsız kolaydır ve bilinmeyen davranış veya güvenlik yol açabilir böcek Bu tür 2147483649. olurdu (bkz CWE-190 ).

Sarıcı nesneleri kullanırsanız, eşdeğer kod derlenmez.

Long bigNumber = Integer.MAX_VALUE + 2; // Not compiling

Bu nedenle, ilkel sarmalayıcı nesneleri kullanarak bu tür sorunları durdurmak daha kolaydır.

Sorunuz çoktan cevaplandı, daha önce bahsetmediğim biraz daha fazla bilgi eklemek için cevap veriyorum.


1

Çünkü JAVA tüm matematiksel işlemleri ilkel tiplerde yapar. Bu örneği düşünün:

public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i: li)
        if (i % 2 == 0)
            sum += i;
        return sum;
}

Burada, hatırlatıcı ve tekli artı işlemleri Tamsayı (Referans) türüne uygulanamaz, derleyici kutudan çıkarmayı gerçekleştirir ve işlemleri yapar.

Bu nedenle, java programında kaç tane otomatik boks ve kutudan çıkarma işlemi gerçekleştirildiğinden emin olun. Bu nedenle, bu işlemleri gerçekleştirmek zaman alır.

Genel olarak, Referans ve ilkel türün sonucunu içeren argümanları tutmak daha iyidir.


1

İlkel türleri şunlardır çok daha hızlı ve çok gerektiren daha az bellek . Bu nedenle, bunları kullanmayı tercih edebiliriz.

Öte yandan, mevcut Java dili belirtimi, parametreli türlerde (jenerikler), Java koleksiyonlarında veya Yansıma API'sında ilkel türlerin kullanılmasına izin vermez.

Uygulamamız çok sayıda öğeye sahip koleksiyonlara ihtiyaç duyduğunda, mümkün olduğunca daha “ekonomik” tip dizileri kullanmayı düşünmeliyiz.

* Ayrıntılı bilgi için kaynağa bakın: https://www.baeldung.com/java-primitives-vs-objects


0

Özetlemek gerekirse: ilkel türler daha hızlıdır ve kutulu olanlardan daha az bellek gerektirir

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.