Was ist der Unterschied zwischen Integer und int in Java?

248

Warum können Sie zum Beispiel Folgendes tun:

int n = 9;

Aber nicht:

Integer n = 9;

Und Sie können tun:

Integer.parseInt("1");

Aber nicht:

int.parseInt("1");
mino
quelle
35
Ganzzahl ist Klasse, int ist ein primitiver Typ
Anycorn
24
Sie können tun , Integer n = 9;wegen Autoboxing (es sei denn , Sie eine sehr alte Version von Java verwenden)
Alderath

Antworten:

320

intist ein primitiver Typ. Variablen vom Typ intspeichern den tatsächlichen Binärwert für die Ganzzahl, die Sie darstellen möchten. int.parseInt("1")macht keinen Sinn, weil intes keine Klasse ist und daher keine Methoden hat.

Integerist eine Klasse, die sich in der Java-Sprache nicht von anderen unterscheidet. Variablen vom Typ Integerspeichern Verweise auf IntegerObjekte, genau wie bei jedem anderen Referenztyp (Objekttyp). Integer.parseInt("1")ist ein Aufruf der statischen Methode parseIntaus der Klasse Integer(beachten Sie, dass diese Methode tatsächlich eine intund keine zurückgibt Integer).

Genauer gesagt Integerhandelt es sich um eine Klasse mit einem einzelnen Typfeld int. Diese Klasse wird verwendet, wenn Sie ein intObjekt wie jedes andere Objekt behandeln müssen, z. B. in generischen Typen oder Situationen, in denen Sie die Nullbarkeit benötigen.

Beachten Sie, dass jeder primitive Typ in Java eine entsprechende Wrapper- Klasse hat:

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

Wrapper-Klassen erben von der Object-Klasse und primitive nicht. So kann es in Sammlungen mit Objektreferenz oder mit Generics verwendet werden.

Seit Java 5 haben wir Autoboxing und die Konvertierung zwischen primitiver und Wrapper-Klasse erfolgt automatisch. Beachten Sie jedoch, dass dies zu subtilen Fehlern und Leistungsproblemen führen kann. Es tut nie weh, explizit über Conversions zu sprechen.

Darkhogg
quelle
6
In C#allen Datentypen haben "Aliase" und int.Parse()macht Sinn (obwohl es wirklich nicht tut)
Vahid Amiri
22
@ VSG24 ... aber das war eine Java-Frage, und das ist eine Java-Antwort. C#ist hier völlig irrelevant.
Darkhogg
3
Gutes Beispiel könnte sein: Kompilierungsfehler: Liste <int> Gültig: Liste <Integer>
Hagai
Zusätzliches Wissen profitiert immer
Sumit Sharma
1
Ich lerne gerne neue Dinge, besonders wenn das Wissen mit dem aktuellen Thema zusammenhängt. Danke Vahid.
Paul Oliver
30

Ganzzahl ist eine Klasse und int ist ein primitiver Typ.

Lesen Sie weiter unter diesen Links:

Matjaz Muhic
quelle
1
Ich möchte darauf hinweisen, dass dies aus zwei Gründen die perfekte Antwort ist: 1- Prägnant und genau, wobei das Publikum / der Fragesteller im Auge behalten wird. 2- Bietet Anweisungen für zusätzliche Details, anstatt alles in den Text der Antwort aufzunehmen. Nicht alle Fragen können so genau und präzise beantwortet werden (einige erfordern viel mehr Details und Nuancen, um genau und vollständig zu sein), aber ich denke, alle Antworten sollten versuchen, so einfach und direkt zu sein.
DRich
11
Heh, ich denke es ist eigentlich das Gegenteil. "int ist ein primitiver Typ" sagt Ihnen nichts, wenn Sie nicht wissen, was ein primitiver Typ ist. (Und wenn Sie dies tun, kennen Sie den Unterschied zwischen int und Integer bereits sehr wahrscheinlich). Das Senden des Lesers an zwei Links mit den Bezeichnungen "Link 1" und "Link 2" ist ziemlich wenig hilfreich, insbesondere im Vergleich zum Zitieren der relevanten Abschnitte.
Steve Bennett
7

