Jaka jest różnica między liczbą całkowitą a liczbą całkowitą w Javie?


248

Na przykład, dlaczego możesz:

int n = 9;

Ale nie:

Integer n = 9;

I możesz zrobić:

Integer.parseInt("1");

Ale nie:

int.parseInt("1");

35
liczba całkowita jest klasą, int jest typem prymitywnym
Anycorn

24
Możesz to zrobić z Integer n = 9;powodu autoboxowania (chyba że używasz bardzo starej wersji java)
Alderath

Odpowiedzi:


320

intjest prymitywnym typem. Zmienne typu intprzechowują rzeczywistą wartość binarną liczby całkowitej, którą chcesz reprezentować. int.parseInt("1")nie ma sensu, bo intto nie klasa, a zatem nie ma żadnych metod.

Integerjest klasą, niczym nie różniącą się od innych w języku Java. Zmienne odwołań do Integermagazynu typu do obiektów, tak jak w przypadku każdego innego typu odwołania (obiektu). jest wywołaniem metody statycznej z klasy (zauważ, że ta metoda faktycznie zwraca an, a nie an ).IntegerInteger.parseInt("1")parseIntIntegerintInteger

Mówiąc ściślej, Integerjest to klasa z jednym polem typu int. Ta klasa jest używana tam, gdzie trzeba inttraktować jak każdy inny obiekt, na przykład w typach ogólnych lub sytuacjach, w których potrzebujesz zerowalności.

Zauważ, że każdy typ pierwotny w Javie ma równoważną klasę opakowania :

  • byte ma Byte
  • short ma Short
  • int ma Integer
  • long ma Long
  • boolean ma Boolean
  • char ma Character
  • float ma Float
  • double ma Double

Klasy opakowań dziedziczą po klasie Object, a prymityw nie. Można go zatem używać w kolekcjach z odniesieniem do obiektu lub z ogólnikami.

Od wersji java 5 mamy autoboxing, a konwersja między klasą pierwotną i klasą opakowania jest wykonywana automatycznie. Uważaj jednak, ponieważ może to wprowadzić subtelne błędy i problemy z wydajnością; wyraźne mówienie o konwersjach nigdy nie boli.


6
We C#wszystkich typach danych mają „aliasy” i int.Parse()mają sens (nawet jeśli tak naprawdę nie ma)
Vahid Amiri,

22
@ VSG24 ... ale to było pytanie Java i to jest odpowiedź Java. C#jest tutaj całkowicie nieistotne.
Darkhogg,

3
Dobrym przykładem może być: Błąd kompilacji: Lista <int> Ważna: Lista <Integer>
hagai

Dodatkowa wiedza zawsze przynosi korzyści
sumit sharma

1
Lubię uczyć się nowych rzeczy, zwłaszcza gdy wiedza jest związana z bieżącym tematem. Dzięki Vahid.
Paul Oliver,

30

Liczba całkowita jest klasą, a liczba int jest typem pierwotnym.

Czytaj dalej pod tymi linkami:


1
Chcę podkreślić, że uważam, że jest to idealna odpowiedź z dwóch powodów: 1 - zwięzły i dokładny, pamiętając o publiczności / pytającym 2 - Podaje kierunek dla dodatkowych szczegółów zamiast umieszczania wszystkiego w tekście odpowiedzi Nie wszystkie na pytania można odpowiedzieć dokładnie i zwięźle (niektóre wymagają znacznie więcej szczegółów i niuansów, aby były dokładne i kompletne), ale myślę, że wszystkie odpowiedzi powinny być tak proste i bezpośrednie.
DRich

11
Heh, myślę, że jest wręcz przeciwnie. „int jest typem pierwotnym” nic nie mówi, jeśli nie wiesz, co to jest typ pierwotny. (A jeśli tak, to już bardzo prawdopodobne, że znasz różnicę między liczbą całkowitą a liczbą całkowitą). Wysłanie czytelnika do dwóch linków oznaczonych jako „Link 1” i „Link 2” jest dość nieprzydatne, szczególnie w porównaniu do zwykłego cytowania odpowiednich sekcji.
Steve Bennett

7

Liczba całkowita jest właściwie tylko opakowaniem dla pierwotnego typu int. Pozwala ci korzystać ze wszystkich funkcji klasy Integer, aby ułatwić ci życie.

Jeśli jesteś nowy w Javie, powinieneś nauczyć się doceniać dokumentację Java. Na przykład wszystko, co chcesz wiedzieć o klasie całkowitej, jest szczegółowo udokumentowane.

Wynika to wprost z dokumentacji dla klasy Integer:

Klasa Integer otacza wartość typu pierwotnego int w obiekcie. Obiekt typu Integer zawiera pojedyncze pole, którego typem jest int.


7
To nieco mija się z celem. Na przykład, podobnie jak Integerklasa, może być przechowywany w kontenerach (w przeciwieństwie do typów pierwotnych).
Oliver Charlesworth

6

Zmienna int zawiera 32-bitową liczbę całkowitą ze znakiem. Liczba całkowita (z wielką literą I) zawiera odwołanie do obiektu typu Integer (klasy) lub do wartości null.

Java automatycznie rzuca między nimi; od Integer do int za każdym razem, gdy obiekt Integer występuje jako argument dla operatora int lub jest przypisany do zmiennej int lub wartość int jest przypisana do zmiennej Integer. Ten casting nazywa się boxing / unboxing.

Jeśli zmienna Integer odwołująca się do wartości null zostanie rozpakowana, jawnie lub niejawnie, generowany jest wyjątek NullPointerException.

(W powyższym tekście termin „zmienna” oznacza lokalną zmienną, pole lub parametr)


5

