Qual è la differenza tra un int e un intero in Java e C #?


Risposte:


247

In Java, il tipo 'int' è una primitiva, mentre il tipo 'Integer' è un oggetto.

In C #, il tipo 'int' è uguale System.Int32ed è un tipo di valore (cioè più simile a java 'int'). Un numero intero (proprio come qualsiasi altro tipo di valore) può essere inscatolato ("avvolto") in un oggetto.


Le differenze tra oggetti e primitivi vanno oltre lo scopo di questa domanda, ma per riassumere:

Gli oggetti forniscono strutture per il polimorfismo, sono passati per riferimento (o più accuratamente hanno riferimenti passati per valore) e sono allocati dall'heap . Al contrario, le primitive sono tipi immutabili che vengono passati per valore e spesso allocati dallo stack .


61
L'affermazione che "gli oggetti [...] vengono passati per riferimento" è confusa e errata, IMO. È più preciso affermare che "I riferimenti agli oggetti vengono passati per valore". (Anche le primitive non sono sempre allocate dallo stack - considera un campo primitivo all'interno di un oggetto ...)
Jon Skeet,

5
Almeno in C #, int è una parola chiave del linguaggio equivalente al tipo di CLR Int32 (in realtà CTS).
Scott Dorman,

6
Siamo spiacenti, la lingua inglese non fa "passare qualcosa per riferimento" e "passare un riferimento a qualcosa per valore" dichiarazioni equivalenti, né hanno significati equivalenti in un contesto di linguaggio di programmazione.
Alan Krueger,

8
-1. Questo può descrivere accuratamente come Java gestisce questo, ma per C # è chiaramente sbagliato.
Joey,

8
Perché questo è votato? La risposta è sbagliata Non è del tutto giusto per Java, e nemmeno vicino a destra per C #. Qualcuno che legge questo saprà meno sull'argomento rispetto a prima.
Thom Smith,

153

Bene, in Java un int è una primitiva mentre un intero è un oggetto. Significato, se hai creato un nuovo numero intero:

Integer i = new Integer(6);

Potresti chiamare un metodo su i:

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

Considerando che con un int:

int i = 6;

Non è possibile chiamare alcun metodo su di esso, perché è semplicemente una primitiva. Così:

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

produrrebbe un errore, perché int non è un oggetto.

int è uno dei pochi primitivi in ​​Java (insieme a char e alcuni altri). Non sono sicuro al 100%, ma sto pensando che l'oggetto Integer ha più o meno solo una proprietà int e un sacco di metodi per interagire con quella proprietà (come ad esempio il metodo toString ()). Quindi Integer è un modo fantastico per lavorare con un int (proprio come forse String è un modo elegante per lavorare con un gruppo di caratteri).

So che Java non è C, ma dal momento che non ho mai programmato in C questo è il più vicino che potrei arrivare alla risposta. Spero che questo ti aiuti!

Oggetto intero javadoc

Integer Ojbect vs. int confronto primitivo



Non conosco Java ma non esiste un tipo intero ma Int32, Int64 e sono tutti strutt che è di tipo valore. Primitivo significa in C # che i tipi sono definiti in FCL (Framework Class Library) dal team CLR ed è per questo che vengono chiamati primitivi. In questo caso anche Date obj è chiamato tipo primitivo.
Tarik,

37

