Java ile Boolean karşılaştırması


197

Java'da Integervs etrafında tartışmalar var int. Birincinin varsayılan değeri nullikincisinde iken 0. Peki ya Booleanvs boolean?

Uygulamamdaki bir değişkenin 0/ 1değerleri olabilir. Kullanmak istiyorum boolean/ Booleanve kullanmamayı tercih ediyorum int. Boolean/ booleanYerine kullanabilir miyim ?


2
Sistem tasarımı nedenleriyle, "Kullanıcı henüz karar vermedi" seçeneğine sahip olduğu için Boolean'ı seçerdim, bu ne "doğru" ne de "yanlış" ile aynı değildir. Yalnızca% 100 doğru / yanlış seçeneklerin yeterli olduğundan eminsem boolean ilkel kullanırım. Veritabanında NULL seçeneği genellikle sorunsuz (veya sadece daha sonra talep üzerine NOT NULL kısıtlamaları kaldırılarak) kullanılabilir
CsBalazsHungary

2
Tam bir yinelenen Java Boole ve Boole arasındaki fark nedir? (çünkü GWT bir fark yaratmaz).
Dan Dascalescu

Yanıtlar:


272

EvetBoolean / booleanyerine kullanabilirsiniz .

Birincisi Nesne ve ikincisi ilkel tiptir.

  • İlk olarak, faydalı olacak daha fazla yöntem alacaksınız.

  • İkincisi, bellek gideri göz önüne alındığında ucuzdur İkincisi size çok daha fazla bellek kazandıracak, bu yüzden devam edin

Şimdi yolunu seç.


70
Bunu "ikincisi size daha fazla bellek kazandıracak, öyleyse gidelim" şeklinde ifade etmiş olabilirsiniz. Boolean'daki yararlı yöntemler çoğunlukla bir örneği olmadan çağrılabilir.
DJClayworth

3
Yeni Boolean (değer) yerine Boolean.valueOf (değer) kullandığınız sürece bellek endişe yaratmamalıdır.
Greg Case

2
için AsyncTaskyalnızca Booleanyerine kullanabilirsiniz boolean.
Raptor

99
Bu unutulmamalıdır Boole aslında 3 devletler var ... true, falseve nullbir boolean mantıksal 2 durumu vardır ( trueve false)
respectTheCode

14
Boolean trillean :)
Topera

50

Boolean boole ilkel türünü sarar . Yukarı Oracle tanıtıldı (veya güneş Oracle önce onları satın) JDK 5 içinde ve unboxing Autoboxing / esasen bunu yapmak için izin verir,

boolean result = Boolean.TRUE;

veya

Boolean result = true; 

Aslında derleyici bunu yapar,

Boolean result = Boolean.valueOf(true);

Cevabınız için, bu EVET.


4
Not: a öğesine her zaman güvenli bir Booleanşekilde a atayamazsınız boolean. Eğer sizin Booleanise nullve a'ya atamaya çalışırsanız , çalışma zamanında booleanbir atar NullPointerException.
Duncan Luk

eğer Booleanbir sınıf daha sonra değeri aynı Boolean değişkeni başka sınıf referans değeri değişti bile her zaman yanlıştır neden? Booleanfarklı örnek sınıflarından / pass'tan bağımsız değişken olarak başvuramazsak bunun anlamı nedir?
user924

bir cevap buldu, biz AtomicBooleanfark sınıfları kullanabilirsiniz ve referans
user924

35

Sağlanan cevapları biraz genişletiyorum (şimdiye kadar , programlama dillerini oluşturma sahnesinin arkasındaki daha büyük resme bakmak yerine, belirli bir dili programlamaya odaklanan "kendi" / yapay terminolojisine odaklandıkları için , yani, tip güvenliği ve bellek ile ilgili hususlar fark yaratır):

int boolean değil

Düşünmek

    boolean bar = true;      
    System.out.printf("Bar is %b\n", bar);
    System.out.printf("Bar is %d\n", (bar)?1:0);
    int baz = 1;       
    System.out.printf("Baz is %d\n", baz);
    System.out.printf("Baz is %b\n", baz);

çıktı ile

    Bar is true
    Bar is 1
    Baz is 1
    Baz is true

3 satırda Java kodu (bar)?1:0göstermektedir çubuğu ( boolean örtülü bir içine (dökülmüş) dönüştürülemez) int . Bunu, JVM'nin arkasındaki uygulamanın ayrıntılarını göstermek için değil, düşük düzeyli hususlar (bellek boyutu olarak) açısından, tür güvenliği yerine değerleri tercih etmesi gerektiğine işaret ediyorum. Özellikle bu tip emniyet, kontrollerin şu şekilde yapıldığı boole tiplerinde olduğu gibi gerçekte / tam olarak kullanılmıyorsa

{0,1} içindeki \ değeri boolean türüne dönüştürülürse, bir istisna atayın.

Hepsi sadece {0,1} <{-2 ^ 31, .., 2 ^ 31 -1} olduğunu belirtmek için. Aşırı silah gibi görünüyor, değil mi? Tip güvenliği, ilkel öğelerin örtülü olarak dökümünde değil, kullanıcı tanımlı türlerde gerçekten önemlidir (sonuncusu ilkinde yer almasına rağmen).

