Hva er forskjellen mellom en int og Integer i Java og C #?

stemmer
230

Jeg leste Mer Joel on Software når jeg kom over Joel Spolsky å si noe om en bestemt type programmerer å vite forskjellen mellom en intog en Integeri Java / C # (Objektorientert Programmeringsspråk).

Så, hva er forskjellen?

Publisert på 02/08/2008 klokken 21:47
kilden bruker
På andre språk...                            


24 svar

stemmer
222

I Java, er det 'int' type en primitiv, mens den 'Integer' type er et objekt.

I C #, er 'int' type det samme som System.Int32og er en verditype (dvs. mer som java 'int'). Et heltall (på samme måte som alle andre typer verdier) kan eske ( "innpakket") inn i en gjenstand.


Forskjellene mellom objekter og primitivene er noe utenfor rammen av dette spørsmålet, men for å oppsummere:

Objekter sørge for muligheter for polymorfisme, blir gitt ved referanse (eller mer nøyaktig har referanser passerte verdi), og tildeles fra haugen . Omvendt, primitivene er uforanderlige typer som sendes av verdi og er ofte deles ut fra stabelen .

Svarte 02/08/2008 kl. 21:55
kilden bruker

stemmer
139

Vel, i Java en int er en primitiv mens en Integer er et objekt. Betydning, hvis du har gjort en ny Integer:

Integer i = new Integer(6);

Du kan kalle noen metode på i:

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

Mens med en int:

int i = 6;

Du kan ikke kalle noen metoder på det, fordi det er rett og slett en primitiv. Så:

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

vil frembringe en feil, fordi int er ikke et objekt.

int er en av de få primitiver i Java (sammen med røye og noen andre). Jeg er ikke 100% sikker, men jeg tenker at Integer objekt mer eller mindre bare har en int eiendommen og en hel haug med metoder for å samhandle med den egenskapen (som toString () metode for eksempel). Så Integer er en fancy måte å arbeide med en int (Akkurat som kanskje String er en fancy måte å arbeide med en gruppe av tegn).

Jeg vet at Java ikke er C, men siden jeg aldri har programmert i C dette er det nærmeste jeg kunne komme til svaret. Håper dette hjelper!

Integer objekt javadoc

Integer Ojbect vs. int primitive sammenligning

Svarte 02/08/2008 kl. 22:05
kilden bruker

stemmer
32

Jeg vil legge til gode svarene som er gitt ovenfor, og snakke om boksing og unboxing, og hvordan dette gjelder for Java (selv om C # har det også). Jeg skal bruke bare Java terminologi, fordi jeg er mer au fait med det.

Som svar nevnt, inter bare et tall (kalt uemballerte type), mens det Integerer et objekt (som inneholder nummeret, derav en eske type). I Java vilkår, at midler (bortsett fra å ikke kunne kalle metoder på int), kan du ikke lagre inteller andre ikke-objekttyper Samlinger ( List, Maposv). For å lagre dem, må du først boksen dem opp i det tilsvarende eske type.

Java 5 og utover har noe som kalles auto-boksing og auto-unboxing som tillater boksing / unboxing gjøres bak kulissene. Sammenlign og kontrast: Java 5 versjon:

Deque<Integer> queue;

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

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

Java 1.4 eller tidligere (ingen generics heller):

Deque queue;

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

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

Det må bemerkes at til tross for den korte i Java 5-versjonen, begge versjonene generere identisk Bytecode. Derfor, selv om auto-boksing og auto-unboxing er veldig praktisk fordi du skriver mindre kode, disse operasjonene ikke skje bak kulissene, med de samme runtime kostnader, så du har fortsatt å være klar over deres eksistens.

Håper dette hjelper!

Svarte 03/08/2008 kl. 02:32
kilden bruker

stemmer
26

Jeg skal bare poste her siden noen av de andre innleggene er litt unøyaktige i forhold til C #.

Riktig: int er et alias for System.Int32.
Feil: float er ikke et alias for System.Float, men forSystem.Single

I utgangspunktet er int et reservert nøkkelord i programmeringsspråket C #, og er et alias for System.Int32verditype.

flyte og Float er ikke den samme, men, som det høyre system type for '' float'' er System.Single. Det er noen typer som dette som har reservert søkeord som ikke synes å matche typenavn direkte.

IC # er det ingen forskjell mellom '' int'' og '' System.Int32'', eller en hvilken som helst av de andre par eller søkeord / systemtyper, med unntak av når definere enums. Med enums kan du angi lagringsstørrelse å bruke, og i dette tilfellet kan du bare bruke den reserverte søkeord, og ikke systemet runtime typenavn.

Været verdien i int vil bli lagret på stakken, i minnet, eller som en referert haug objektet er avhengig av konteksten og hvordan du bruker den.

Denne erklæringen i en metode:

int i;

definerer en variabel iav typen System.Int32, bor i et register eller på stabelen, avhengig av optimaliseringer. Den samme deklarasjon i en type (struct eller klasse) definerer et medlem felt. Den samme deklarasjon i en metode argumentliste definerer en parameter, med de samme lagringsmuligheter som for en lokal variabel. (Merk at denne paragrafen gjelder ikke hvis du begynner å trekke iteratorknapper metoder inn i miksen, disse er forskjellige dyr helt)

For å få en haug objekt, kan du bruke boksing:

object o = i;

Dette vil skape en eske kopi av innholdet ipå haugen. I IL kan du få tilgang metoder på haugen objektet direkte, men i C # må du kaste den tilbake til en int, noe som vil skape en ny kopi. Således som mål på haugen kan ikke lett endres i C # uten å opprette en ny eske kopi av en ny verdi int. (Huff, betyr dette avsnittet ikke lest alt så lett.)

Svarte 04/08/2008 kl. 14:11
kilden bruker

stemmer
18

Angående Java 1.5 og autoboxing det er en viktig "innfall" som kommer til å spille når man sammenligner Integer stedene.

I Java objekter Integer med verdiene -128 til 127 er uforanderlig (det vil si for en bestemt heltallsverdi, sier 23, alle heltall gjenstander instansiert gjennom programmet med verdien 23 poeng til eksakt samme objekt).

Eksempel, returnerer denne til stede:

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

Selv om denne returnerer false:

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

Den == sammen ved referanse (ikke variablene peker til samme objekt).

Dette resultatet kan eller ikke kan være forskjellig avhengig av hvilken JVM du bruker. Spesifikasjonen autoboxing for Java 1.5 krever at heltall (-128 til 127) alltid boksen til samme wrapper objekt.

En løsning? =) Man bør alltid bruke Integer.equals (metode) når man sammenligner heltall stedene.

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

