Frage

ich habe gelesen Mehr Joel zum Thema Software als ich darauf stieß Joel Spolsky etwas über einen bestimmten Typ von Programmierer sagen, der den Unterschied zwischen einem kennt int und ein Integer in Java/C# (Objektorientierte Programmiersprachen).

Was ist also der Unterschied?

War es hilfreich?

Lösung

In Java, Der Typ „int“ ist ein Primitiv, während der Typ „Integer“ ein Objekt ist.

In C#, Der Typ „int“ ist derselbe wie System.Int32 und ist ein Werttyp (dh eher wie das Java 'int').Eine Ganzzahl (genau wie alle anderen Werttypen) kann sein verpackt („eingewickelt“) in ein Objekt.


Die Unterschiede zwischen Objekten und Grundelementen gehen etwas über den Rahmen dieser Frage hinaus, aber um es zusammenzufassen:

Objekte stellen Möglichkeiten für Polymorphismus bereit, werden als Referenz übergeben (oder genauer gesagt, Referenzen werden als Wert übergeben) und werden von zugewiesen Haufen.Umgekehrt, Primitiven sind unveränderliche Typen, die als Wert übergeben und oft von zugewiesen werden Stapel.

Andere Tipps

Nun, in Java ist ein int ein Grundelement, während ein Integer ein Objekt ist.Das heißt, wenn Sie eine neue Ganzzahl erstellt haben:

Integer i = new Integer(6);

Sie könnten eine Methode für i aufrufen:

String s = i.toString();//sets s the string representation of i

Während mit einem int:

int i = 6;

Sie können keine Methoden dafür aufrufen, da es sich lediglich um ein Grundelement handelt.Also:

String s = i.toString();//will not work!!!

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 mir 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 schicke Möglichkeit, mit einem int zu arbeiten (so wie vielleicht String eine schicke Möglichkeit ist, mit einer Gruppe von Zeichen zu arbeiten).

Ich weiß, dass Java nicht C ist, aber da ich noch nie in C programmiert habe, kommt dies meiner Antwort am nächsten.Hoffe das hilft!

Ganzzahliges Objekt Javadoc

Integer Ojbect vs.int primitiver Vergleich

Ich werde die oben gegebenen hervorragenden Antworten ergänzen und über Boxing und Unboxing sprechen und darüber, wie dies auf Java zutrifft (obwohl C# es auch hat).Ich werde nur Java-Terminologie verwenden, weil ich mehr bin au fait damit.

Wie in den Antworten erwähnt, int ist nur eine Zahl (genannt die ausgepackt Typ), wohingegen Integer ist ein Objekt (das die Zahl enthält, also a verpackt Typ).In Java-Begriffen bedeutet das (abgesehen davon, dass keine Methoden aufgerufen werden können). int), können Sie nicht speichern int oder andere Nicht-Objekttypen in Sammlungen (List, Map, usw.).Um sie aufzubewahren, müssen Sie sie zunächst in der entsprechenden Verpackungsart verpacken.

Ab Java 5 gibt es etwas namens Autoboxen Und Automatisches Auspacken Dadurch kann das Ein- und Auspacken hinter den Kulissen erfolgen.Vergleichen und gegenüberstellen:Java 5-Version:

Deque<Integer> queue;

void add(int n) {
    queue.add(n);
}

int remove() {
    return queue.remove();
}

Java 1.4 oder früher (auch keine Generika):

Deque queue;

void add(int n) {
    queue.add(Integer.valueOf(n));
}

int remove() {
    return ((Integer) queue.remove()).intValue();
}

Es ist zu beachten, dass trotz der Kürze der Java 5-Version beide Versionen identischen Bytecode generieren.Obwohl Auto-Boxing und Auto-Unboxing sehr praktisch sind, weil Sie weniger Code schreiben müssen, sind diese Vorgänge sehr praktisch Tun geschehen hinter den Kulissen und mit den gleichen Laufzeitkosten, sodass Sie sich ihrer Existenz immer noch bewusst sein müssen.

