Ich habe More Joel on Software gelesen , als ich auf Joel Spolsky stieß , der etwas über einen bestimmten Programmierertyp sagte, der den Unterschied zwischen einem int
und einem Integer
in Java / C # (objektorientierte Programmiersprachen) kannte .
Was ist der Unterschied?
Antworten:
In Java ist der Typ 'int' ein Grundelement, während der Typ 'Integer' ein Objekt ist.
In C # ist der Typ 'int' derselbe wie
System.Int32
und ein Werttyp (dh eher wie der Java- Typ 'int'). Eine Ganzzahl kann (genau wie alle anderen Werttypen) in ein Objekt eingefügt ("umbrochen") werden.Die Unterschiede zwischen Objekten und Grundelementen gehen etwas über den Rahmen dieser Frage hinaus, aber um es zusammenzufassen:
Objekte bieten Möglichkeiten für Polymorphismus, werden als Referenz übergeben (oder genauer gesagt, Referenzen werden als Wert übergeben) und vom Heap zugewiesen . Umgekehrt Primitiven sind unveränderlich - Typen , die von Wert übergeben werden und werden oft aus dem zugeordneten Stapel .
quelle
Nun, in Java ist ein int ein Grundelement, während eine Ganzzahl ein Objekt ist. Das heißt, wenn Sie eine neue Ganzzahl erstellt haben:
Sie könnten eine Methode für i aufrufen:
Während mit einem int:
Sie können keine Methoden dafür aufrufen, da es sich lediglich um ein Grundelement handelt. So:
würde einen Fehler erzeugen, da int kein Objekt ist.
int ist eines der wenigen Grundelemente in Java (zusammen mit char und einigen anderen). Ich bin nicht 100% sicher, aber ich denke, dass das Integer-Objekt mehr oder weniger nur eine int-Eigenschaft und eine ganze Reihe von Methoden zur Interaktion mit dieser Eigenschaft hat (wie zum Beispiel die toString () -Methode). Integer ist also eine ausgefallene Art, mit einem int zu arbeiten (genau wie String vielleicht eine ausgefallene Art ist, mit einer Gruppe von Zeichen zu arbeiten).
Ich weiß, dass Java nicht C ist, aber da ich noch nie in C programmiert habe, ist dies das Beste, was ich der Antwort geben könnte. Hoffe das hilft!
Ganzzahliges Objekt javadoc
Integer Ojbect vs. int primitiver Vergleich
quelle
Ich werde zu den oben gegebenen hervorragenden Antworten hinzufügen und über das Boxen und Unboxen sprechen und wie dies für Java gilt (obwohl C # es auch hat). Ich werde nur Java-Terminologie verwenden, weil ich damit besser vertraut bin .
Wie in den Antworten erwähnt,
int
handelt es sich nur um eine Zahl (als Unboxed- Typ bezeichnet), währendInteger
es sich um ein Objekt handelt (das die Nummer enthält, daher ein Boxed- Typ). In Java Bedingungen, dass die Mittel (außer diesen Methoden nicht in der Lage zu rufenint
), können Sie nicht speichernint
oder andere Nicht-Objekttypen in einer Sammlung (List
,Map
usw.). Um sie zu speichern, müssen Sie sie zuerst in der entsprechenden Box verpacken.Ab Java 5 gibt es so etwas wie Auto-Boxing und Auto-Unboxing, mit denen das Boxen / Unboxen hinter den Kulissen durchgeführt werden kann. Vergleichen und kontrastieren: Java 5 Version:
Java 1.4 oder früher (auch keine Generika):
Es ist zu beachten, dass trotz der Kürze in der Java 5-Version beide Versionen identischen Bytecode generieren. Obwohl also Auto-Boxen und Auto-Unboxing ist sehr bequem , weil Sie weniger Code schreiben, diese Operationen zu tun geschieht hinter den Kulissen mit den gleichen Laufzeitkosten, so dass Sie immer noch von ihrer Existenz bewusst sein müssen.
Hoffe das hilft!
quelle
Ich werde nur hier posten, da einige der anderen Beiträge in Bezug auf C # etwas ungenau sind.
Richtig:
int
ist ein Alias fürSystem.Int32
.Falsch:
float
ist kein Alias fürSystem.Float
, sondern fürSystem.Single
Grundsätzlich ist int ein reserviertes Schlüsselwort in der Programmiersprache C # und ein Alias für den
System.Int32
Werttyp.float und Float sind jedoch nicht dasselbe, da der richtige
float
Systemtyp für '' '' System.Single ist. Es gibt einige Typen wie diesen, die Schlüsselwörter reserviert haben, die nicht direkt mit den Typnamen übereinstimmen.In C # gibt es keinen Unterschied zwischen ''
int
'' und ''System.Int32
'' oder einem der anderen Paare oder Schlüsselwörter / Systemtypen, außer beim Definieren von Aufzählungen. Mit Aufzählungen können Sie die zu verwendende Speichergröße angeben. In diesem Fall können Sie nur das reservierte Schlüsselwort und nicht den Namen des Systemlaufzeittyps verwenden.Ob der Wert im int auf dem Stapel, im Speicher oder als referenziertes Heap-Objekt gespeichert wird, hängt vom Kontext und der Verwendung ab.
Diese Deklaration in einer Methode:
Definiert eine Variable
i
vom TypSystem.Int32
, die je nach Optimierung in einem Register oder auf dem Stapel gespeichert ist. Dieselbe Deklaration in einem Typ (Struktur oder Klasse) definiert ein Mitgliedsfeld. Dieselbe Deklaration in einer Methodenargumentliste definiert einen Parameter mit denselben Speicheroptionen wie für eine lokale Variable. (Beachten Sie, dass dieser Absatz nicht gültig ist, wenn Sie Iterator-Methoden in die Mischung ziehen. Dies sind insgesamt verschiedene Bestien.)Um ein Heap-Objekt zu erhalten, können Sie Folgendes verwenden:
Dadurch wird eine Box-Kopie des Inhalts von
i
auf dem Heap erstellt. In IL können Sie direkt auf Methoden für das Heap-Objekt zugreifen, in C # müssen Sie es jedoch in ein int zurückwandeln, wodurch eine weitere Kopie erstellt wird. Daher kann das Objekt auf dem Heap nicht einfach in C # geändert werden, ohne eine neue Boxkopie eines neuen int-Werts zu erstellen. (Ugh, dieser Absatz liest sich nicht so leicht.)quelle
In Bezug auf Java 1.5 und Autoboxing gibt es eine wichtige "Eigenart", die beim Vergleich von Integer-Objekten zum Tragen kommt.
In Java sind Integer-Objekte mit den Werten -128 bis 127 unveränderlich (dh für einen bestimmten Integer-Wert, z. B. 23, zeigen alle durch Ihr Programm instanziierten Integer-Objekte mit dem Wert 23 auf genau dasselbe Objekt).
Beispiel: Dies gibt true zurück:
Während dies false zurückgibt:
Das == vergleicht als Referenz (zeigen die Variablen auf dasselbe Objekt).
Dieses Ergebnis kann je nach verwendeter JVM unterschiedlich sein oder auch nicht. Die Spezifikation Autoboxing für Java 1.5 erfordert, dass Ganzzahlen (-128 bis 127) immer auf dasselbe Wrapper-Objekt gesetzt werden.
Eine Lösung? =) Beim Vergleich von Integer-Objekten sollte immer die Methode Integer.equals () verwendet werden.
Weitere Informationen unter java.net Beispiel unter bexhuff.com
quelle
127
wird vonsun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
In Java gibt es zwei Grundtypen in der JVM . 1) Primitive Typen und 2) Referenztypen. int ist ein primitiver Typ und Integer ist ein Klassentyp (der eine Art Referenztyp ist).
Primitive Werte teilen den Status nicht mit anderen primitiven Werten. Eine Variable, deren Typ ein primitiver Typ ist, enthält immer einen primitiven Wert dieses Typs.
Ein Objekt ist eine dynamisch erstellte Klasseninstanz oder ein Array. Die Referenzwerte (oft nur Referenzen) sind Zeiger auf diese Objekte und eine spezielle Nullreferenz, die sich auf kein Objekt bezieht. Es kann viele Verweise auf dasselbe Objekt geben.
Auch in Java wird alles als Wert übergeben. Bei Objekten ist der übergebene Wert die Referenz auf das Objekt. Ein weiterer Unterschied zwischen int und Integer in Java besteht darin, wie sie in Methodenaufrufen übergeben werden. Zum Beispiel in
Die Variable zwei wird als primitiver ganzzahliger Typ 2 übergeben
Die Variable zwei wird als Referenz auf ein Objekt übergeben, das den ganzzahligen Wert 2 enthält.
@ WolfmanDragon: Pass by Reference würde so funktionieren:
Wenn das Inkrement aufgerufen wird, übergibt es eine Referenz (einen Zeiger) an die Variable a . Und die Inkrementfunktion ändert direkt die Variable a .
Und für Objekttypen würde es wie folgt funktionieren:
Sehen Sie jetzt den Unterschied?
quelle
In C # ist int nur ein Alias für
System.Int32
, string fürSystem.String
, double fürSystem.Double
etc ...Persönlich bevorzuge ich int, string, double usw., weil sie keine
using System;
Aussage erfordern :) Ein dummer Grund, ich weiß ...quelle
Es gibt viele Gründe, Wrapper-Klassen zu verwenden:
quelle
Dies wurde bereits für Java beantwortet. Hier ist die C # -Antwort:
"Integer" ist kein gültiger Typname in C # und "int" ist nur ein Alias für System.Int32. Im Gegensatz zu Java (oder C ++) gibt es in C # keine speziellen primitiven Typen. Jede Instanz eines Typs in C # (einschließlich int) ist ein Objekt. Hier ist ein Demonstrationscode:
quelle
int wird verwendet, um eine primitive Variable zu deklarieren
Integer wird verwendet, um eine Referenzvariable der Klasse Integer zu erstellen
quelle
In Plattformen wie Java sind
int
s Grundelemente, währendInteger
es sich um ein Objekt handelt, das ein ganzzahliges Feld enthält. Der wichtige Unterschied besteht darin, dass Primitive immer nach Wert weitergegeben werden und per Definition unveränderlich sind.Jede Operation mit einer primitiven Variablen gibt immer einen neuen Wert zurück. Auf der anderen Seite werden Objekte als Referenz herumgereicht. Man könnte argumentieren, dass der Punkt auf das Objekt (AKA die Referenz) ebenfalls als Wert weitergegeben wird, der Inhalt jedoch nicht.
quelle
Eine weitere Sache, die ich in früheren Antworten nicht sehe: In Java werden die primitiven Wrapper-Klassen wie Integer, Double, Float, Boolean ... und String als invariant angenommen, sodass beim Übergeben einer Instanz dieser Klassen die aufgerufenen Klassen Die Methode konnte Ihre Daten in keiner Weise ändern, in opositión mit den meisten anderen Klassen, deren interne Daten durch ihre öffentlichen Methoden geändert werden konnten. Damit diese Klassen neben dem Konstruktor nur 'Getter'-Methoden haben, keine' Setter '.
In einem Java-Programm werden String-Literale in einem separaten Teil des Heap-Speichers gespeichert, nur in einer Instanz für Literal, um Speicherplatz zu sparen und diese Instanzen wiederzuverwenden
quelle
Haben Sie schon einmal programmiert, dann ist (int) einer der primitiven Typen, die Sie für Ihre Variablen festlegen können (genau wie char, float, ...).
Integer ist jedoch eine Wrapper-Klasse, mit der Sie einige Funktionen für eine int-Variable ausführen können (z. B. in String konvertieren oder umgekehrt, ...). Beachten Sie jedoch, dass die Methoden in den Wrapper-Klassen statisch sind, damit Sie sie verwenden können jederzeit ohne eine Instanz der Integer-Klasse zu erstellen. als Zusammenfassung:
x und y sind beide Variablen vom Typ int, aber y wird von einer Integer-Klasse umschlossen und verfügt über mehrere Methoden, die Sie verwenden. Wenn Sie jedoch einige Funktionen der Integer-Wrapper-Klasse aufrufen müssen, können Sie dies einfach tun.
Beachten Sie jedoch, dass sowohl x als auch y korrekt sind. Wenn Sie sie jedoch nur als primitiven Typ verwenden möchten, verwenden Sie die einfache Form (zur Definition von x).
quelle
Java:
int
,double
,long
,byte
,float
,double
,short
,boolean
,char
- Primitiven. Wird zum Halten der von der Sprache unterstützten Basisdatentypen verwendet. Die primitiven Typen sind nicht Teil der Objekthierarchie und erben kein Objekt. Dies kann unter Bezugnahme auf eine Methode übergeben werden.Double
,Float
,Long
,Integer
,Short
,Byte
,Character
, UndBoolean
ist Typ Wrappers, verpackt injava.lang
. Alle Wrapper vom numerischen Typ definieren Konstruktoren, mit denen ein Objekt aus einem bestimmten Wert oder einer Zeichenfolgendarstellung dieses Werts erstellt werden kann. Die Verwendung von Objekten kann selbst den einfachsten Berechnungen einen Overhead hinzufügen.Seit JDK 5 enthält Java zwei sehr hilfreiche Funktionen: Autoboxing und Autounboxing. Autoboxing / Unboxing vereinfacht und rationalisiert Code, der primitive Typen in Objekte konvertieren muss, erheblich und umgekehrt.
Beispiel für Konstruktoren:
Beispiel für Boxen / Unboxen:
Beispiel für Autoboxing / Autounboxing:
PS Herbert Schildts Buch wurde als Referenz genommen.
quelle
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-) Typ Integer 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.
quelle
Ein int und eine Ganzzahl in Java und C # sind zwei verschiedene Begriffe, die zur Darstellung verschiedener Dinge verwendet werden. Dies ist einer der primitiven Datentypen, die einer Variablen zugewiesen werden können, die genau gespeichert werden kann. Jeweils ein Wert seines deklarierten Typs.
Beispielsweise:
Wo
int
ist der Datentyp der Variablennummer zugeordnet, die den Wert sieben enthält? Einint
ist also nur ein Primitiv, kein Objekt.Während an
Integer
eine Wrapper-Klasse für einen primitiven Datentyp ist, der statische Methoden hat. Dies kann als Argument für eine Methode verwendet werden, für die ein Objekt erforderlich ist, wobei int als Argument für eine Methode verwendet werden kann, für die ein ganzzahliger Wert erforderlich ist, der für arithmetische Ausdrücke verwendet werden kann.Beispielsweise:
quelle
In beiden Sprachen (Java und C #)
int
handelt es sich um eine 4-Byte-Ganzzahl mit Vorzeichen.Im Gegensatz zu Java bietet C # sowohl vorzeichenbehaftete als auch vorzeichenlose Ganzzahlwerte. Da Java und C # objektobjektorientiert sind, werden einige Operationen in diesen Sprachen nicht direkt auf Anweisungen abgebildet, die von der Laufzeit bereitgestellt werden, und müssen daher als Teil eines Objekts eines bestimmten Typs definiert werden.
C # gibt an,
System.Int32
welcher Werttyp einen Teil des Speichers verwendet, der zum Referenztyp auf dem Heap gehört.Java stellt
java.lang.Integer
einen Referenztyp bereit, mit dem gearbeitet wirdint
. Die Verfahren inInteger
nicht direkt Zeit laufen kompiliert werden instructions.So wir einen int - Wert Kasten es in eine Instanz von Integer zu konvertieren und die Methoden verwenden , die Instanz eines Typs erwartet (wietoString()
,parseInt()
,valueOf()
usw.).In C # int Variable bezieht sich auf
System.Int32.Any
4-Byte - Wert im Speicher kann als primitiven int interpretiert werden, die von der Instanz System.Int32.So int manipuliert werden kann , ist ein Alias fürSystem.Int32.When
Verwendung integer-verwandter Methoden wieint.Parse()
,int.ToString()
usw. Ganzzahl ist in kompiliert die FCL-System.Int32
Struktur, die die jeweiligen Methoden aufruft, wieInt32.Parse()
,Int32.ToString()
.quelle
In Java ist der
int
Typ ein primitiver Datentyp, wobei derInteger
Typ ein Objekt ist.In C # ist der
int
Typ auch ein Datentyp wieSystem.Int32
. Eininteger
(wie alle anderen Werttypen) kann in ein Objekt gepackt ("eingewickelt") werden.quelle
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:
Primitive Datentypen speichern den schnellsten verfügbaren Speicher, in dem die Helper-Klasse komplex ist, und speichern ihn im Heep-Speicher.
Referenz aus "David Gassner" Java Essential Training.
quelle
"int" ist ein primitiver Datentyp und "Integer" in der Wrapper-Klasse in Java. "Integer" kann als Argument für eine Methode verwendet werden, für die ein Objekt erforderlich ist, wobei "int" als Argument für eine Methode verwendet werden kann, für die ein ganzzahliger Wert erforderlich ist, der für arithmetische Ausdrücke verwendet werden kann.
quelle
01. Ganzzahl kann null sein. Int kann jedoch nicht null sein.
02. Nur Wrapper Classes-Typwerte können an eine Auflistungsklasse übergeben werden.
(Wrapper-Klassen - Boolesch, Zeichen, Byte, Kurz, Ganzzahl, Lang, Gleitkomma, Doppel)
Aber normalerweise fügen wir der Sammlungsklasse primitive Werte hinzu? Ist Punkt 02 richtig?
Ja 02 ist richtig, beacouse
autoboxing.
Dann 5 durch Autoboxing als Integer-Wert konvertieren.
quelle
int
ist in der Bibliotheksfunktion c # vordefiniert, aber in Java können wir ein Objekt von erstellenInteger
quelle
(Java-Version) In einfachen Worten ist int primitiv und Integer ist das Wrapper-Objekt für int.
Ein Beispiel für die Verwendung von Integer vs int: Wenn Sie die Variable int und null erneut vergleichen möchten, wird ein Fehler ausgegeben.
quelle
In Java nach meinem Wissen, wenn Sie dann lernen, wenn Sie int a schreiben; dann in Java Generic wird es Code wie kompilieren
Integer a = new Integer()
. Also, laut GenerikaInteger
wird nicht verwendet, sondernint
verwendet. da gibt es also so einen Unterschied.quelle
int ist ein primitiver Datentyp. Integer ist eine Wrapper-Klasse. Es kann int-Daten als Objekte speichern.
quelle
int ist ein primitiver Datentyp, während Integer ein Objekt ist. Wenn Sie ein Objekt mit Integer erstellen, erhalten Sie Zugriff auf alle Methoden, die in der Integer-Klasse verfügbar sind. Wenn Sie jedoch einen primitiven Datentyp mit int erstellen, können Sie diese eingebauten Methoden nicht verwenden und müssen sie selbst definieren. Wenn Sie jedoch keine anderen Methoden wünschen und das Programm speichereffizienter gestalten möchten, können Sie den primitiven Datentyp verwenden, da das Erstellen eines Objekts den Speicherverbrauch erhöht.
quelle