Mer info på java.net Eksempel på bexhuff.com

Svarte 05/08/2008 kl. 20:49
kilden bruker

stemmer
17

I Java er det to grunnleggende typer i JVM . 1) primitive typer og 2) Referansetyper. int er en primitiv type og Integer er en klasse type (som er en slags referanse type).

Primitive verdier ikke dele stat med andre primitive verdier. En variabel med typen er en primitiv typen alltid har en primitiv verdi av den typen.

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

Et objekt er en dynamisk opprettet klasse forekomst eller en matrise. Referanseverdiene (ofte bare referanser) er pekere til disse objekter og en spesiell nullreferanse, som refererer til ingen objekt. Det kan være mange referanser til det samme objektet.

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

Også i Java alt er vedtatt av verdi. Med gjenstander verdien som er gått er referansen til objektet. Så en annen forskjell mellom int og Integer i java er hvordan de er vedtatt i metodekall. For eksempel i

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

Den variable to sendes som den primitive heltallstype 2. Mens det i

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

Den variable to føres som en referanse til et objekt som har heltallet verdi 2.


@WolfmanDragon: Pass ved henvisning ville fungere slik:

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

Når tilveksten kalles det passerer en referanse (pekeren) for variabel et . Og tilveksten funksjonen modifiserer direkte variabel en .

Og for objekttyper vil det fungere som følger:

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

Ser du forskjellen nå?

Svarte 06/08/2008 kl. 11:08
kilden bruker

stemmer
11

I C #, er int bare et alias for System.Int32, streng for System.Stringdobbelt for System.Doubleosv ...

Personlig foretrekker jeg int, string, dobbel, etc. fordi de ikke krever en using System;uttalelse :) En dum grunn, jeg vet ...

Svarte 02/08/2008 kl. 23:37
kilden bruker

stemmer
8

Det er mange grunner til å bruke wrapper klassene:

  1. Vi får ekstra atferd (for eksempel kan vi bruke metoder)
  2. Vi kan lagre nullverdier mens i primitiver vi kan ikke
  3. Samlinger støtter lagring av gjenstander og ikke primitiver.
Svarte 31/07/2014 kl. 10:07
kilden bruker

stemmer
8

Ved plattformer som Java, ints er primitiver mens Integeren gjenstand som har et heltall felt. Den viktige forskjellen er at primitiver alltid er ført rundt av verdi og ved definisjon er uforanderlig.

