Trwają dyskusje wokół Integer
vs int
w Javie. Domyślną wartością tego pierwszego jest, null
podczas gdy w drugiej 0
. Co powiesz na Boolean
vsboolean
?
Zmienna w mojej aplikacji może mieć 0
/ 1
wartości. Chciałbym użyć boolean
/ Boolean
i wolę nie używać int
. Czy mogę użyć Boolean
/ boolean
zamiast?
Odpowiedzi:
Tak , możesz użyć
Boolean
/boolean
zamiast.Pierwszy to Object, a drugi to prymitywny typ.
Za pierwszym razem dostaniesz więcej metod, które będą przydatne.
Drugi jest tani, biorąc pod uwagę koszt pamięci . Drugi pozwoli ci zaoszczędzić dużo więcej pamięci, więc idź
Teraz wybierz swoją drogę.
źródło
AsyncTask
możesz użyć tylkoBoolean
zamiastboolean
.true
,false
anull
gdzie boolean ma logiczne 2 stany (true
ifalse
)Boolean
otacza typ pierwotny boolowski. W JDK 5 i wyższych Oracle (lub Sun, zanim Oracle je kupił) wprowadziło autoboxing / unboxing , co w zasadzie pozwala ci to zrobićlub
Który zasadniczo robi kompilator,
Tak więc, dla twojej odpowiedzi, to TAK.
źródło
Boolean
doboolean
. Jeśli twojeBoolean
znaczynull
i spróbować przypisać go doboolean
, będzie rzucaćNullPointerException
w czasie wykonywania.Boolean
klasa, to dlaczego wartość zawsze jest fałszywa, nawet jeśli zmieniłem wartość z innej klasy, odwołując się do tej samej zmiennej boolowskiej? jaki jest tego sens,Boolean
jeśli nie możemy odwoływać się do różnych klas instancji / przekazać jako argument?AtomicBoolean
i odnieść się do niej z klas różnicNieco rozszerzam dostarczone odpowiedzi (ponieważ jak dotąd koncentrują się na swojej „własnej” / sztucznej terminologii, koncentrując się na programowaniu określonego języka zamiast zajmować się szerszym obrazem za kulisami tworzenia języków programowania , tj. Kiedy rzeczy różnica między bezpieczeństwem typu a pamięcią):
int nie jest wartością logiczną
Rozważać
z wyjściem
Kod Java w 3. linii
(bar)?1:0
pokazuje, że bar ( boolean ) nie może być niejawnie przekonwertowany (rzutowany) na int . Podnoszę to, aby nie zilustrować szczegółów implementacji JVM, ale wskazać, że biorąc pod uwagę względy niskiego poziomu (jako rozmiar pamięci), należy wybierać wartości nad bezpieczeństwem typu. Zwłaszcza jeśli tego typu bezpieczeństwo nie jest w pełni / w pełni stosowane, jak w typach boolowskich, w których kontrole są przeprowadzane w formieWszystko po to, aby stwierdzić, że {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}. Wydaje się, że to przesada, prawda? Bezpieczeństwo typów jest naprawdę ważne w typach zdefiniowanych przez użytkownika, a nie w niejawnym rzutowaniu prymitywów (chociaż ostatnie są uwzględnione w pierwszym).
Bajty nie są typami ani bitami
Zauważ, że w pamięci twoja zmienna z zakresu {0,1} nadal będzie zajmować co najmniej bajt lub słowo (xbity w zależności od wielkości rejestru), chyba że specjalnie się o to zatroszczysz (np. Ładnie zapakowany w pamięć - 8 „boolean” bitów na 1 bajt - tam iz powrotem).
Preferując bezpieczeństwo typu (jak wstawianie / zawijanie wartości do pudełka określonego typu) niż pakowanie dodatkowej wartości (np. Przy użyciu przesunięcia bitów lub arytmetyki), efektywnie wybiera się pisanie mniejszego kodu niż uzyskanie większej pamięci. (Z drugiej strony zawsze można zdefiniować niestandardowy typ użytkownika, który ułatwi całą konwersję nie wartą wartości logicznej).
słowo kluczowe a typ
Wreszcie, twoje pytanie dotyczy porównania słowa kluczowego z typem . Uważam, że ważne jest wyjaśnienie, dlaczego lub w jaki sposób uzyskasz skuteczność, używając / preferując słowa kluczowe („oznaczone” jako prymitywne ) nad typami (zwykłe złożone klasy definiowane przez użytkownika za pomocą innej klasy słów kluczowych ) lub innymi słowy
vs.
Pierwszej „rzeczy” (typu) nie można rozszerzyć (podklasować) i nie bez powodu. Skutecznie terminologię Java prymitywnych i zawijających klas można po prostu przetłumaczyć na wartość wbudowaną (LITERAL lub stałą, która jest bezpośrednio zastępowana przez kompilator, ilekroć możliwe jest wnioskowanie o podstawieniu lub, jeśli nie, - powrót do zawijania wartości).
Optymalizację osiąga się dzięki trywialnym:
Dlatego po dokonaniu faktycznego wnioskowania typu może (nadal) skończyć się wystąpieniem instancji klasy zawijania ze wszystkimi informacjami o typie, jeśli to konieczne (lub konwersją / rzutowaniem na takie).
Tak więc różnica między wartością logiczną a logiczną jest dokładnie w kompilacji i środowisku wykonawczym (nieco daleko, ale prawie jak instancja vs. getClass () ).
Wreszcie, autoboksowanie jest wolniejsze niż prymitywy
Zauważ, że Java może wykonywać autoboxing to po prostu „cukier składniowy”. Nic nie przyspiesza, pozwala tylko napisać mniej kodu. Otóż to. Nadal wykonuje się rzutowanie i zawijanie do kontenera informacji o typie. Ze względu na wydajność wybierz arytmetykę, która zawsze pominie dodatkowe czynności porządkowe podczas tworzenia instancji klasy z informacjami o typie w celu wdrożenia bezpieczeństwa typu. Brak bezpieczeństwa typu to cena, którą płacisz za uzyskanie wydajności. W przypadku kodu z wyrażeniami o wartości logicznej bezpieczeństwo typu (gdy piszesz mniej, a tym samym niejawny kod) ma kluczowe znaczenie, np. W przypadku kontroli przepływu „jeśli-to-inaczej”.
źródło
Możesz użyć stałych logicznych -
Boolean.TRUE
iBoolean.FALSE
zamiast0
i1
. Możesz utworzyć zmienną według typu,boolean
jeśli szukasz pierwotnego elementu . W ten sposób nie będziesz musiał tworzyć nowychBoolean
obiektów.źródło
Zasadniczo wartość logiczna reprezentuje pierwotny typ danych, gdzie wartość logiczna reprezentuje typ danych odniesienia. ta historia zaczyna się, gdy Java chce się całkowicie zorientować obiektowo, dlatego oferuje koncepcję klasy opakowania, aby móc korzystać z pierwotnego typu danych.
b1
ib2
nie są takie same.źródło
Jedna obserwacja: (choć można to pomyśleć o skutkach ubocznych)
boolean będący prymitywem może powiedzieć „tak” lub „nie”.
Boolean jest obiektem (może odnosić się do tak lub nie lub „nie wiem”, tj. Null)
źródło
Możesz użyć Boolean / boolean. Prostota to droga. Jeśli nie potrzebujesz konkretnego interfejsu API (kolekcje, strumienie itp.) I nie przewidujesz, że będziesz go potrzebować - użyj jego prymitywnej wersji (boolean).
Z prymitywami gwarantujesz, że nie przekażesz wartości null.
Nie wpadniesz w takie pułapki. Poniższy kod zgłasza wyjątek NullPointerException (z: booleany, operatory warunkowe i autoboxing ):
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; }
Użyj Boolean, gdy potrzebujesz obiektu, np .:
źródło