Aggiungerò le risposte eccellenti fornite sopra e parlerò di boxe e unboxing e di come questo si applica a Java (anche se ce l'ha anche C #). Userò solo la terminologia Java, perché io sono più al corrente con quello.

Poiché le risposte menzionato, intè solo un numero (chiamato unboxed tipo), che Integerè un oggetto (che contiene il numero, quindi un scatolato tipo). In termini di Java, che i mezzi (oltre a non essere in grado di chiamare metodi su int), non è possibile memorizzare into di altro tipo non-oggetto in collezioni ( List, Map, ecc). Per memorizzarli, è necessario prima impilarli nel tipo di scatola corrispondente.

Java 5 in poi ha qualcosa chiamato auto-boxing e auto-unboxing che consente di eseguire boxe / unboxing dietro le quinte. Confronto e contrasto: versione Java 5:

Deque<Integer> queue;

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

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

Java 1.4 o precedente (neanche generici):

Deque queue;

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

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

Va notato che nonostante la brevità della versione Java 5, entrambe le versioni generano un bytecode identico. Quindi, anche se l'auto-boxing e auto-unboxing sono molto convenienti perché si scrive meno codice, queste operazioni fanno accade dietro le quinte, con gli stessi costi di runtime, in modo da avere ancora di essere a conoscenza della loro esistenza.

Spero che questo ti aiuti!


2
Deque non è in Java 1.5 o 1.4. È stato aggiunto in 1.6.
Leo Izen,

28

Pubblicherò qui solo perché alcuni degli altri post sono leggermente imprecisi rispetto a C #.

Corretto: int è un alias per System.Int32.
Sbagliato: float non è un alias per System.Float, ma perSystem.Single

Fondamentalmente, int è una parola chiave riservata nel linguaggio di programmazione C # ed è un alias per il System.Int32tipo di valore.

float e Float non sono uguali, in quanto il giusto tipo di sistema per '' float'' è System.Single. Ci sono alcuni tipi come questo che ha parole chiave riservate che non sembrano corrispondere direttamente ai nomi dei tipi.

In C # non c'è alcuna differenza tra '' ' int' 'e' ' System.Int32' ', o una qualsiasi delle altre coppie o parole chiave / tipi di sistema, tranne quando si definiscono gli enum. Con enum è possibile specificare le dimensioni di archiviazione da utilizzare e in questo caso è possibile utilizzare solo la parola chiave riservata e non il nome del tipo di runtime del sistema.

Se il valore in int verrà archiviato nello stack, in memoria o come oggetto heap di riferimento dipende dal contesto e da come lo si utilizza.

Questa dichiarazione in un metodo:

int i;

definisce una variabile idi tipo System.Int32, che vive in un registro o nello stack, a seconda delle ottimizzazioni. La stessa dichiarazione in un tipo (struct o class) definisce un campo membro. La stessa dichiarazione in un elenco di argomenti del metodo definisce un parametro, con le stesse opzioni di archiviazione di una variabile locale. (nota che questo paragrafo non è valido se inizi a inserire metodi iteratori nel mix, queste sono bestie del tutto diverse)

Per ottenere un oggetto heap, puoi usare la boxe:

object o = i;

questo creerà una copia in scatola del contenuto idell'heap. In IL è possibile accedere direttamente ai metodi sull'oggetto heap, ma in C # è necessario eseguirne il cast su un int, che creerà un'altra copia. Pertanto, l'oggetto sull'heap non può essere facilmente modificato in C # senza creare una nuova copia in scatola di un nuovo valore int. (Ugh, questo paragrafo non legge così facilmente.)


19

Per quanto riguarda Java 1.5 e il box automatico, c'è un " bizzarro " importante che viene messo in gioco quando si confrontano oggetti Integer.

In Java, gli oggetti Integer con i valori da -128 a 127 sono immutabili (vale a dire, per un particolare valore intero, diciamo 23, tutti gli oggetti Integer sono istanziati attraverso il tuo programma con il valore 23 punti esattamente allo stesso oggetto).

Esempio, questo restituisce vero:

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

Mentre questo restituisce false:

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

== confronta per riferimento (le variabili puntano allo stesso oggetto).

Questo risultato potrebbe differire o meno in base alla JVM in uso. L'autoboxing delle specifiche per Java 1.5 richiede che gli interi (da -128 a 127) vengano sempre inseriti nello stesso oggetto wrapper.

Una soluzione? =) Uno dovrebbe sempre usare il metodo Integer.equals () quando si confrontano oggetti Integer.

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

Maggiori informazioni su java.net Esempio su bexhuff.com


3
Gli oggetti creati con il nuovo operatore restituiranno sempre falso rispetto a ==. Andreas confonde Integer.valueOf (int) con il nuovo Integer (int)
McDowell,

1
Nota: il valore predefinito 127viene recuperato dasun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
KNU

1
@andnil - Lavoro con Bex presso Stellent. È un'ottima risorsa per citare +1 per riferimento a bexhuff.com!
bcar,


19