Eine Ganzzahl ist so ziemlich nur ein Wrapper für den primitiven Typ int. Sie können alle Funktionen der Integer-Klasse verwenden, um Ihnen das Leben ein wenig zu erleichtern.

Wenn Sie Java noch nicht kennen, sollten Sie die Java-Dokumentation kennenlernen. Zum Beispiel wird alles, was Sie über die Integer-Klasse wissen möchten, detailliert dokumentiert.

Dies geht direkt aus der Dokumentation für die Integer-Klasse hervor:

Die Integer-Klasse umschließt einen Wert des primitiven Typs int in einem Objekt. Ein Objekt vom Typ Integer enthält ein einzelnes Feld, dessen Typ int ist.

Nadir Muzaffar
quelle
7
Dies verfehlt etwas den Punkt. Wie Integereine Klasse kann sie beispielsweise in Containern gespeichert werden (im Gegensatz zu primitiven Typen).
Oliver Charlesworth
6

Eine int-Variable enthält einen 32-Bit-Ganzzahlwert mit Vorzeichen. Eine Ganzzahl (mit Großbuchstaben I) enthält einen Verweis auf ein Objekt vom Typ (Klassen-) Ganzzahl oder auf Null.

Java wechselt automatisch zwischen den beiden; von Integer zu int, wenn das Integer-Objekt als Argument für einen int-Operator auftritt oder einer int-Variablen zugewiesen wird oder ein int-Wert einer Integer-Variablen zugewiesen wird. Dieses Casting nennt man Boxen / Unboxen.

Wenn eine Integer-Variable, die auf null verweist, explizit oder implizit deaktiviert ist, wird eine NullPointerException ausgelöst.

(Im obigen Text bedeutet der Begriff "Variable" lokale Variable, Feld oder Parameter)

Bartłomiej Semańczyk
quelle
5

Integerbezieht sich auf den Wrapper-Typ in Java, während intes sich um einen primitiven Typ handelt. Alles außer primitiven Datentypen in Java wird genauso implementiert wie Objekte, die implizieren, dass Java eine hochqualifizierte reine objektorientierte Programmiersprache ist. Bei Bedarf sind alle Primitivtypen auch als Wrapper-Typen in Java verfügbar. Mit primitiven Typen können Sie einige Leistungsvorteile erzielen. Daher sollten Wrapper-Typen nur verwendet werden, wenn dies erforderlich ist.

In Ihrem Beispiel wie unten.

Integer n = 9;

Die Konstante 9wird automatisch geboxt ( auto-boxingund unboxingtritt automatisch ab java 5) auf, Integerund daher können Sie die Anweisung auch so und auch verwenden Integer n = new Integer(9). Dies wird tatsächlich durch die Aussage erreichtInteger.valueOf(9).intValue();

Löwe
quelle
3

int ist ein primitiver Typ und kein Objekt. Das bedeutet, dass keine Methoden damit verbunden sind. Integer ist ein Objekt mit Methoden (z. B. parseInt).

Mit neuerem Java gibt es Funktionen für das automatische Boxen (und Unboxing). Das bedeutet, dass der Compiler bei Bedarf Integer.valueOf (int) oder integer.intValue () einfügt. Das heißt, es ist tatsächlich möglich zu schreiben

Integer n = 9;

was interpretiert wird als

Integer n = Integer.valueOf(9);
Roger Lindsjö
quelle
3

Integer ist eine Wrapper-Klasse / ein Wrapper-Objekt und int ist ein primitiver Typ. Dieser Unterschied spielt eine große Rolle, wenn Sie int-Werte in einer Sammlung speichern möchten, da sie nur Objekte als Werte akzeptieren (bis jdk1.4). JDK5 ab wegen Autoboxing ist es eine ganz andere Geschichte.

