Soru Java'da uzun, çifte, bayt, char'ın amacı nedir?


Bu yüzden java öğreniyorum ve bir sorum var. Tipler öyle görünüyor int, boolean ve string belki de değişkenler açısından ihtiyacım olan her şey için iyi olacak, belki de float bir sayıya ondalık sayılar gerektiğinde kullanılabilir.

Sorum şu, diğer türler gibi long, double, byte, char vs. normal, günlük programlarda hiç kullanılmamış mı? Bunlar için kullanılabilecek bazı pratik şeyler nelerdir? Ne için varlar?


44
2018-01-06 09:27


Menşei


Bu soru neden oy kullanıldı, merak ediyorum? Sormak için makul bir şey gibi görünüyor ve google için kolay bir şey değil. - Ben


Cevaplar:


Muhtemelen biraz boşluk israfı olan "kısa" olası istisnai olarak - bazen tam anlamıyla, hepsi kurs için atlardır:

  • Bir int Kesirli sayılara ihtiyacınız olmadığında ve başka bir şey kullanmak için hiçbir nedeniniz olmadığında; Çoğu işlemci / OS yapılandırmasında, bu, makinenin en verimli şekilde çalışabileceği numaradır.
  • Kullanın çift Kesirli sayılara ihtiyaç duyduğunuzda ve başka bir şey kullanmak için hiçbir nedeniniz olmadığında;
  • Kullanın kömür Bir karakteri (veya iki baytlık imzasız aritmetiğe ihtiyaç duyduğunuz nadir durumlarda) temsil etmek istediğinizde;
  • Kullanın bayt Eğer ya özel bir işlem yapmanız gerekiyorsa imzalı bayt (nadir!) veya etrafında hareket etmeniz gerektiğinde blok bayttan;
  • Kullanın boole basit bir "evet / hayır" bayrağına ihtiyacınız olduğunda;
  • Kullanın uzun Tam sayıya ihtiyaç duyduğunuz, ancak büyüklüğün 2 milyarı aşabileceği durumlar için (dosya boyutları, milisaniye / nanosaniye cinsinden zaman ölçümleri, birkaç veri parçasının tek bir sayıya sıkıştırılması için gelişmiş kullanımlarda);
  • Kullanın şamandıra Ya (a) ya da büyük sayı bunlardan ve hafızadan tasarruf etmek faydalıdır, ya da (b) muazzam sayıda hesaplamave doğruluk kaybını göze alabilir. Çoğu uygulama için, "float" çok zayıf bir hassasiyet sunar, ancak işlemler iki kat daha hızlı olabilir - bunun aslında bunu bulmak için bunu işlemcinizde denemeye değer! [*]
  • Kullanın kısa gerçekten 2 bayt imzalı aritmetik gerekiyorsa. Çok fazla vaka yok ...

[*] Örneğin, Pentium mimarilerinde Hotspot'ta, float ve double işlemleri genellikle aynı zamanı alırbölümü hariç.

Bu türlerin bellek kullanımında fazla baltalamadığınız sürece Gerçekten mi anla. Örneğin:

  • her nesne boyutu 16 bayta yuvarlanır Hotspot'ta, tek bir bayt alanına sahip bir nesne, uzun veya çift alanlı tek bir nesne ile tam olarak aynı alanı alacaktır;
  • parametreleri bir yönteme geçirirken, her tür yığınta 4 veya 8 bayt alır: bir int parametresini bir metod parametresini değiştirerek bir şey kaydetmeyeceksiniz! (İnsanların bunu yaptığını gördüm ...)

Açıkçası, bazı API çağrıları vardır (örneğin, bazı sebeplerden ötürü CPU olmayan yoğun görevler için çeşitli çağrılar alır).

Dize ilkel bir tür olmadığını unutmayın, bu yüzden bu listede gerçekten bulunmuyor.


109
2018-01-06 13:57



Eğer kullandığınız tüm karakterler Unicode'un Temel Çok Dilli Düzlemi (BMP) içinde ise, yalnızca bir karakteri temsil ettiğini unutmayın. BMP'den çıktıktan sonra, Java'da karakter taşıma çok korkak. Sadece batı dillerini ele almanız gerekiyorsa, dikkat etmeniz gereken bir şey yok, ama bunun farkında olmalısınız. - sleske
Bakınız örn. Bu soru ve bir açıklama için cevap: stackoverflow.com/questions/2533097/java-unicode-encoding - sleske
Düşünebildiğim tek avantaj byte ve short İlkel, derleyicinin doğrudan depolanmasına izin vermesidir. byte[] ve short[] diziler izin vermez int typecast olmadan saklanmak. Başka avantaj var mı? - supercat
(ya da iki bayt imzasız aritmetiğe ihtiyacınız olan nadir durumlarda) ne? - JohnMerlino


Bir java int 32 bit, uzun bir süre 64 bit, bu yüzden 2 ^ 31'den büyük tam sayıları temsil etmeniz gerektiğinde, arkadaşınız uzun. Uzun kullanımının tipik bir örneği için bkz. System.currentTimeMillis ()

Bir bayt 8 bittir ve en modern adreste en küçük adreslenebilir varlıktır, bu nedenle bir dosyadan ikili veri okurken gereklidir.

Çifte bir kayan yüzeyin iki katı büyüklüğündedir, bu yüzden boyut veya hız üzerinde bazı kısıtlamalarınız olmadıkça ve bir yüzmenin yeterli kapasiteye sahip olmadıkça genellikle bir kayan nokta yerine bir çifte kullanabilirsiniz.