In Java ci sono due tipi di base nella JVM . 1) Tipi primitivi e 2) Tipi di riferimento. int è un tipo primitivo e Integer è un tipo di classe (che è un tipo di tipo di riferimento).

I valori primitivi non condividono lo stato con altri valori primitivi. Una variabile il cui tipo è un tipo primitivo contiene sempre un valore primitivo di quel tipo.

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

Un oggetto è un'istanza di classe creata dinamicamente o un array. I valori di riferimento (spesso solo riferimenti) sono puntatori a questi oggetti e uno speciale riferimento null, che non fa riferimento a nessun oggetto. Potrebbero esserci molti riferimenti allo stesso oggetto.

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

Anche in Java tutto viene passato per valore. Con gli oggetti il ​​valore che viene passato è il riferimento all'oggetto. Quindi un'altra differenza tra int e Integer in Java è come vengono passati nelle chiamate di metodo. Ad esempio in

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

La variabile due viene passata come tipo intero primitivo 2. Considerando che 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);

La variabile due viene passata come riferimento a un oggetto che contiene il valore intero 2.


@WolfmanDragon: il passaggio per riferimento funzionerebbe in questo modo:

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

Quando viene chiamato l'incremento, passa un riferimento (puntatore) alla variabile a . E la funzione di incremento modifica direttamente la variabile a .

E per i tipi di oggetto funzionerebbe come segue:

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

Vedi la differenza adesso?


Secondo la tua definizione, non esiste un passaggio per riferimento. Tutto ciò che viene passato deve avere un valore (anche null è un valore), anche se è solo un valore del puntatore, altrimenti è solo un set vuoto. In base ai termini CS, il passaggio per riferimento passa il valore del riferimento (puntatore). Sono un po 'confuso.?
Wolfman Dragon,

11

In C #, int è solo un alias per System.Int32, stringa per System.String, doppia per System.Doubleecc ...

Personalmente preferisco int, string, double, ecc. Perché non richiedono una using System;dichiarazione :) Un motivo sciocco, lo so ...


2
E va aggiunto, int / Int32 di C # non sono gli stessi dell'intero di Java.
Giuda Gabriel Himango,

10

Esistono molti motivi per utilizzare le classi wrapper:

  1. Otteniamo un comportamento extra (ad esempio possiamo usare metodi)
  2. Siamo in grado di memorizzare valori null mentre nelle primitive non possiamo
  3. Le raccolte supportano la memorizzazione di oggetti e non di primitivi.

8

Questa è già una risposta per Java, ecco la risposta C #:

"Intero" non è un nome di tipo valido in C # e "int" è solo un alias per System.Int32. Inoltre, diversamente da Java (o C ++) non ci sono tipi primitivi speciali in C #, ogni istanza di un tipo in C # (incluso int) è un oggetto. Ecco un po 'di codice dimostrativo:

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;
}

2
Per essere chiari, in C #, int e System.Int32 non sono oggetti. Sono tipi di valore e trattati in modo molto diverso dal CLR rispetto agli oggetti.
Peter Meyer,

4
In realtà, in C # Int32 è un oggetto. È un oggetto struct di tipo di valore che deriva da system.object. Non è trattato in modo particolarmente diverso da altri oggetti valore come un "int" sarebbe in Java.
Wed

8

int è usato per dichiarare la variabile primitiva

e.g. int i=10;

Numero intero viene utilizzato per creare una variabile di riferimento della classe Numero intero

Integer a = new Integer();

8

In piattaforme come Java, ints sono primitivi mentre Integerè un oggetto che contiene un campo intero. La distinzione importante è che i primitivi sono sempre passati per valore e per definizione sono immutabili.

Qualsiasi operazione che coinvolge una variabile primitiva restituisce sempre un nuovo valore. D'altra parte, gli oggetti vengono passati per riferimento. Si potrebbe sostenere che anche il punto sull'oggetto (AKA il riferimento) viene passato per valore, ma i contenuti non lo sono.


@peter Mortense, In che modo (int a; Integer a;) influisce sul programma, intendo come fanno la differenza durante l'esecuzione.
Anuj Masand,

7