Enhver operasjon som involverer en primitiv variabel returnerer alltid en ny verdi. På den annen side, er gjenstander gått rundt ved referanse. Man kunne argumentere for at det punkt på objektet (AKA referansen) blir også ført rundt av verdi, men innholdet er ikke.

Svarte 31/01/2009 kl. 02:49
kilden bruker

stemmer
7

Java:

int, double, long, byte, float, double, short, boolean, char- primitiver. Brukes for hold de grunnleggende datatyper som støttes av språket. de primitive typene er ikke en del av objektet hierarki, og de ikke arve Object. Thet foranstaltninger passere under henvisning til en metode.

Double, Float, Long, Integer, Short, Byte, Character, Og Boolean, er typen Pakkemaskiner, pakket i java.lang. Alle de numerisk type pakke definere konstruktører som tillater en gjenstand å være konstruert fra en gitt verdi, eller en strengrepresentasjon av denne verdien. Ved hjelp av gjenstander kan legge en overhead til selv de enkleste beregninger.

Fra og med JDK 5, har Java inkludert to svært nyttige funksjoner: autoboxing og autounboxing. Autoboxing / unboxing forenkler og effektiviserer kode som må konvertere primitive typer til objekter, og vice versa.

Eksempel på konstruktører:

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

Eksempel på bokse / 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
    }
}

Eksempel på 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
    }
}

PS Herbert Schildt bok ble tatt som en referanse.

Svarte 13/06/2016 kl. 19:31
kilden bruker

stemmer
7

int brukes for å klarere primitive variabel

e.g. int i=10;

Heltall brukes til å lage referanse variabel av klasse heltall

Integer a = new Integer();
Svarte 11/12/2011 kl. 07:19
kilden bruker

stemmer
7

Dette har allerede blitt besvart for Java, her er C # svaret:

"Integer" er ikke en gyldig type navn i C # og "int" er bare et alias for System.Int32. Også i motsetning til i Java (eller C ++) er det ikke noen spesielle primitive typer i C #, hver forekomst av en type i C # (inkludert int) er et objekt. Her er noen demonstrative kode:

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;
}
Svarte 04/08/2008 kl. 21:02
kilden bruker

stemmer
6

har du noen gang programmert før da (int) er en av de primitive typer du kan angi for dine variabler (akkurat som røye, float, ...).

men Integer er en wrapper klasse som du kan bruke den til å gjøre enkelte funksjoner på en int variabel (f.eks konvertere den til streng eller vise versa, ...), men holde oppmerksom på at metoder i wrapper klassene er statisk, slik at du kan bruke dem når som helst uten å opprette en instans av Integer klasse. som en oppsummering:

int x;
Integer y; 

x og y er begge variabler av typen int, men y er pakket med en Integer klasse og har flere metoder som du bruker, men jeg tilfelle du trenger å ringe noen av funksjonene Integer wrapper klassen du kan gjøre det enkelt.

Integer.toString(x);

men vær klar over at både x og y er corect, men hvis du ønsker å bruke dem akkurat som en primitiv type, bruker du enkelt skjema (brukes for å definere x).

Svarte 17/05/2014 kl. 11:56
kilden bruker

stemmer
6

En ting som jeg ikke ser i tidligere svar: I Java primitive pakke klasser som Integer, Double, Float, boolsk ... og String er ment å være invariant, slik at når du passerer en forekomst av disse klassene det påberopes metoden kan ikke endre dine data på noen måte, i oposition med de fleste andre klasser, som interne data kan bli endret ved sine offentlige metoder. Slik at denne klasser bare har 'getter' metoder, ingen "settere, i tillegg til konstruktøren.

I et java-program Strengkonstanter lagres i en separat del av haugen hukommelse, bare et eksempel for bokstavelig, for å spare minne gjenbruk av disse forekomstene

Svarte 06/08/2008 kl. 14:33
kilden bruker

stemmer
4

I Java, det inter typen en primitiv datatype, der som Integertypen er et objekt.

I C #, det inter typen også en datatype samme som System.Int32. En integer(på samme måte som alle andre typer verdier) kan være eske ( "innpakket") inn i en gjenstand.

Svarte 27/04/2017 kl. 07:25
kilden bruker

stemmer
4

En int variabel har en 32 bits heltall-verdi. Et heltall (med kapital I) inneholder en referanse til et objekt av (klasse) type Integer, eller til null.

Java kaster automatisk mellom de to; fra Integer til int når den Integer gjenstand opptrer som et argument for en int operatør eller er tilordnet en int variabel, eller et int verdi blir tilordnet en heltallsvariabel. Dette casting kalles boksing / unboxing.

