Jaka jest różnica między int i Integer w Java i C #?

głosy
222

Czytałam Więcej Joel on Software kiedy natknąłem Joel Spolsky mówiąc coś o szczególnym typu programator znając różnicę pomiędzy intoraz Integerw Java / C # (Object Oriented Programming Languages).

Więc jaka jest różnica?

Utwórz 02/08/2008 o 22:47
źródło użytkownik
W innych językach...                            


24 odpowiedzi

głosy
216

W Javie do „int” typ jest prymitywne, natomiast typ do „Integer” jest obiektem.

W języku C #, do „int” typ jest taki sam jak System.Int32i typ wartości (czyli bardziej jak Java „int”). Liczba całkowita (tak jak inne rodzaje wartości) mogą być zapakowane ( „zawinięte”) do obiektu.


Różnice między obiektami i prymitywów są nieco poza zakres tego pytania, ale na podsumowanie:

Przedmioty stwarzać udogodnienia dla polimorfizmu, są przekazywane przez referencję (lub dokładniej mają referencje przekazywane przez wartość), i są przydzielane od sterty . Odwrotnie, prymitywy są niezmienne typy, które są przekazywane przez wartość i są często przyznawane od stosu .

Odpowiedział 02/08/2008 o 22:55
źródło użytkownik

głosy
135

Cóż, w Javie int jest prymitywne natomiast Integer jest obiektem. Czyli, jeśli się nowa Integer:

Integer i = new Integer(6);

Można wywołać jakąś metodę na I:

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

Natomiast przy wew:

int i = 6;

Nie można wywołać żadnych metod na to, bo to jest po prostu prymitywne. Więc:

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

będzie produkować błąd, ponieważ int nie jest obiektem.

int jest jednym z niewielu prymitywów w Java (wraz z char i kilka innych). Nie jestem w 100% pewien, ale myślę, że obiekt Integer mniej więcej po prostu ma właściwość int i całą masę sposobów interakcji z tej nieruchomości (jak metody toString (), na przykład). Więc Integer jest fantazyjny sposób pracować z int (podobnie jak może String jest fantazyjny sposób pracować z grupą znaków).

Wiem, że Java nie jest C, ale ponieważ nigdy nie programować w C jest to najbliżej mogę przyjść do odpowiedzi. Mam nadzieję że to pomoże!

Integer obiekt javadoc

Integer Ojbect vs int prymitywne porównania

Odpowiedział 02/08/2008 o 23:05
źródło użytkownik

głosy
32

