Long vs Integer, long vs int, czego używać i kiedy?

135

Czasami widzę, że API używa longlub Longlub intlub Integeri nie potrafię zrozumieć, w jaki sposób podejmowana jest decyzja?

Kiedy mam wybrać co?

Wiem, jak zaznaczyć V
źródło

Odpowiedzi:

191

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 intprzekazywane 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.

Borealid
źródło
5
@Borealid, to jest tak złe, Java jest zawsze przekazywana przez wartość, w Javie nie ma nic takiego, jak przekazywanie przez odwołanie.
Diego Ramos
9
UH Huh? OK, przyjrzyjmy się idei, że Java nigdy nie przekazuje referencji. Jeśli wywołam funkcję dającą jej wartość int [2], a następnie wewnątrz funkcji zmienię wartość przechowywaną w pierwszym elemencie tej tablicy, czy wywołujący funkcję zobaczy tę zmianę? Tak? To dlatego, że to, co zostało przekazane do funkcji, nie było wartościami w tablicy, ale raczej odniesieniem do tych wartości. „Wartość przekazywana” oznacza, że ​​same dane są kopiowane bez pośrednictwa. Ktokolwiek nauczył cię, że Java jest wartością pass-by, wyrządził ci krzywdę.
Borealid
3
@Borealid jesteś niepoprawny, wartość jest zmieniana, ponieważ została utworzona nowa kopia odniesienia do tablicy, dlatego ktokolwiek wywołuje funkcję, zobaczy zmianę, nadal jest przekazywana przez wartość. Nie mogę uwierzyć, że mówisz, że w Javie istnieje przekazywanie przez odniesienie. Nigdy nie przekazujesz oryginalnego odniesienia do funkcji.
Diego Ramos,
6
W teoretycznym świecie, w którym Java zachowywała się zupełnie inaczej niż w rzeczywistości, a przekazanie obiektu lub tablicy do funkcji skutkowało całkowicie oddzielną kopią (gdzie modyfikacje wewnątrz funkcji w ogóle nie były odzwierciedlane dla wywołujących), jak byś wtedy zrobił opisać język? Należy pamiętać, że to, o czym mówimy, nie jest tym, co faktycznie robi Java.
Borealid
2
@DiegoRamos ma rację. Java jest zawsze przekazywana przez wartość, powstaje zamieszanie, ponieważ wartość, gdy nie jest prymitywna, jest odniesieniem do pamięci, wymiana statyczna nie działa w java, więcej szczegółów tutaj: journaldev.com/3884/ ...
Panthro
28

Jest kilka rzeczy, których nie można zrobić z typem prymitywnym:

  • Mają nullwartość
  • zsynchronizuj się na nich
  • Użyj ich jako parametru typu dla klasy ogólnej i związanych z tym:
  • Przekaż je do interfejsu API, który działa z Objects

Jeśli nie potrzebujesz żadnego z nich, powinieneś preferować typy prymitywne, ponieważ wymagają mniej pamięci.

Michael Borgwardt
źródło
24
  • Domyślnie używaj int, gdy trzymasz numery.
  • Jeśli zakres intjest zbyt mały, użyj plikulong
  • Jeśli zakres longjest zbyt mały, użyjBigInteger
  • Jeśli chcesz traktować swoje liczby jako obiekt (na przykład podczas umieszczania ich w Collection, obsługa null, ...) użyj zamiast tego Integer/Long
Joachim Sauer
źródło
13

An 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).

Jesper
źródło
6

Liczba całkowita to 32-bitowa liczba całkowita ze znakiem

  • Oznaczony jako Int
  • Rozmiar = 32 bits (4byte)
  • Może przechowywać liczby całkowite z zakresu -2,147,483,648 to 2,147,483,647
  • wartość domyślna to 0


Long to 64-bitowa liczba całkowita ze znakiem

  • Oznaczony jako Long
  • Rozmiar = 64 bits (8byte)
  • Może przechowywać liczby całkowite z zakresu -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • wartość domyślna to 0L


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.

Wszystko jest Vаиітy
źródło
1

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))

Houcem Berrayana
źródło
0

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

  • bajt, znak .. 1B .. 8b
  • krótki int .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • długi int .. 8B .. 64b

C .. po prostu bałagan: https://en.wikipedia.org/wiki/C_data_types

  • krótko .. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • długi .. .. 32b
  • długo, długo .. 64b .. bałagan! : - /
Franta
źródło
To nie odpowiada na pytanie, które dotyczy różnicy między długimi i długimi itp.
GreenAsJade
Nie, nie udziela na to wyraźnej odpowiedzi, nie mówiąc wprost o różnicy między typami pierwotnymi a obiektami typu danych, w istocie @GreenAsJade, ponieważ powyższe pytanie nie określa żadnego konkretnego języka. Podałem więc porównanie - aby każdy mógł sprawdzić różnicę. (z twardych danych, jak podano)
Franta
Pytanie brzmiało: Java.
GreenAsJade