Integerodnosi się do typu opakowania w Javie, podczas gdy intjest typem pierwotnym. Wszystko oprócz prymitywnych typów danych w Javie jest implementowane tak, jak obiekty, które sugerują, że Java jest wysoce wykwalifikowanym, czysto obiektowym językiem programowania. Jeśli potrzebujesz, wszystkie typy operacji podstawowych są również dostępne jako typy opakowań w Javie. Typy pierwotne mogą przynieść pewne korzyści w zakresie wydajności, dlatego typy opakowań powinny być używane tylko wtedy, gdy jest to konieczne.

W twoim przykładzie jak poniżej.

Integer n = 9;

stała 9jest automatycznie umieszczana w ramkach ( auto-boxingi unboxingpojawia się automatycznie od java 5początku) do, Integera zatem można użyć instrukcji w ten sposób, a także Integer n = new Integer(9). W rzeczywistości osiąga się to poprzez oświadczenieInteger.valueOf(9).intValue();


3

int jest typem pierwotnym, a nie obiektem. Oznacza to, że nie ma z nim żadnych metod. Liczba całkowita jest obiektem z metodami (takimi jak parseInt).

W nowszej wersji Java dostępna jest funkcja automatycznego boxowania (i rozpakowywania). Oznacza to, że kompilator wstawi Integer.valueOf (int) lub integer.intValue () w razie potrzeby. Oznacza to, że tak naprawdę można pisać

Integer n = 9;

co jest interpretowane jako

Integer n = Integer.valueOf(9);

3

Liczba całkowita jest klasą opakowania / Obiektem, a int jest typem pierwotnym. Ta różnica odgrywa ogromną rolę, gdy chcesz przechowywać wartości int w kolekcji, ponieważ akceptują one tylko obiekty jako wartości (do jdk1.4). JDK5 i następne z powodu autoboxowania to zupełnie inna historia.


5
JDK5 + akceptuje również tylko obiekty; po prostu autoboxing pozwala kompilatorowi automatycznie dzwonić Integer.valueOf(i)lub Integer.intValue()dla ciebie. Collection<int>nadal nie będzie działać. Więc to nie jest zupełnie inna historia - to ta sama historia, z odrobiną skrótu.
yshavit

Zgoda. Przepraszam, moje sformułowanie może tego nie odzwierciedlać.
kosa

3

W Javie int jest prymitywnym typem danych, podczas gdy Integer jest klasą Helper, służy do konwersji jednego typu danych na inny.

Na przykład:

         double doubleValue = 156.5d;
         Double doubleObject  = new Double(doubleValue);
         Byte myByteValue = doubleObject.byteValue ();
         String myStringValue = doubleObject.toString();

Prymitywne typy danych przechowują najszybszą dostępną pamięć, w której klasa Helper jest złożona, i przechowują w pamięci sterty.

referencja ze szkolenia Java Essential „David Gassner”.


2

intjest pierwotnym typem, który reprezentuje liczbę całkowitą. mając na uwadze, Integerże obiekt jest zawijany int. IntegerObiekt daje większą funkcjonalność, takich jak konwersja do hex, sznurka, itd.

Możesz także używać koncepcji OOP z Integer. Na przykład możesz użyć liczby całkowitej do generics (tj .).Collection<Integer>


2

To jest wzięte z Java: The Complete Reference, wydanie dziewiąte

Java używa typów pierwotnych (zwanych także typami prostymi), takich jak int lub double , aby przechowywać podstawowe typy danych obsługiwane przez język. Typy pierwotne , a nie obiekty, są używane dla tych ilości ze względu na wydajność . Użycie obiektów dla tych wartości spowodowałoby niedopuszczalne obciążenie nawet w najprostszych obliczeniach. Zatem typy pierwotne nie są częścią hierarchii obiektów i nie dziedziczą Object .

Pomimo korzyści związanych z wydajnością oferowanych przez typy pierwotne, zdarza się, że potrzebujesz reprezentacji obiektu. Na przykład nie można przekazać typu pierwotnego przez odwołanie do metody . Ponadto wiele standardowych struktur danych implementowanych przez Javę działa na obiektach, co oznacza, że nie można używać tych (specyficznych dla obiektu) struktur danych do przechowywania typów pierwotnych . Aby poradzić sobie z tymi (i innymi) sytuacjami, Java udostępnia opakowania typów, które są klasami, które zawierają typ pierwotny w obiekcie.

Klasy opakowań odnoszą się bezpośrednio do funkcji autokoksowania Javy . Opakowania typu to Double, Float, Long, Integer, Short, Byte, Character i Boolean . Klasy te oferują szeroki wachlarz metod, które pozwalają w pełni zintegrować prymitywne typy z hierarchią obiektów Java.


1

Aby zoptymalizować środowisko wykonawcze kodu Java, dodano int pierwotne typyfloat , w tym boolitp., Ale zawierają one klasy otoki, dzięki czemu w razie potrzeby można je konwertować i używać jako standardowego obiektu Java wraz z wieloma narzędziami, które są ich członkami funkcje (takie jak Integer.parseInt("1")).


1

intjest prymitywnym typem danych, podczas gdy Integerjest typem referencyjnym lub opakowaniowym (klasa) w Javie.

po java 1.5czym wprowadzimy koncepcję autoboxowania i rozpakowywania , możesz zainicjować oba intlub Integertak.

int a= 9
Integer a = 9 // both valid After Java 1.5.

dlaczego Integer.parseInt("1");ale nie int.parseInt("1");??

Integerto klasa zdefiniowana w jdkbibliotece i parseInt()metoda statyczna należy do Integerklasy

Tak, Integer.parseInt("1");jest to możliwe w Javie. ale intjest to typ pierwotny (załóżmy jak słowo kluczowe) w java. Tak więc, nie można wywołać parseInt()z int.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.