Czasami widzę, że API używa long
lub Long
lub int
lub Integer
i nie potrafię zrozumieć, w jaki sposób podejmowana jest decyzja?
Kiedy mam wybrać co?
Czasami widzę, że API używa long
lub Long
lub int
lub Integer
i nie potrafię zrozumieć, w jaki sposób podejmowana jest decyzja?
Kiedy mam wybrać co?
Odpowiedzi:
Long
jest Object
formą long
i Integer
jest formą przedmiotu int
.
long
Wykorzystuje 64 bitów . Do int
zastosowania 32 bitów, a więc może posiadać tylko numerów w zakresie ± 2000000000 (-2 +31 do + 2 31 1).
Powinieneś używać long
i int
, z wyjątkiem sytuacji, gdy musisz korzystać z metod odziedziczonych z Object
, takich jak hashcode
. Java.util.collections
metody zwykle używają wersji pudełkowanych ( Object
-wrapowanych), ponieważ muszą działać dla każdego Object
, a typ pierwotny, taki jak int
lub long
, nie jest Object
.
Inną różnicą jest to, że long
i int
są przekazywane przez wartość , podczas gdy Long
i Integer
są wartościami przekazywanymi przez odwołanie , podobnie jak wszystkie inne niż pierwotne typy języka Java. Więc jeśli byłaby możliwa modyfikacja Long
lub Integer
(tak nie jest, są niezmienne bez użycia kodu JNI), byłby inny powód, aby używać jednego nad drugim.
Ostatnia różnica polega na tym, że a Long
lub Integer
może być null
.
Jest kilka rzeczy, których nie można zrobić z typem prymitywnym:
null
wartośćObject
sJeśli nie potrzebujesz żadnego z nich, powinieneś preferować typy prymitywne, ponieważ wymagają mniej pamięci.
int
, gdy trzymasz numery.int
jest zbyt mały, użyj plikulong
long
jest zbyt mały, użyjBigInteger
Collection
, obsługa null
, ...) użyj zamiast tego Integer
/Long
An int
jest 32-bitową liczbą całkowitą; a long
jest 64-bitową liczbą całkowitą. To, którego użyć, zależy od tego, jak duże są liczby, z którymi zamierzasz pracować.
int
i long
są typami prymitywnymi, podczas gdy Integer
i Long
są obiektami. Typy prymitywne są bardziej wydajne, ale czasami trzeba użyć obiektów; na przykład klasy kolekcji w Javie mogą działać tylko z obiektami, więc jeśli potrzebujesz listy liczb całkowitych, musisz nadać jej List<Integer>
na przykład a (nie możesz używać bezpośrednio int
w a List
).
Int
32 bits (4byte)
-2,147,483,648 to 2,147,483,647
Long
64 bits (8byte)
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
Jeśli użycie zmiennej mieści się w zakresie 32-bitowym, użyj Int
, w przeciwnym razie użyj long
. Zwykle długie jest używane do obliczeń naukowych i takie rzeczy wymagają dużej dokładności. (np. wartość pi).
Przykładem wyboru jednego z nich jest przypadek YouTube. Najpierw zdefiniowali licznik wyświetleń wideo jako
int
przepełniony, gdy ponad 2 147 483 647 wyświetleń w popularnym filmie. PonieważInt
licznik nie może przechowywać wartości większej niż jego zakres, YouTube zmienił licznik na zmienną 64-bitową i teraz może liczyć do 9 223 372 036 854 775 807 wyświetleń. Zrozum swoje dane i wybierz typ, który pasuje, ponieważ zmienna 64-bitowa zajmie dwukrotnie więcej pamięci niż zmienna 32-bitowa.
Jeśli chodzi o użycie bardzo długiej liczby, która może przekraczać 32 bity, możesz użyć long, aby upewnić się, że nie będziesz mieć dziwnego zachowania.
W Javie 5 możesz używać funkcji in-boxing i out-boxing, aby korzystanie z int i Integer było całkowicie takie samo. Oznacza to, że możesz:
int myInt = new Integer(11);
Integer myInt2 = myInt;
In i out boksu pozwalają przełączać się między int i Integer bez dodatkowej konwersji (taka sama dla Long
, Double
, Short
zbyt)
Możesz używać int
cały czas, ale Integer
zawiera kilka pomocniczych metod, które mogą pomóc w wykonywaniu skomplikowanych operacji na liczbach całkowitych (takich jak Integer.parseInt(String)
)
a) klasa obiektu „Long” a typ pierwotny „long”. (Przynajmniej w Javie)
b) Istnieją różne (nawet niejasne) rozmiary pamięci typów pierwotnych:
Java - wszystko jasne: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
C .. po prostu bałagan: https://en.wikipedia.org/wiki/C_data_types