Baytlar tür veya bit değildir

Bellekte, {0,1} aralığındaki değişkeninizin, özel olarak ilgilenilmedikçe (örneğin bellekte iyi paketlenmiş - 8 "boolean" olmadığı sürece en az bir bayt veya bir kelime (kaydın boyutuna bağlı olarak xbits) işgal edeceğini unutmayın. 1 bayt - ileri geri).

Ekstra değer paketlemesine (örneğin, bit kayması veya aritmetik kullanarak) tip güvenliğini (belirli bir türdeki bir kutuya değer koymak / sarmak gibi) tercih ederek, daha fazla bellek kazanmak için daha az kod yazmayı etkili bir şekilde seçer. (Öte yandan, Boolean'dan daha değerli olmayan tüm dönüşümü kolaylaştıracak özel bir kullanıcı türü her zaman tanımlanabilir).

anahtar kelime ve tür

Son olarak, sorunuz anahtar kelime ile türü karşılaştırmakla ilgilidir . Anahtar kelimeler (" ilkel olarak işaretlendi" ) türleri (başka bir anahtar kelime sınıfı kullanarak normal bileşik kullanıcı tanımlı sınıflar) kullanarak veya başka bir deyişle tercih ederek / tam olarak nasıl performans alacağınızı açıklamanın önemli olduğuna inanıyorum.

boolean foo = true;

vs.

Boolean foo = true;

İlk "şey" (tür) bir sebep olmadan genişletilemez (alt sınıflandırılamaz). İlkel ve sarma sınıflarının Java terminolojisi basitçe satır içi değere çevrilebilir (bir LITERAL veya ikameyi çıkarmak veya mümkün değilse hala değeri sarmalamaya geri dönüş mümkün olduğunda derleyici tarafından ikame edilen bir sabit).

Optimizasyon önemsiz olduğundan dolayı gerçekleşir:

Msgstr "Az çalışma zamanı döküm işlemleri => daha fazla hız."

Bu nedenle, gerçek tür çıkarımı yapıldığında (gerekirse), gerekirse tüm tür bilgileri ile (veya buna dönüştürmek / döküm yapmak) sarma sınıfının örneklenmesiyle sonuçlanabilir.

Bu nedenle, boolean ve Boolean arasındaki fark tam olarak Derleme ve Çalışma Zamanı'ndadır (biraz uzak ama neredeyse instanceof vs. getClass () ).

Son olarak, otomatik boks ilkellerden daha yavaştır

Java'nın otomatik boks yapabileceği gerçeğinin sadece bir "sözdizimsel şeker" olduğuna dikkat edin . Hiçbir şeyi hızlandırmaz, sadece daha az kod yazmanıza izin verir. Bu kadar. Döküm ve tip bilgi kabına sarma hala yapılmaktadır. Performans nedenlerinden ötürü, tip güvenliğini uygulamak için tip bilgisi ile sınıf örnekleri oluşturmanın her zaman ekstra temizliğini atlayacak aritmetiği seçin. Tip güvenliği olmaması, performans kazanmak için ödediğiniz fiyattır. Boole değerine sahip ifadeler içeren kodlar için güvenlik türü (daha az yazdığınızda ve dolayısıyla örtük kod yazdığınızda ) örneğin if-then-else akış denetimleri için kritik olacaktır.


16

Sen kullanabilirsiniz Boole sabitleri - Boolean.TRUEve Boolean.FALSEyerine 0ve 1. booleanİlkel olduğunuz şey varsa değişkeninizi tür olarak oluşturabilirsiniz . Bu şekilde yeni Booleannesneler oluşturmak zorunda kalmazsınız .


4

Bir gözlem: (bu yan etki olarak düşünülebilir)

booleilkel olmak, ya evet ya da hayır diyebilir.

Boolean bir nesnedir (evet veya hayır veya 'bilmiyorum' anlamına gelir)


3

Temel olarak boolean, ilkel bir veri türünü temsil eder; burada Boolean, bir referans veri türünü temsil eder. Bu hikaye, Java tamamen nesne yönelimli olmak istediğinde başlar ve ilkel veri türünü kullanmak için sarıcı sınıf kavramı sağlanır.

boolean b1;
Boolean b2;

b1ve b2aynı değil.


1

Boolean / boolean kullanabilirsiniz. Basitlik yoludur. Belirli bir API'ye (Koleksiyonlar, Akışlar vb.) İhtiyacınız yoksa ve bunlara ihtiyacınız olacağını öngörmüyorsanız - bunun ilkel sürümünü kullanın (boolean).

  1. Temel öğelerle null değerleri geçmeyeceğinizi garanti edersiniz.
    Böyle tuzaklara düşmeyeceksin. Aşağıdaki kod NullPointerException komutunu verir (from: Booleans, koşullu işleçler ve otomatik boks ):

    public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; }

  2. Bir nesneye ihtiyacınız olduğunda Boolean kullanın, örneğin:

    • Boole Akıntısı,
    • İsteğe bağlı
    • Booleans Koleksiyonları
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.