Hoffe das hilft!

Ich werde einfach hier posten, da einige der anderen Beiträge in Bezug auf C# etwas ungenau sind.

Richtig: int ist ein Alias ​​für System.Int32.
Falsch: float ist kein Alias ​​für System.Float, aber für System.Single

Grundsätzlich ist int ein reserviertes Schlüsselwort in der Programmiersprache C# und ein Alias ​​für System.Int32 Werttyp.

float und Float sind jedoch nicht dasselbe, da sie der richtige Systemtyp für '' sind.float'' ist System.Single.Es gibt einige Typen wie diesen, die reservierte Schlüsselwörter haben, die nicht direkt mit den Typnamen übereinstimmen.

In C# gibt es keinen Unterschied zwischen ''int'' Und ''System.Int32'' oder eines der anderen Paare oder Schlüsselwörter/Systemtypen, außer bei der Definition 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 Art und Weise ab, wie Sie es verwenden.

Diese Deklaration in einer Methode:

int i;

definiert eine Variable i vom Typ System.Int32, lebend in einem Register oder auf dem Stapel, je nach Optimierung.Die gleiche 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 anfangen, Iteratormethoden in die Mischung einzubeziehen. Dies sind insgesamt verschiedene Dinge.)

Um ein Heap-Objekt zu erhalten, können Sie Boxen verwenden:

object o = i;

Dadurch wird eine verpackte Kopie des Inhalts erstellt i auf dem Haufen.In IL können Sie direkt auf Methoden des Heap-Objekts zugreifen, aber in C# müssen Sie es zurück in ein int umwandeln, wodurch eine weitere Kopie erstellt wird.Daher kann das Objekt auf dem Heap in C# nicht einfach geändert werden, ohne eine neue Boxkopie eines neuen int-Werts zu erstellen.(Ugh, dieser Absatz ist nicht so einfach zu lesen.)

Bezüglich Java 1.5 und Autoboxen Es gibt 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 (d. h. für einen bestimmten Integer-Wert, beispielsweise 23, verweisen alle durch Ihr Programm instanziierten Integer-Objekte mit dem Wert 23 auf den genau dasselbe Objekt).

Beispiel: Dies gibt true zurück:

Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2); //  true

Während dies false zurückgibt:

Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1 == i2); //  false

Das == vergleicht per Referenz (zeigen die Variablen auf dasselbe Objekt).

Dieses Ergebnis kann je nach verwendeter JVM unterschiedlich sein oder auch nicht.Die Autoboxing-Spezifikation für Java 1.5 erfordert, dass Ganzzahlen (-128 bis 127) immer an dasselbe Wrapper-Objekt geboxt werden.

Eine Lösung?=) Beim Vergleich von Integer-Objekten sollte man immer die Methode Integer.equals() verwenden.

System.out.println(i1.equals(i2)); //  true

Weitere Infos unter java.net Beispiel bei bexhuff.com

In Java gibt es zwei Grundtypen 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 ihren Zustand nicht mit anderen primitiven Werten.Eine Variable, deren Typ ein primitiver Typ ist, enthält immer einen primitiven Wert dieses Typs.

int aNumber = 4;
int anotherNum = aNumber;
aNumber += 6;
System.out.println(anotherNum); // Prints 4

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 auf kein Objekt verweist.Es kann viele Verweise auf dasselbe Objekt geben.

Integer aNumber = Integer.valueOf(4);
Integer anotherNumber = aNumber; // anotherNumber references the 
                                 // same object as aNumber

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

public int add(int a, int b) {
    return a + b;
}
final int two = 2;
int sum = add(1, two);

Die Variable zwei wird als primitiver Ganzzahltyp 2 übergeben.Während in

public int add(Integer a, Integer b) {
    return a.intValue() + b.intValue();
}
final Integer two = Integer.valueOf(2);
int sum = add(Integer.valueOf(1), two);

Die Variable zwei wird als Referenz auf ein Objekt übergeben, das den ganzzahligen Wert 2 enthält.