Un'altra cosa che non vedo nelle risposte precedenti: in Java le classi di wrapper primitive come Integer, Double, Float, Boolean ... e String sono considerate invarianti, in modo che quando si passa un'istanza di quelle classi l'invocato Il metodo non è stato in grado di alterare i tuoi dati in alcun modo, in opposizione alla maggior parte delle altre classi, i cui dati interni potrebbero essere alterati dai suoi metodi pubblici. In modo che questa classe abbia solo metodi "getter", non "setter", oltre al costruttore.

In un programma java I valori letterali di stringa sono memorizzati in una porzione separata della memoria heap, solo un'istanza per valore letterale, per risparmiare memoria riutilizzando tali istanze


7

hai mai programmato prima di allora (int) è uno dei tipi primitivi che puoi impostare per le tue variabili (proprio come char, float, ...).

ma Integer è una classe wrapper che puoi utilizzare per eseguire alcune funzioni su una variabile int (ad es. convertirla in stringa o viceversa, ...), ma tieni presente che i metodi nelle classi wrapper sono statici, quindi puoi usarli in qualsiasi momento senza creare un'istanza della classe Integer. come riassunto:

int x;
Integer y; 

xey sono entrambe variabili di tipo int ma y è racchiuso da una classe Integer e ha diversi metodi che usi, ma nel caso in cui devi chiamare alcune funzioni della classe wrapper Integer puoi farlo semplicemente.

Integer.toString(x);

ma tieni presente che sia x che y sono corretti ma se vuoi usarli solo come tipo primitivo, usa il modulo semplice (usato per definire x).


7

Giava:

int, double, long, byte, float, double, short, boolean, char- primitive. Utilizzato per contenere i tipi di dati di base supportati dalla lingua. i tipi primitivi non fanno parte della gerarchia degli oggetti e non ereditano Object. Non si può passare facendo riferimento a un metodo.

Double, Float, Long, Integer, Short, Byte, Character, E Boolean, sono di tipo Confezionatrici, confezionati in java.lang. Tutti i wrapper di tipo numerico definiscono i costruttori che consentono di costruire un oggetto da un determinato valore o una rappresentazione di stringa di quel valore. L'uso degli oggetti può aggiungere un sovraccarico anche al più semplice dei calcoli.

A partire da JDK 5, Java ha incluso due funzioni molto utili: autoboxing e autounboxing. L'autoboxing / unboxing semplifica e semplifica notevolmente il codice che deve convertire i tipi primitivi in ​​oggetti e viceversa.

Esempio di costruttori:

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

Esempio di boxe / unboxing:

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

Esempio di 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
    }
}

Il libro di PS Herbert Schildt è stato preso come riferimento.


4

Una variabile int contiene un valore intero con segno a 32 bit. Un numero intero (con la I maiuscola) contiene un riferimento a un oggetto di tipo (classe) Numero intero o su null.

Java esegue automaticamente il cast tra i due; da Integer a int ogni volta che l'oggetto Integer si presenta come argomento a un operatore int o viene assegnato a una variabile int, oppure un valore int viene assegnato a una variabile Integer. Questo casting si chiama boxe / unboxing.

Se una variabile Integer che fa riferimento a null è unbox, esplicitamente o implicitamente, viene generata una NullPointerException.


4

Int e Integer in Java e C # sono due termini diversi usati per rappresentare cose diverse. È uno dei tipi di dati primitivi che possono essere assegnati a una variabile che può archiviare esattamente. Un valore del tipo dichiarato alla volta.

Per esempio:

int number = 7;

Dove si inttrova il tipo di dati assegnato al numero variabile che contiene il valore sette. Quindi un intè solo un primitivo, non un oggetto.

Mentre an Integerè una classe wrapper per un tipo di dati primitivo che ha metodi statici. Questo può essere usato come argomento per un metodo che richiede un oggetto, dove int può essere usato come argomento per un metodo che richiede un valore intero, che può essere usato per l'espressione aritmetica.

Per esempio:

Integer number = new Integer(5);

4