Dodam do doskonałych odpowiedzi podanych powyżej, i porozmawiać o boksie i unboxing i jak odnosi się to do Javy (chociaż C # ma go zbyt). Użyję tylko terminologii Java, ponieważ jestem bardziej au fait z tym.

Ponieważ odpowiedzi wspomniano, intjest tylko numer (zwany unboxed typu), natomiast Integerjest przedmiot (który zawiera numer, stąd box rodzaju). Pod względem Java, że środki (oprócz nie jest w stanie wywołać metody na int), nie można przechowywać intlub inne rodzaje non-object (w zbiorach List, Mapetc.). W celu ich przechowywania, należy najpierw pudełko je w odpowiedniej wersji pudełkowej typu.

Java 5 roku mają coś o nazwie auto-boxing i auto-unboxing , które pozwalają boks / unboxing być zrobione za kulisami. Porównaj i kontrast: Java 5 wersji:

Deque<Integer> queue;

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

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

Java 1.4 lub wcześniej (bez rodzajowych albo):

Deque queue;

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

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

Należy zauważyć, że pomimo zwięzłości w wersji Java 5, obie wersje wygenerowania identycznego kodu bajtowego. Tak więc, chociaż auto-auto-boxing i unboxing jest bardzo wygodne, ponieważ pisać mniej kodu, operacje te nie stało za kulisami, z tych samych kosztów w czasie wykonywania, więc nadal trzeba zdawać sobie sprawę z ich istnienia.

Mam nadzieję że to pomoże!

Odpowiedział 03/08/2008 o 03:32
źródło użytkownik

głosy
26

Ja po prostu pisać tu od niektórych innych stanowiskach są nieco niedokładna w stosunku do C #.

Poprawnie: int jest aliasem System.Int32.
Źle: float nie jest aliasem System.Float, ale dlaSystem.Single

Zasadniczo, int jest zarezerwowanym słów kluczowych w języku programowania C # i jest aliasem dla System.Int32typu wartości.

pływaka i pływak nie jest taka sama, jednak jako odpowiedni rodzaj systemu „” float„” jest System.Single. Istnieje kilka rodzajów takich jak ten, który zastrzeżone słowa kluczowe, które nie wydają się bezpośrednio odpowiadają nazwom typu.

W języku C # nie ma różnicy między „” int„” i „” System.Int32„”, lub którykolwiek z pozostałych parach lub słów kluczowych / typów systemów, z wyjątkiem przy definiowaniu teksty stałe. Z teksty stałe można określić rozmiar pamięci do wykorzystania w tym przypadku można użyć tylko zarezerwowane słowo kluczowe, a nie nazwa typu pracy systemu.

Pogoda wartości w int będą przechowywane na stosie, w pamięci, lub jako odwołanie obiektu sterty zależy od kontekstu i jak go używać.

Ta deklaracja w metodzie:

int i;

definiuje zmienną itypu System.Int32, mieszka w rejestrze lub na stosie, w zależności od optymalizacji. Ta sama deklaracja typu (struct lub klasa) definiuje pole członka. To samo oświadczenie w liście argumentów metoda definiuje parametr, z tych samych opcji składowania jak dla zmiennej lokalnej. (zauważ, że ustęp ten nie jest ważny, jeśli zaczniesz ciągnąc metody iteracyjnej w mix, są różne zwierzęta w ogóle)

Aby uzyskać obiekt sterty, można użyć boks:

object o = i;

to stworzy pudełkową kopię zawartości ina stercie. IL można uzyskać dostęp do metod na obiekcie sterty bezpośrednio, ale w C # trzeba oddać go z powrotem do int, która stworzy kolejną kopię. Tak więc, obiekt na stercie nie może być łatwo zmieniona w C # bez tworzenia nowego pudełkową kopię nowej wartości int. (Fuj, ustęp ten nie czyta wszystko, co łatwo).

Odpowiedział 04/08/2008 o 15:11
źródło użytkownik

głosy
18

Odnośnie Java 1.5 i autoboxing jest ważnym „dziwactwo”, który przychodzi do gry przy porównywaniu obiektów całkowitą.

W Javie, Integer obiektów z wartościami -128 do 127 są niezmienne (czyli dla jednej konkretnej wartości całkowitej, powiedzmy 23, wszystkie obiekty Integer instancji za pośrednictwem programu o wartości 23 punktów na dokładnym samego obiektu).

Przykład ten powraca prawdą

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

Choć zwraca fałsz:

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

== porównuje przez odniesienie (czy zmiennoprzecinkowych do tego samego obiektu).

Wynik ten może lub nie może się różnić w zależności od tego, co JVM używasz. Specyfikacja autoboxing Java 1.5 wymaga całkowitymi (-128 do 127) zawsze pole do tego samego obiektu opakowania.

Rozwiązanie? =) Zawsze należy użyć Integer.equals () w przy porównaniu przedmiotów całkowitą.

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

Więcej informacji na java.net przykładu w bexhuff.com

Odpowiedział 05/08/2008 o 21:49
źródło użytkownik

głosy
17

W Javie istnieją dwa podstawowe typy w JVM . 1) w typie pierwotnym oraz 2) Rodzaje odniesienia. Int prymitywny rodzaj i liczba całkowita jest typu klasy (co jest raczej typu odniesienia).

Wartości prymitywne nie podzielają stan z innymi wartościami prymitywnych. Zmienna, której typ jest prymitywny typ zawsze posiada pierwotną wartość tego typu.

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

Celem jest tworzone dynamicznie przykład klasa lub tablicą. Wartości referencyjne (często po prostu referencje) są wskaźnikami do tych obiektów i specjalnym odniesieniem zerowej, która odnosi się do żadnego obiektu. Może istnieć wiele odniesień do tego samego obiektu.

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

