Czasami widzę, że API używa longlub Longlub intlub Integeri nie potrafię zrozumieć, w jaki sposób podejmowana jest decyzja?
Kiedy mam wybrać co?
Czasami widzę, że API używa longlub Longlub intlub Integeri nie potrafię zrozumieć, w jaki sposób podejmowana jest decyzja?
Kiedy mam wybrać co?
Odpowiedzi:
Longjest Objectformą longi Integerjest formą przedmiotu int.
longWykorzystuje 64 bitów . Do intzastosowania 32 bitów, a więc może posiadać tylko numerów w zakresie ± 2000000000 (-2 +31 do + 2 31 1).
Powinieneś używać longi int, z wyjątkiem sytuacji, gdy musisz korzystać z metod odziedziczonych z Object, takich jak hashcode. Java.util.collectionsmetody zwykle używają wersji pudełkowanych ( Object-wrapowanych), ponieważ muszą działać dla każdego Object, a typ pierwotny, taki jak intlub long, nie jest Object.
Inną różnicą jest to, że longi intsą przekazywane przez wartość , podczas gdy Longi Integersą 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 Longlub 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 Longlub Integermoże być null.
Jest kilka rzeczy, których nie można zrobić z typem prymitywnym:
nullwartośćObjectsJeśli nie potrzebujesz żadnego z nich, powinieneś preferować typy prymitywne, ponieważ wymagają mniej pamięci.
int, gdy trzymasz numery.intjest zbyt mały, użyj plikulonglongjest zbyt mały, użyjBigIntegerCollection, obsługa null, ...) użyj zamiast tego Integer/LongAn intjest 32-bitową liczbą całkowitą; a longjest 64-bitową liczbą całkowitą. To, którego użyć, zależy od tego, jak duże są liczby, z którymi zamierzasz pracować.
inti longsą typami prymitywnymi, podczas gdy Integeri Longsą 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 intw a List).
Int32 bits (4byte)-2,147,483,648 to 2,147,483,647Long64 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
intprzepełniony, gdy ponad 2 147 483 647 wyświetleń w popularnym filmie. PonieważIntlicznik 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, Shortzbyt)
Możesz używać intcały czas, ale Integerzawiera 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