@WolfmanDragon:Die Übergabe als Referenz würde folgendermaßen funktionieren:

public void increment(int x) {
  x = x + 1;
}
int a = 1;
increment(a);
// a is now 2

Wenn Inkrement aufgerufen wird, wird eine Referenz (Zeiger) auf die Variable übergeben A.Und das Zuwachs Die Funktion ändert die Variable direkt A.

Und für Objekttypen würde es wie folgt funktionieren:

public void increment(Integer x) {
  x = Integer.valueOf(x.intValue() + 1);
}
Integer a = Integer.valueOf(1);
increment(a);
// a is now 2

Erkennen Sie jetzt den Unterschied?

In C# ist int nur ein alias für System.Int32, Zeichenfolge für System.String, doppelt für System.Double usw...

Persönlich bevorzuge ich int, string, double usw.weil sie keine benötigen using System; Aussage :) Ein dummer Grund, ich weiß...

Es gibt viele Gründe, Wrapper-Klassen zu verwenden:

  1. Wir erhalten zusätzliches Verhalten (zum Beispiel können wir Methoden verwenden)
  2. Wir können Nullwerte speichern, während dies in Grundelementen nicht möglich ist
  3. Sammlungen unterstützen das Speichern von Objekten und nicht von Grundelementen.

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.Außerdem gibt es im Gegensatz zu Java (oder C++) in C# keine speziellen primitiven Typen, jede Instanz eines Typs in C# (einschließlich int) ist ein Objekt.Hier ist ein demonstrativer Code:

void DoStuff()
{
    System.Console.WriteLine( SomeMethod((int)5) );
    System.Console.WriteLine( GetTypeName<int>() );
}

string SomeMethod(object someParameter)
{
    return string.Format("Some text {0}", someParameter.ToString());
}

string GetTypeName<T>()
{
    return (typeof (T)).FullName;
}

int wird verwendet, um eine primitive Variable zu deklarieren

e.g. int i=10;

Integer wird verwendet, um eine Referenzvariable der Klasse Integer zu erstellen

Integer a = new Integer();

Auf Plattformen wie Java, ints sind Primitive while Integer ist ein Objekt, das ein ganzzahliges Feld enthält.Der wichtige Unterschied besteht darin, dass Grundelemente immer als Wert weitergegeben werden und per Definition unveränderlich sind.

Jede Operation, an der eine primitive Variable beteiligt ist, gibt immer einen neuen Wert zurück.Andererseits werden Objekte per Referenz weitergegeben.Man könnte argumentieren, dass der Punkt auf das Objekt (auch bekannt als die Referenz) ebenfalls als Wert weitergegeben wird, der Inhalt jedoch nicht.

Eine weitere Sache, die ich in früheren Antworten nicht gesehen habe:In Java sind die primitiven Wrapper-Klassen wie Integer, Double, Float, Boolean ...und String sollen invariant sein, sodass die aufgerufene Methode beim Übergeben einer Instanz dieser Klassen Ihre Daten in keiner Weise ändern kann, im Gegensatz zu den meisten anderen Klassen, deren interne Daten durch ihre öffentlichen Methoden geändert werden könnten.Damit diese Klasse außer dem Konstruktor nur „Getter“-Methoden und keine „Setter“ hat.

In einem Java-Programm werden String-Literale in einem separaten Teil des Heap-Speichers gespeichert, nur in einer Instanz für Literale, um durch die Wiederverwendung dieser Instanzen Speicher zu sparen

Haben Sie schon einmal programmiert? (int) ist einer der primitiven Typen, die Sie für Ihre Variablen festlegen können (genau wie char, float, ...).

Aber Integer ist eine Wrapper-Klasse, mit der Sie einige Funktionen für eine int-Variable ausführen können (z. B. in einen String konvertieren oder umgekehrt, ...). Beachten Sie jedoch, dass die Methoden in den Wrapper-Klassen statisch sind, sodass Sie sie verwenden können jederzeit, ohne eine Instanz der Integer-Klasse zu erstellen.als rekapitulation:

int x;
Integer y; 

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 können. Wenn Sie jedoch einige Funktionen der Integer-Wrapper-Klasse aufrufen müssen, können Sie dies einfach tun.

Integer.toString(x);

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 (wird zur Definition von x verwendet).

Java:

int, double, long, byte, float, double, short, boolean, char - Primitiven.Wird für den Halten der grundlegenden Datentypen verwendet, die von der Sprache unterstützt werden.Die primitiven Typen sind nicht Teil der Objekthierarchie und erben kein Objekt.Das kann als Referenz an eine Methode übergeben werden.

Double, Float, Long, Integer, Short, Byte, Character, Und Boolean, sind Art Wrapper, verpackt in java.lang.Alle numerischen Typ-Wrapper definieren Konstruktoren, die die Konstruktion eines Objekts aus einem bestimmten Wert oder einer Zeichenfolgendarstellung dieses Werts ermöglichen.Die Verwendung von Objekten kann selbst bei einfachsten Berechnungen zu einem Mehraufwand führen.

Ab JDK 5 verfügt Java über zwei sehr hilfreiche Funktionen:Autoboxing und Autounboxing.Autoboxing/Unboxing vereinfacht und rationalisiert den Code, der primitive Typen in Objekte konvertieren muss, und umgekehrt, erheblich.

Beispiel für Konstruktoren:

Integer(int num)
Integer(String str) throws NumberFormatException
Double(double num)
Double(String str) throws NumberFormatException

Beispiel für das Ein-/Auspacken:

class ManualBoxing {
        public static void main(String args[]) {
        Integer objInt = new Integer(20);  // Manually box the value 20.
        int i = objInt.intValue();  // Manually unbox the value 20
        System.out.println(i + " " + iOb); // displays 20 20
    }
}

Beispiel für Autoboxing/Autounboxing:

class AutoBoxing {
    public static void main(String args[]) {
        Integer objInt = 40; // autobox an int
        int i = objInt ; // auto-unbox
        System.out.println(i + " " + iOb); // displays 40 40
    }
}

P.S.Als Referenz diente das Buch von Herbert Schildt.

int ist ein primitiver Datentyp.Ganze Zahl ist eine Wrapper-Klasse.Es kann int-Daten als Objekte speichern.

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

Java führt automatisch eine Umwandlung zwischen den beiden durch;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 wird Boxing/Unboxing genannt.

Wenn eine Integer-Variable, die auf Null verweist, explizit oder implizit entpackt wird, wird eine NullPointerException ausgelöst.

Int und Integer sind in Java und C# zwei verschiedene Begriffe, die zur Darstellung unterschiedlicher Dinge verwendet werden.Es ist einer der primitiven Datentypen, die einer Variablen zugewiesen werden können, die genau speichern kann.Jeweils ein Wert seines deklarierten Typs.

Zum Beispiel:

int number = 7;

Wo int ist der Datentyp, der der Variablennummer zugewiesen ist, die den Wert sieben enthält.Also ein int ist nur ein Grundelement, kein Objekt.

Während ein Integer ist eine Wrapper-Klasse für einen primitiven Datentyp, der über statische Methoden verfügt.Dies kann als Argument für eine Methode verwendet werden, die ein Objekt erfordert, während int als Argument für eine Methode verwendet werden kann, die einen ganzzahligen Wert erfordert, der für arithmetische Ausdrücke verwendet werden kann.

Zum Beispiel:

Integer number = new Integer(5);