Również w Java wszystko jest przekazywane przez wartość. Z obiektami wartość, która jest przekazywana jest referencja do obiektu. Więc kolejna różnica między int i Integer w Java jest jak są one przekazywane w wywołań metod. Na przykład w

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

Zmienna dwa jest przekazywana jako prymitywnego całkowitej typu 2. Natomiast w

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

Zmienna dwa przepuszcza się jako punkt odniesienia do obiektu, który posiada wartość całkowitą 2.


@WolfmanDragon: pass przez odniesienie będzie działać tak:

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

Gdy wzrost jest nazywany przechodzi odniesienia (wskaźnik) zmiennej A . A przyrost funkcji bezpośrednio modyfikuje zmienną A .

I dla typów obiektów to działa w następujący sposób:

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

Czy teraz widzisz różnicę?

Odpowiedział 06/08/2008 o 12:08
źródło użytkownik

głosy
11

W języku C #, int jest tylko alias dla System.Int32, string dla System.Stringdwukrotnie do System.Doubleetc ...

Osobiście wolę int, string, double, itp, ponieważ nie wymagają using System;oświadczenie :) głupi powód, wiem ...

Odpowiedział 03/08/2008 o 00:37
źródło użytkownik

głosy
8

Istnieje wiele powodów, aby korzystać z klas Wrapper:

  1. Dostajemy dodatkowy zachowanie (na przykład możemy użyć metody)
  2. Możemy przechowywać wartości null podczas gdy w prymitywów nie możemy
  3. Kolekcje obsługują przechowywanie przedmiotów i nie prymitywów.
Odpowiedział 31/07/2014 o 11:07
źródło użytkownik

głosy
8

W platformach takich jak Java, ints są prymitywy natomiast Integerjest obiektem, który posiada pole całkowitą. Istotna różnica jest taka, że prymitywy są zawsze przekazywane przez wartość i wokół definicji są niezmienne.

Każde działanie, obejmujące zmienną prymitywny zawsze zwraca nową wartość. Z drugiej strony, obiekty są przekazywane wokół przez odniesienie. Można argumentować, że punkt do obiektu (AKA odniesienia) jest także przekazywana dookoła przez wartość, ale zawartość nie jest.

Odpowiedział 31/01/2009 o 03:49
źródło użytkownik

głosy
7

Jawa:

int, double, long, byte, float, double, short, boolean, char- prymitywy. Używany do ładowni podstawowe typy danych obsługiwane przez język. prymitywne typy nie są częścią hierarchii obiektów, a oni nie dziedziczą Object. Thet can'be przechodzą w odniesieniu do sposobu.

Double, Float, Long, Integer, Short, Byte, Character, A Boolean, są nakładkami typu, pakowane w java.lang. Wszystkie liczbowe określają typ opakowania, które umożliwiają konstruktorom Celem wynalazku jest wykonana z danej wartości, lub ciąg znaków tej wartości. Korzystanie z obiektów można dodać napowietrznych do nawet najprostszych obliczeń.

Począwszy od JDK 5, Java zawiera dwie bardzo przydatne funkcje: autoboxing i autounboxing. Autoboxing / unboxing znacznie upraszcza i usprawnia kod, który należy przekształcić prymitywne typy na obiektach, i vice versa.

Przykład konstruktorów:

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

Przykład boksu / rozpakowywanie:

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

Przykład 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
    }
}

Książka PS Herberta Schildt został wzięty jako odniesienie.

Odpowiedział 13/06/2016 o 19:31
źródło użytkownik

głosy
7

int służy do deklarowania zmiennej prymitywny

e.g. int i=10;

Integer służy do tworzenia zmiennej referencyjnej klasy Integer

Integer a = new Integer();
Odpowiedział 11/12/2011 o 08:19
źródło użytkownik

głosy
7

Zostało to już odpowiedział na Java, oto odpowiedź C #:

„Integer” nie jest poprawną nazwą typu w C # i „int” jest tylko aliasem System.Int32. Ponadto, inaczej niż w Java (lub C ++) nie są jakieś specjalne typy prymitywne w C #, każda instancja typu w C # (w tym int) jest obiektem. Oto niektóre poglądowe kod:

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;
}
Odpowiedział 04/08/2008 o 22:02
źródło użytkownik