Kısa, iki bayt, 16 bittir. Benim düşünceme göre, bu en az gerekli veri türü ve gerçek kodda bunu görmedim, ama yine de, ikili dosya formatlarını okumak veya düşük seviyeli ağ protokolleri yapmak için yararlı olabilir. Örneğin ip port numaraları 16 bit.

Char, 16 bit olan tek bir karakteri temsil eder. Bu kısa ile aynı boyuttadır, ancak bir char işaretsiz iken kısa bir işaret (-32768 ila 32767) imzalanmıştır (0 ila 65535). (Bu, bir ip port numarasının muhtemelen bir char'dan daha doğru bir şekilde temsil edildiği anlamına gelir, ancak bu, chars için planlanan kapsamın dışında görünmektedir ...)

Bu detaylardaki gerçekten güvenilir kaynak için java dil belirtimi.


18
2018-01-06 09:37



İmzalanan ve imzasız bir şey olan bütün kısalar beni gerçekten rahatsız ediyor. Lütfen Bay Java, sadece "imzasız" değiştiriciyi ints için geri ver! :-) - Brian Knoblauch
Brian: Ben bayt, kısa ve char sayısal olmayan olmasını tercih ederim. Mantıklı, keyfi büyüklükte sayısal bir rasyonel tamsayı ile, int ve long non numeric de daha iyi. - Tom Hawtin - tackline
Kısa tip için bir kullanım durumu dizidir. Hafızada çok sayıda işlem yapmanız gerekiyorsa ve bunların hepsinin 16 bit'e sığacağını biliyorsanız, RAM'inizin% 50'sini int [] yerine kısa [] kullanarak kaydedebilirsiniz. crazysquirrel.com/computing/java/speed_and_memory/... - markusk


Bir göz atabilirsin İşte Java'daki ilkel türler hakkında.

Bu türler arasındaki ana ilgi hafıza kullanımıdır. Örneğin, int 32 bit kullanır bayt sadece 8 bit kullanır.

Büyük yapı üzerinde çalıştığınızı düşünün (diziler, matrisler ...), daha sonra bellek kullanımını azaltmak için kullandığınız türden daha iyi yararlanacaksınız.


3
2018-01-06 09:33





Sanırım bu türden türlerin birkaç amacı var:

1) İçlerinde saklanabilecek değişkenlerin büyüklüğü (ve işareti) üzerinde kısıtlamalar uygularlar.

2) Kodlara biraz netlik ekleyebilirler (örneğin, bir char kullanıyorsanız, o zaman kodu okuyan herkes, içinde saklamanızı planladığınız şeyi bilir).

3) Hafızayı kurtarabilirler. büyük bir sayı dizisi varsa, bunların tümü imzalanmamış ve 256'nın altındaysa, bir dizi bayt ilan ettiyseniz, bir dizi bayt olarak bildirebilirsiniz.

4) Saklamanız gereken sayılar 2 ^ 32'den büyük ve çok büyük kayan nokta sayıları için bir çiftse, uzun süre gerekir.


3
2018-01-06 09:35



2 ^ 32'den büyük sayılar için ihtiyaç duyulan çiftler hakkındaki noktayı düzeltin - David Schmitt
Ayy üzgünüm. Şimdi düzeltildi. - Ben
kesin değerler için iki kat daha kullanışlı; büyüklük şey daha az önemlidir. Nokta (1) "saklanacak taşma hatalarına neden olur" olmalıdır. - Tom Hawtin - tackline


İlkel veri türleri, her karmaşık koleksiyonun temeli olduğu için gereklidir.

Uzun, çift, bayt vb. sadece küçük bir tam sayıya (veya herhangi bir şeye) ihtiyacınız varsa, yığın alanınızı boşa harcamazsanız kullanılır.

Biliyorum, zamanımızda yeterli miktarda RAM var, ama onu boşa harcamalısın.

Veritabanı ve akış işlemleri için "küçük olanlara" ihtiyacım var.


0
2018-01-06 09:32





tamsayılar genel olarak sayılarda kullanılmalıdır.
çiftler ondalık sayıları temsil etmek için kullanılan temel veri türüdür.
Teller esas olarak herhangi bir veri tipini tutabilir, ancak inters kullanımı daha kolaydır ve metin haricinde string kullanmak için kafa karıştırıcıdır.
karakter sadece bir harf tutmak istediğinizde kullanılırlar, ancak esas olarak sadece açıklık için.
Şortlar, uzunlar ve yüzer gerekli olmayabilir, ancak, örneğin, yalnızca 1000'den daha az sayıları tutmak için gereken bir büyüklükte 1.0000 dizisi oluşturuyorsanız, o zaman sadece yer kazanmak için şort kullanmak istersiniz.


0
2017-12-15 19:56





Uğraştığın verilere göre. Sadece az miktarda veriyle uğraşırken büyük bir bellek bölümünü saklayan bir veri türü kullanmanın bir anlamı yoktur. Örneğin, çok fazla veri türü, kullanılmadan önce belleği saklar. Örneğin, dizileri yalnızca 4 baytlık kullanıyor olsanız bile, varsayılan bir miktar (örneğin, 256 bayt <- bir örnek!) Ayırırlar.

Bu bağlantıya bakın cevabın için


-1
2018-01-06 09:32



Bunu sormadan önce bunu okuyordum ve anlamadım, bu yüzden downvoted - Click Upvote
Dizilerde havai o kadar büyük olmamalı. Daha fazla 16 bayt. - Tom Hawtin - tackline
Bir örnek oldu. - Kezzer