In beiden Sprachen (Java und C#) int ist eine 4-Byte-Ganzzahl mit Vorzeichen.

Im Gegensatz zu Java stellt C# sowohl vorzeichenbehaftete als auch vorzeichenlose Ganzzahlwerte bereit.Da Java und C# objektorientiert sind, lassen sich einige Operationen in diesen Sprachen nicht direkt auf von der Laufzeit bereitgestellte Anweisungen abbilden und müssen daher als Teil eines Objekts eines bestimmten Typs definiert werden.

C# bietet System.Int32 Dabei handelt es sich um einen Werttyp, der einen Teil des Speichers verwendet, der zum Referenztyp auf dem Heap gehört.

Java bietet java.lang.Integer Dies ist ein Referenztyp, auf dem gearbeitet wird int.Die Methoden in Integer kann nicht direkt zu Laufzeitanweisungen kompiliert werden. Also packen wir einen int-Wert, um ihn in eine Instanz von Integer umzuwandeln, und verwenden die Methoden, die eine Instanz eines bestimmten Typs erwarten (z. B toString(), parseInt(), valueOf() usw).

In C# bezieht sich die Variable int auf System.Int32.Any Ein 4-Byte-Wert im Speicher kann als primitives int interpretiert werden, das durch die Instanz von System.Int32 manipuliert werden kann. Int ist also ein Alias ​​für System.Int32.When mit ganzzahlbezogenen Methoden wie int.Parse(), int.ToString() usw.Ganzzahl wird in die FCL kompiliert System.Int32 struct Aufruf der jeweiligen Methoden wie Int32.Parse(), Int32.ToString().

In Java ist das int Typ ist ein primitiver Datentyp, wobei als Integer Typ ist ein Objekt.

In C# ist die int Typ ist auch ein Datentyp wie System.Int32.Ein integer (genau wie alle anderen Werttypen) können in ein Objekt eingepackt („eingepackt“) werden.

In Java ist int ein primitiver Datentyp, während Integer eine Hilfsklasse ist, die zum Konvertieren eines Datentyps in einen anderen verwendet wird.

Zum Beispiel:

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, wenn die Hilfsklasse komplex ist, und speichern sie im Heep-Speicher.

Referenz von „David Gassner“ Java Essential Training.

„int“ ist ein primitiver Datentyp und „Integer“ in der Wrapper-Klasse in Java.„Integer“ kann als Argument für eine Methode verwendet werden, die ein Objekt erfordert, während „int“ als Argument für eine Methode verwendet werden kann, die einen ganzzahligen Wert erfordert, der für arithmetische Ausdrücke verwendet werden kann.

01.Ganzzahl kann null sein.Aber int kann nicht null sein.

Integer value1 = null; //OK

int value2 = null      //Error

02.Es können nur Werte vom Typ „Wrapper-Klassen“ an jede Sammlungsklasse übergeben werden.

(Wrapper-Klassen – Boolean,Character,Byte,Short,Integer,Long,Float,Double)

List<Integer> element = new ArrayList<>();
int valueInt = 10;
Integer  valueInteger = new Integer(value);
element.add(valueInteger);

Aber normalerweise fügen wir der Sammlungsklasse primitive Werte hinzu?Ist Punkt 02 richtig?

List<Integer> element = new ArrayList<>();
element.add(5);

Ja, 02 ist richtig, weil autoboxing.

Autoboxing ist die automatische Umwandlung, die der Java -Compiler zwischen dem primitiven Typ und seiner entsprechenden Wrapper -Klasse durchführt.

Dann wird 5 durch Autoboxing als Ganzzahlwert konvertiert.

int ist in der Bibliotheksfunktion c# vordefiniert, aber in Java können wir ein Objekt davon erstellen Integer

(Java -Version) In einfachen Worten ist int primitiv und Ganzzahl ist ein Wrapper -Objekt für int.

Ein Beispiel für die Verwendung von „Integer“ vs. „int“: Wenn Sie die Variable „int“ erneut mit „null“ vergleichen möchten, wird ein Fehler ausgegeben.

int a;
//assuming a value you are getting from data base which is null
if(a ==null) // this is wrong - cannot compare primitive to null
{
do something...}

Instead you will use,
Integer a;
//assuming a value you are getting from data base which is null
if(a ==null) // this is correct/legal
{ do something...}

In Java, soweit ich weiß, wenn Sie lernen, wenn Sie int a schreiben;Dann wird in Java Generic Code wie kompiliert Integer a = new Integer().Also, wie bei Generika Integer wird aber nicht verwendet int wird eingesetzt.Es gibt also so einen großen Unterschied.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top