głosy
6

czy kiedykolwiek zaprogramowane wcześniej (int) jest jednym z typów pierwotnych, które można wybierać dla swoich zmiennych (tak jak char, float, ...).

ale Integer jest klasy otoki, że można go użyć do zrobienia pewnych funkcji na zmienną int (np przekonwertować go do strun lub odwrotnie, ...), ale należy zauważyć, że metody w klasach bibułki są statyczne, dzięki czemu można z nich korzystać w dowolnym czasie bez tworzenia instancji klasy Integer. jako Przypomnę:

int x;
Integer y; 

x i y są obie zmienne typu int, ale y jest owinięty przez klasy Integer i ma kilka metod, które są używane, ale przypadku trzeba zadzwonić niektóre funkcje Integer klasy otoki można to zrobić w prosty sposób.

Integer.toString(x);

Należy jednak pamiętać, że zarówno X i Y są corect ale jeśli chcesz ich używać tylko jako prymitywnego typu, użyj prostego formularza (służącego do definiowania X).

Odpowiedział 17/05/2014 o 12:56
źródło użytkownik

głosy
6

Jeszcze jedna rzecz, że nie widzę w poprzednich odpowiedzi: W Javie prymitywne owijarki zajęcia takie jak Integer, podwójne, pływak, Boolean ... i String są suposed być niezmienna, tak że kiedy przechodzą instancję tych klasach wywoływany metoda nie może zmienić swoje dane w jakikolwiek sposób, w opozycja z większością innych klasach, których dane wewnętrzne mogą być zmienione przez jego metod publicznych. Tak, że ten ma tylko metody klasy „getter”, nie „ustawiaczy” oprócz konstruktora.

W programie Java łańcucha znaków są przechowywane w oddzielnej części pamięci sterty tylko przykład dla dosłownym, w celu zaoszczędzenia pamięci ponowne te przypadki

Odpowiedział 06/08/2008 o 15:33
źródło użytkownik

głosy
4

W Java, inttyp to prymitywny typ danych, gdzie jako Integertyp jest obiektem.

W języku C #, inttyp jest również typ danych same jak System.Int32. integer(Podobnie jak innych typów wartości) mogą być zapakowane ( „owinięty”) do obiektu.

Odpowiedział 27/04/2017 o 07:25
źródło użytkownik

głosy
4

Int i Integer w Java i C # to dwa różne pojęcia używane do reprezentowania różnych rzeczy. Jest to jedno z prymitywnych typów danych, które mogą być przypisane do zmiennej, która może przechowywać dokładnie. Jednym z jego wartość zadeklarowanego typu na raz.

Na przykład:

int number = 7;

Gdzie intjest typ danych przypisany do numeru zmiennej, która posiada wartość siedem. więcint tylko prymitywny nie przedmiotem.

Podczas gdy Integerjest klasa wrapper dla prymitywnego typu danych, które ma metody statyczne. Które mogą być stosowane jako argument do sposobu, który wymaga do obiektu, w której, jak można Int być stosowane jako argument do sposobu, który wymaga liczbę całkowitą, która może być użyta do wyrażenia arytmetycznego.

Na przykład:

Integer number = new Integer(5);
Odpowiedział 07/08/2014 o 11:50
źródło użytkownik

głosy
4