In entrambe le lingue (Java e C #) intè un numero intero con segno a 4 byte.

A differenza di Java, C # Fornisce valori interi sia con segno che senza segno. Poiché Java e C # sono orientati agli oggetti, alcune operazioni in questi linguaggi non si associano direttamente alle istruzioni fornite dal tempo di esecuzione e pertanto devono essere definite come parte di un oggetto di qualche tipo.

C # fornisce System.Int32quale tipo di valore utilizza una parte della memoria che appartiene al tipo di riferimento nell'heap.

java fornisce java.lang.Integerquale tipo di riferimento funziona su int. I metodi Integernon possono essere compilati direttamente per eseguire tempo instructions.So abbiamo casella un valore int per convertirlo in un caso di numero intero ed utilizzare i metodi che auspica di esempio di un certo tipo (come toString(), parseInt(), valueOf()ecc).

In C # la variabile int si riferisce al System.Int32.Anyvalore di 4 byte in memoria che può essere interpretato come un int primitivo, che può essere manipolato dall'istanza di System.Int32. Quindi int è un alias per l' System.Int32.Whenutilizzo di metodi relativi a numeri interi come int.Parse(), int.ToString()ecc. Integer viene compilato in FCL System.Int32struct chiamando i rispettivi metodi come Int32.Parse(), Int32.ToString().


4

In Java, il inttipo è un tipo di dati primitivo, dove come Integertipo è un oggetto.

In C #, il inttipo è anche un tipo di dati uguale a System.Int32. Un integer(come qualsiasi altro tipo di valore) può essere inscatolato ("avvolto") in un oggetto.


3

In Java int è un tipo di dati primitivo mentre Integer è una classe Helper, viene utilizzato per convertire un tipo di dati in un altro.

Per esempio:

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

I tipi di dati primitivi memorizzano la memoria disponibile più veloce in cui la classe Helper è complessa e vengono archiviati nella memoria heep.

riferimento da "David Gassner" Java Essential Training.


2

"int" è un tipo di dati primitivo e "Intero" nella classe Wrapper in Java. "Intero" può essere utilizzato come argomento per un metodo che richiede un oggetto, mentre come "int" può essere utilizzato come argomento per un metodo che richiede un valore intero, che può essere utilizzato per l'espressione aritmetica.


1

01. L'intero può essere nullo. Ma int non può essere nullo.

Integer value1 = null; //OK

int value2 = null      //Error

02. Solo i valori del tipo Classi wrapper possono passare a qualsiasi classe di raccolta.

(Classi wrapper - Booleane, Personaggio, Byte, Corto, Intero, Lungo, Float, Doppio)

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

Ma normalmente aggiungiamo valori primitivi alla classe di raccolta? Il punto 02 è corretto?

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

Sì 02 è corretto, perché autoboxing.

Autoboxing è la conversione automatica effettuata dal compilatore java tra il tipo primitivo e la classe di wrapper corrispondente.

Quindi 5 converti come valore intero mediante il box automatico.


1

int è predefinito nella funzione di libreria c # ma in java possiamo creare oggetto di Integer


0

(Versione Java) In parole semplici int è primitivo e Integer è oggetto wrapper per int.

Un esempio in cui utilizzare Integer vs int, quando si desidera confrontare e la variabile int di nuovo null genererà un errore.

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

0

In java come per mia conoscenza se impari allora, quando scrivi int a; quindi in java generico compilerà un codice simile Integer a = new Integer(). Quindi, come per generici Integernon viene utilizzato ma intviene utilizzato. quindi c'è così tanta differenza lì.


Ci sono altre 18 risposte a questa domanda. Il tuo aggiunge qualcosa che gli altri hanno perso? Non aiuta che questo non sia grammaticale per cominciare.
Teepeemm,

0

int è un tipo di dati primitivo. Numero intero è una classe wrapper. Può memorizzare i dati int come oggetti.


0

int è un tipo di dati primitivo mentre Integer è un oggetto. La creazione di un oggetto con Integer ti darà accesso a tutti i metodi disponibili nella classe Integer. Ma se crei un tipo di dati primitivo con int, non sarai in grado di usare quei metodi inbuild e dovrai definirli da solo. Ma se non vuoi altri metodi e vuoi rendere il programma più efficiente in termini di memoria, puoi scegliere un tipo di dati primitivo perché la creazione di un oggetto aumenta il consumo di memoria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.