Long vs Integer, long vs int, ne zaman ve ne zaman kullanılır?


Yanıtlar:


191

Longolduğu Objectşekli longve Integernesne şeklidir int.

longKullandığı 64 bit . intKullanımları 32 bit, ve bu yüzden sadece ± 2 milyar (-2 numara tutabilir 31 +2 31 1).

Kullanmanız gerekir longve intkaldığı yerden miras kalan yöntemleri kullanmanız gerektiği Objectdurumlar gibi hashcode. Java.util.collectionsyöntemler genellikle kutulu ( Objectsarılmış) sürümleri kullanır, çünkü herhangi biri için çalışması gerekir Objectve intya da gibi ilkel bir tür longbir değildir Object.

Diğer bir fark, longve inther bir temelde olmayan Java türlerinde olduğu gibi , Longve Integerher bir değere göre geçiş değeri olmasıdır . Yani bir LongveyaInteger (değil, JNI kodu kullanmadan değişmezler), birini diğerinin üzerinde kullanmanın başka bir nedeni olurdu.

Son bir fark a Longveya Integerolabilir null.


5
@Borealid, bu çok yanlış, Java her zaman değere göre geçiyor, Java'da referansla geçme gibi bir şey yok.
Diego Ramos

9
HI-hı? Tamam, Java'nın asla bir referans geçmediği fikrini keşfedelim. Bir int [2] veren bir işlev çağırırsam ve sonra işlevin içinde bu dizinin ilk öğesinde tutulan değeri değiştirirsem, işlevin arayanı bu değişikliği görecek mi? Evet? Çünkü işleve iletilenler dizideki değerler değil, bu değerlere bir referanstı. "Değere göre geç", gerçek verilerin kendisinin dolaylı olarak kopyalanmayacağı anlamına gelir. Kim size Java'nın katma değer olduğunu öğretti, size bir kötülük yaptı.
Borealid

3
@Borealid yanlışsanız, diziye yapılan başvurunun yeni bir kopyası oluşturulduğu için değer değiştirilir, bu nedenle işlevi arayan her kişi değişikliği görür, bu yine de değere göre geçer. Java'da referans ile geçiş olduğunu söylediğine inanamıyorum. Asla işleve orijinal başvuruyu iletmezsiniz.
Diego Ramos

6
Java'nın gerçekte olduğundan tamamen farklı davrandığı ve bir nesneye veya diziye bir işleve geçmenin (işlev içindeki değişikliklerin arayanlara hiç yansımadığı) teorik bir dünyada, nasıl dili tarif etmek? Bahsettiğimiz şeyin Java'nın aslında yaptığı şey olmadığını unutmayın.
Borealid

2
@DiegoRamos haklı. Java her zaman değere göre geçer, karışıklık yaratılır, çünkü ilkel olmayan bir bellek başvurusu olduğunda değerdir, statik takas java'da
Panthro

28

İlkel tipte yapamayacağınız birkaç şey var:

  • Bir nulldeğere sahip olun
  • onları senkronize et
  • Bunları genel bir sınıf için type parametresi olarak kullanın ve bununla ilgili:
  • Onları Objects ile çalışan bir API'ya geçirin

Bunlardan herhangi birine ihtiyacınız yoksa, daha az bellek gerektirdiğinden ilkel türleri tercih etmelisiniz.


24
  • Varsayılan olarak intsayıları tutarken bir , kullanın .
  • Aralığı intçok küçükse,long
  • Aralığı longçok küçükse,BigInteger
  • Sayılarınızı nesne olarak ele almanız gerekiyorsa (örneğin, a Collection, işleme null, ... içine koyarken ) Integer/ Longkullanın

13

An int, 32 bitlik bir tam sayıdır; a long64 bitlik bir tam sayıdır. Hangisini kullanacağınız, çalışmayı beklediğiniz sayıların büyüklüğüne bağlıdır.

intve longilkel türlerken, Integerve Longnesnelerdir. İlkel türler daha verimlidir, ancak bazen nesneleri kullanmanız gerekir; Eğer tamsayılar listesini gerekirse örneğin, Java'nın koleksiyon sınıfları nesnelerle ki ancak, bu yüzden bunu bir yapmak zorunda List<Integer>örneğin (eğer kullanamaz, intbir de Listdoğrudan).


6

Tamsayı işaretli bir 32 bit tamsayı türüdür

  • Olarak belirtildi Int
  • Boyut = 32 bits (4byte)
  • Aralık tamsayılarını tutabilir -2,147,483,648 to 2,147,483,647
  • varsayılan değer 0


Long , işaretli bir 64 bit tam sayı türüdür

  • Olarak belirtildi Long
  • Boyut = 64 bits (8byte)
  • Aralık tamsayılarını tutabilir -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • varsayılan değer 0L


Değişken kullanımınız 32 bit aralığına düşüyorsa, kullanın Int, kullanın long. Genellikle uzun bilimsel hesaplamalarda kullanılır ve bunun gibi şeyler çok fazla doğruluk gerektirir. (örn. pi değeri).

Birini diğerinden seçmenin bir örneği YouTube'un davasıdır. İlk olarak video görüntüleme sayacını intpopüler bir videoya alındığında 2,147,483,647'den fazla görüntüleme olduğunda taşmış olarak tanımladılar . Bir Intsayaç, aralığından daha fazla değer depolayamadığından, YouTube sayacı 64 bitlik bir değişken olarak değiştirdi ve şimdi 9,223,372,036,854,775,807 görüntülemeye kadar sayabilir. Verilerinizi anlayın ve 64 bit değişken olarak uygun olan türü seçin, 32 bit değişkenten daha fazla bellek alır.


1

Temsil etmek için 32 biti aşabilecek çok uzun bir sayı kullanıldığında, garip davranmayacağınızdan emin olmak için uzun kullanabilirsiniz.

Java 5'ten, int ve Integer kullanımını tamamen aynı hale getirmek için kutu içi ve kutu dışı özelliklerini kullanabilirsiniz. Bu, şunları yapabileceğiniz anlamına gelir:

int myInt = new Integer(11);
Integer myInt2 = myInt;

Ve boks dışarı için aynı (herhangi bir ek dönüşüm olmadan int ve Tamsayı arasında geçiş yapmak için izin Long, Double,Short çok)

Her intzaman kullanabilirsiniz , ancak Integertamsayılarla (örneğin Integer.parseInt(String)) bazı karmaşık işlemleri gerçekleştirmenize yardımcı olabilecek bazı yardımcı yöntemler içerir.


0

a) nesne Sınıf "Uzun" ile ilkel tip "uzun". (En azından Java ile)

b) İlkel türlerin farklı (hatta belirsiz) bellek boyutları vardır:

Java - hepsi açık: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • bayt, karakter .. 1B .. 8b
  • kısa int .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • uzun int .. 8B .. 64b

C. sadece karışıklık: https://en.wikipedia.org/wiki/C_data_types

  • kısa .. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • uzun .. .. 32b
  • uzun uzun .. 64b .. karışıklık! : - /

Bu, Uzun ve uzun vb arasındaki farkla ilgili soruya cevap vermez
GreenAsJade

Hayır, açıkça cevap vermez, ilkel türler ile veri türü nesneler arasındaki farkı, aslında @GreenAsJade'yi söylemez, çünkü yukarıdaki soru belirli bir dili belirtmez. Bu yüzden bir karşılaştırma yaptım - böylece herkes farkı kontrol edebilir. (belirtildiği gibi sabit verilerden)
Franta

Soru Java'yı belirtti.
GreenAsJade
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.