W obu języków (Java i C #) intjest 4-bajtowy podpisane całkowitą.

W przeciwieństwie do Javy, C # Zapewnia zarówno podpisane i niepodpisane wartości całkowite. Jak Java i C # są przedmiotem obiektowe, niektóre operacje w tych językach nie map bezpośrednio na dyspozycją czasie wykonywania i tak musi być zdefiniowany jako część obiektu pewnego rodzaju.

C # udostępnia System.Int32która jest rodzajem wartość używając część pamięci, która należy do typu odniesienia na stercie.

Java dostarcza java.lang.Integerktóra jest rodzajem odniesienia działająca na int. Te metody Integernie mogą być skompilowane bezpośrednio do uruchomienia czas instructions.So my box wartość int aby przekształcić go w instancji Integer i korzystać z metod, która oczekuje wystąpienie jakiegoś typu (jak toString(), parseInt(), valueOf()itp.)

C # zmienna Int odnosi się do System.Int32.Anywartości 4 bajtów w pamięci, może być interpretowane, jako pierwotnego int, które mogą być ustawiane przez wystąpienie System.Int32.So Int jest alias System.Int32.Whenstosując metody podobne całkowite podobne int.Parse(), int.ToString()itd. Są zestawiane w całkowita FCL System.Int32struct wywołanie odpowiednich metod, takich jak Int32.Parse(), Int32.ToString().

Odpowiedział 17/07/2014 o 07:02
źródło użytkownik

głosy
3

W int Java jest prymitywny typ danych Integer jest natomiast klasa Pomocnik, jest używany do konwersji jednego typu danych do innych.

Na przykład:

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

Prymitywne typy danych są przechowywane najszybszą dostępną pamięć gdzie klasa Pomocnik jest złożona i przechowywać w pamięci Heep.

odniesienie do „David Gassner” Java niezbędne szkolenia.

Odpowiedział 28/02/2016 o 18:42
źródło użytkownik

głosy
3

Zmienna int posiada 32 bitową wartość całkowitą. Integer (z kapitałem I) posiada odniesienie do obiektu (klasy) Typ Integer lub null.

Java automatycznie rzuca między nimi; z całkowitą, int gdy obiekt całkowita występuje jako argumentu do operatora lub int jest przypisany zmiennej int lub wartość int jest przypisany zmiennej całkowitą. Ten odlew nazywa boks / unboxing.

Jeśli zmienna odsyłania wartość null Integer jest rozpakowanych, bezpośrednio lub pośrednio, NullPointerException zostanie zgłoszony.

Odpowiedział 26/11/2015 o 10:54
źródło użytkownik

głosy
1

„Int” typ danych jest prymitywny i „Integer” w otoki klasy w Javie. „Całkowita” może być stosowane jako argument do sposobu, który wymaga do obiektu, w którym jako „int”, może być stosowane jako argument do sposobu, który wymaga liczbę całkowitą, która może być użyta do wyrażenia arytmetycznego.

Odpowiedział 04/08/2017 o 09:57
źródło użytkownik

głosy
1

int jest predefiniowane w bibliotece funkcji C #, ale w Javie możemy stworzyć oject Integer

Odpowiedział 06/03/2017 o 05:08
źródło użytkownik

głosy
0

01. Integer może być null. Ale int nie może być null.

Integer value1 = null; //OK

int value2 = null      //Error

02. Jedynie można przekazywać wartości Klasy typu owijki dowolnej klasy zbiorczej.

(Ćwiczenia Wrapper - Boolean, Character, Byte, Short, Integer, Long, pływak, dwukrotnie)

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

Ale normalnie dodamy wartości prymitywnych do klasy kolekcję? Punkt 02 jest poprawna?

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

Tak 02 jest prawidłowa, beacouse autoboxing.

Autoboxing jest automatyczna konwersja że kompilator Java sprawia pomiędzy pierwotnym typu i ich odpowiedniej klasy owijki.

Następnie 5 nawrócony jako wartość całkowitą poprzez autoboxing.

Odpowiedział 05/06/2018 o 11:35
źródło użytkownik

głosy
0

(Java Version) w prostych słowach int jest prymitywny i Integer jest obiekt wrapper dla int.

Jednym z przykładów, gdzie użyć Integer vs int, Gdy chcesz porównać i int zmienna wartość null znowu będzie rzucać błąd.

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...}
Odpowiedział 15/02/2018 o 21:04
źródło użytkownik

głosy
0

W Javie według mojej wiedzy, jeśli uczących się wtedy, kiedy piszesz int a; Następnie w Java rodzajowego to kompilacji kodu jak całkowita a = new całkowitej. Tak więc, zgodnie z całkowitą generycznych nie jest używany, ale int jest używany. więc nie jest więc taka różnica istnieje.

Odpowiedział 22/09/2016 o 09:53
źródło użytkownik

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