Dersom en Integer variabel henvisning null er uemballerte, eksplisitt eller implisitt, er en NullPointerException kastes.

Svarte 26/11/2015 kl. 10:54
kilden bruker

stemmer
4

En int og Integer i Java og C # er to forskjellige begreper som brukes for å representere forskjellige ting. Det er en av de primitive datatyper som kan tilordnes til en variabel som kan lagre nøyaktig. En verdi av sin erklærte type om gangen.

For eksempel:

int number = 7;

Hvor inter datatypen tildelt variabelen tall som holder verdien sju. Så en inter bare en primitiv ikke et objekt.

Mens en Integerer et omslag klasse for en primitiv datatype som har statiske metoder. Som kan brukes som et argument til en metode som krever en gjenstand, der som int kan brukes som et argument til en fremgangsmåte som krever et heltall, som kan brukes for aritmetisk uttrykk.

For eksempel:

Integer number = new Integer(5);
Svarte 07/08/2014 kl. 10:50
kilden bruker

stemmer
4

På begge språk (Java og C #) inter 4-byte heltall.

I motsetning til Java, Gir C # både signerte og usignerte heltall. Som Java og C # er objekt objekt-orientert, er det noen operasjoner i disse språkene ikke kart direkte på instruksjonene fra kjøretid og så må defineres som en del av et objekt av noen type.

C # gir System.Int32som er et verditype ved hjelp av en del av minnet som hører til referansetypen på haugen.

java gir java.lang.Integersom er et referansetype som opererer på int. Metodene i Integerkan ikke bli kompilert direkte for å kjøre tid instructions.So vi Box En int verdi for å omdanne den til en forekomst av heltall og bruke metoder som forventer forekomst av noen type (som toString(), parseInt(), valueOf()etc).

IC # variabel int refererer til System.Int32.Any4-byteverdi i minne kan tolkes som en primitiv int, som kan manipuleres ved forekomst av System.Int32.So int er et alias for System.Int32.Whenved hjelp av heltalls-relaterte metoder lignende int.Parse(), int.ToString()blir videre Heltall kompilert inn FCL System.Int32konstruere ringer de respektive metoder som Int32.Parse(), Int32.ToString().

Svarte 17/07/2014 kl. 06:02
kilden bruker

stemmer
3

I Java int er en primitiv datatype mens Integer er en hjelper klasse, det er bruk for å konvertere til en datatype til andre.

For eksempel:

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

Primitive datatyper er å lagre den raskeste tilgjengelige minnet der Helper klassen er kompleks og lagre i Heep minne.

referanse fra "David Gassner" Java Essential Training.

Svarte 28/02/2016 kl. 18:42
kilden bruker

stemmer
1

"Int" er primitiv datatype og "Integer" i wrapper klasse i Java. "Integer" kan brukes som et argument til en metode som krever en gjenstand, der som "INT" kan brukes som et argument til en fremgangsmåte som krever et heltall, som kan brukes for aritmetisk uttrykk.

Svarte 04/08/2017 kl. 09:57
kilden bruker

stemmer
1

int er forhåndsdefinert i biblioteket funksjon c # men i java kan vi opprette objekt av Integer

Svarte 06/03/2017 kl. 05:08
kilden bruker

stemmer
0

01. Integer kan være null. Men int kan ikke være null.

Integer value1 = null; //OK

int value2 = null      //Error

02. Bare kan passere wrapper klassene typen verdier til enhver samling klasse.

(Wrapper klassene - Boolsk, karakter, Byte, Kort, Integer, Long, Float, Double)

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

Men normalt vi legge primitive verdier til samling klasse? Er poenget 02 riktig?

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

Ja 02 er riktig, beacouse autoboxing.

Autoboxing er automatisk konvertering at java kompilatoren gjør mellom den primitive typen og deres tilhørende omslag klasse.

Deretter 5 konvertitt som Heltallsverdi av autoboxing.

Svarte 05/06/2018 kl. 11:35
kilden bruker

stemmer
0

(Java Version) i enkle ord int er primitive og Integer er wrapper objekt for int.

Et eksempel hvor du skal bruke Integer vs int, når du ønsker å sammenligne og int variabel igjen null vil det kaste feil.

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...}
Svarte 15/02/2018 kl. 21:04
kilden bruker

stemmer
0

I java som per min kunnskap hvis du elev da, når du skriver int a; deretter i java generisk det vil kompilere kode som Integer a = new Integer(). Så, som per generika Integerer ikke brukt, men intblir brukt. så det er så slik forskjell der.

Svarte 22/09/2016 kl. 09:53
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more