kosa
quelle
5
JDK5 + akzeptiert auch nur Objekte. Es ist nur so, dass Autoboxing den Compiler automatisch Integer.valueOf(i)oder Integer.intValue()für Sie aufrufen lässt . Collection<int>wird immer noch nicht funktionieren. Es ist also keine ganz andere Geschichte - es ist dieselbe Geschichte, nur mit ein bisschen Kurzschrift.
Yshavit
einverstanden. Entschuldigung, meine Formulierung spiegelt dies möglicherweise nicht wider.
kosa
3

In Java ist int ein primitiver Datentyp, während Integer eine Helper-Klasse ist. Es wird verwendet, um einen Datentyp in einen anderen zu konvertieren.

Beispielsweise:

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

Primitive Datentypen speichern den schnellsten verfügbaren Speicher, in dem die Helper-Klasse komplex ist, und speichern ihn im Heap-Speicher.

Referenz aus "David Gassner" Java Essential Training.

Aqeel Haider
quelle
2

intist ein primitiver Typ, der eine Ganzzahl darstellt. während Integerist ein Objekt, das umschließt int. DasInteger Objekt bietet Ihnen mehr Funktionen, z. B. das Konvertieren in Hex, String usw.

Sie können auch OOP-Konzepte mit verwenden Integer. Beispielsweise können Sie Integer für Generika verwenden (dh ).Collection<Integer>

MS
quelle
2

Dies stammt aus Java: The Complete Reference, 9. Ausgabe

Java verwendet primitive Typen (auch einfache Typen genannt) wie int oder double , um die von der Sprache unterstützten Basisdatentypen zu speichern. Aus Gründen der Leistung werden für diese Größen primitive Typen anstelle von Objekten verwendet . Die Verwendung von Objekten für diese Werte würde selbst den einfachsten Berechnungen einen inakzeptablen Overhead hinzufügen . Daher sind die primitiven Typen nicht Teil der Objekthierarchie und erben kein Objekt .

Trotz des Leistungsvorteils, den die primitiven Typen bieten, benötigen Sie manchmal eine Objektdarstellung. Beispielsweise können Sie einen primitiven Typ nicht als Referenz auf eine Methode übergeben . Viele der von Java implementierten Standarddatenstrukturen arbeiten auch mit Objekten. Dies bedeutet, dass Sie diese (objektspezifischen) Datenstrukturen nicht zum Speichern primitiver Typen verwenden können . Um diese (und andere) Situationen zu bewältigen, bietet Java Typ-Wrapper, Klassen, die einen primitiven Typ in einem Objekt kapseln.

Wrapper-Klassen beziehen sich direkt auf die Autoboxing- Funktion von Java . Die Typ-Wrapper sind Double, Float, Long, Integer, Short, Byte, Character und Boolean . Diese Klassen bieten eine Vielzahl von Methoden, mit denen Sie die primitiven Typen vollständig in die Objekthierarchie von Java integrieren können.

Teoman Shipahi
quelle
1

Zur Optimierung der Java - Code Laufzeit, int primitive Art (en) einschließlich hinzugefügt wurde float, boolusw. , aber sie kommen zusammen mit dort Wrapper - Klassen , so dass erforderlich , wenn Sie konvertieren und sie als Standard - Java - Objekt zusammen mit vielen Dienstprogramm verwenden können , die als Mitglied kommen Funktionen (wie Integer.parseInt("1")).

anand
quelle
1

intist ein primitiver Datentyp, während Integeres sich in Java um einen Referenz- oder Wrapper-Typ (Klasse) handelt.

nach java 1.5dem einführen , das Konzept der Autoboxing und Unboxing Sie beide initialisieren kann intoder Integerso.

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

warum Integer.parseInt("1");aber nicht int.parseInt("1");??

Integerist eine in der jdkBibliothek definierte Klasse und parseInt()gehört zu einer statischen MethodeInteger Klasse gehört

So Integer.parseInt("1");ist in Java möglich. ist aber intprimitiver Typ (wie ein Schlüsselwort annehmen) in Java. So können Sie nicht rufen Sie parseInt()mit int.

Vikrant Kashyap
quelle