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 int
oraz Integer
w Java / C # (Programowanie obiektowe języki).
Jaka jest różnica?
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 int
oraz Integer
w Java / C # (Programowanie obiektowe języki).
Jaka jest różnica?
Odpowiedzi:
W Javie typ „int” jest prymitywny, podczas gdy typ „Integer” jest obiektem.
W języku C # typ „int” jest taki sam, jak System.Int32
i jest typem wartości (tzn. Bardziej przypomina „int” java). Liczba całkowita (podobnie jak inne typy wartości) może być umieszczana w ramkach („zawinięta”) w obiekt.
Różnice między obiektami a prymitywami są nieco poza zakresem tego pytania, ale podsumowując:
Obiekty zapewniają udogodnienia dla polimorfizmu, są przekazywane przez referencję (lub dokładniej mają referencje przekazywane przez wartość) i są przydzielane ze sterty . I odwrotnie, prymitywy to niezmienne typy, które są przekazywane przez wartość i często są przydzielane ze stosu .
Cóż, w Javie int jest prymitywem, podczas gdy liczba całkowita jest obiektem. Oznacza to, że jeśli utworzyłeś nową liczbę całkowitą:
Integer i = new Integer(6);
Możesz wywołać metodę na:
String s = i.toString();//sets s the string representation of i
Natomiast z int:
int i = 6;
Nie można wywoływać żadnych metod, ponieważ jest to po prostu prymityw. Więc:
String s = i.toString();//will not work!!!
spowoduje błąd, ponieważ int nie jest obiektem.
int jest jednym z niewielu prymitywów w Javie (wraz z char i kilkoma innymi). Nie jestem w 100% pewien, ale myślę, że obiekt Integer mniej więcej ma po prostu właściwość int i całą masę metod interakcji z tą właściwością (na przykład metoda toString ()). Tak więc Integer to fantazyjny sposób pracy z intem (podobnie jak String może być fantazyjnym sposobem pracy z grupą znaków).
Wiem, że Java nie jest C, ale ponieważ nigdy nie programowałem w C, jest to najbliższa odpowiedź. Mam nadzieję że to pomoże!
Dodam do doskonałych odpowiedzi podanych powyżej i będę mówić o boksowaniu i rozpakowywaniu oraz o tym, jak to odnosi się do Javy (chociaż C # też to ma). Użyję tylko terminologii Java, bo jestem bardziej au fait z tym.
Jak wspomniano w odpowiedziach, int
jest to tylko liczba (nazywana typem bez pudełka ), podczas gdy Integer
jest to obiekt (który zawiera liczbę, stąd typ z ramką ). Pod względem Java, co oznacza, że (z wyjątkiem nie jest w stanie wywołać metody na int
), nie można przechowywać int
lub inne rodzaje non-object (w zbiorach List
, Map
etc.). Aby je przechowywać, musisz je najpierw zapakować w odpowiadający mu rodzaj pudełka.
Java 5 i nowsze mają coś, co nazywa się auto- boxingiem i auto-unboxingiem, które pozwalają na boksowanie / rozpakowywanie się za kulisami. Porównaj i porównaj: wersja Java 5:
Deque<Integer> queue;
void add(int n) {
queue.add(n);
}
int remove() {
return queue.remove();
}
Java 1.4 lub wcześniejsza (bez generycznych):
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 generują identyczny kod bajtowy. Tak więc, chociaż auto-boxowanie i auto-rozpakowywanie są bardzo wygodne, ponieważ piszesz mniej kodu, operacje te zdarzają się za kulisami, przy tych samych kosztach czasu wykonywania, więc nadal musisz być świadomy ich istnienia.
Mam nadzieję że to pomoże!
Po prostu opublikuję tutaj, ponieważ niektóre inne posty są nieco niedokładne w stosunku do C #.
Prawidłowo: int
to alias dla System.Int32
.
Źle: float
nie jest aliasem dla System.Float
, ale dlaSystem.Single
Zasadniczo int jest zastrzeżonym słowem kluczowym w języku programowania C # i jest aliasem dla System.Int32
typu wartości.
float i Float to nie to samo, ponieważ właściwym typem systemu dla float
„” jest System.Single. Istnieje kilka takich typów, które mają zarezerwowane słowa kluczowe, które wydają się nie pasować bezpośrednio do nazw typów.
W języku C # nie ma różnicy między symbolami „ int
a” i „” System.Int32
, ani żadnymi innymi parami lub słowami kluczowymi / typami systemów, z wyjątkiem definiowania wyliczeń. Za pomocą wyliczeń można określić rozmiar pamięci do użycia, w tym przypadku można użyć tylko słowa kluczowego zarezerwowanego, a nie nazwy typu środowiska wykonawczego systemu.
Wether wartość int będzie przechowywana na stosie, w pamięci lub jako obiekt referencyjny stosu zależy od kontekstu i sposobu jego użycia.
Ta deklaracja w metodzie:
int i;
definiuje zmienną i
typu System.Int32
, żyjącą w rejestrze lub na stosie, w zależności od optymalizacji. Ta sama deklaracja w typie (struct lub klasa) definiuje pole członka. Ta sama deklaracja na liście argumentów metody definiuje parametr z tymi samymi opcjami przechowywania, co w przypadku zmiennej lokalnej. (zwróć uwagę, że ten akapit nie jest ważny, jeśli zaczniesz wciągać metody iteratora do mieszanki, są to w sumie różne bestie)
Aby uzyskać obiekt sterty, możesz użyć boksu:
object o = i;
spowoduje to utworzenie pudełkowej kopii zawartości i
stosu. W IL można uzyskać dostęp do metod bezpośrednio na obiekcie stosu, ale w języku C # należy rzutować go z powrotem na int, który utworzy kolejną kopię. Zatem obiektu na stercie nie można łatwo zmienić w języku C # bez utworzenia nowej pudełkowej kopii nowej wartości int. (Ugh, ten akapit nie jest tak łatwy do odczytania.)
Jeśli chodzi o Javę 1.5 i autoboxing, istnieje ważne „dziwactwo”, które pojawia się podczas porównywania obiektów całkowitoliczbowych.
W Javie obiekty całkowite o wartościach od -128 do 127 są niezmienne (to znaczy, dla jednej konkretnej wartości całkowitej, powiedzmy 23, wszystkie obiekty liczb całkowitych tworzone w twoim programie z wartością 23 wskazują dokładnie ten sam obiekt).
Przykład zwraca wartość true:
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2); // true
Chociaż zwraca wartość false:
Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1 == i2); // false
== porównuje przez odniesienie (czy zmienne wskazują ten sam obiekt).
Ten wynik może, ale nie musi się różnić, w zależności od używanej maszyny JVM. Specyfikacja autoboxowania dla Java 1.5 wymaga, aby liczby całkowite (od -128 do 127) zawsze zawierały pole dla tego samego obiektu opakowania.
Rozwiązanie? =) Zawsze należy używać metody Integer.equals () podczas porównywania obiektów Integer.
System.out.println(i1.equals(i2)); // true
Więcej informacji na java.net Przykład na bexhuff.com
127
jest pobierana zsun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
W Javie istnieją dwa podstawowe typy w JVM . 1) Typy pierwotne i 2) Typy referencyjne. int jest typem pierwotnym, a liczba całkowita jest typem klasy (który jest rodzajem typu referencyjnego).
Wartości pierwotne nie dzielą stanu z innymi wartościami pierwotnymi. Zmienna, której typ jest pierwotny, zawsze zawiera pierwotną wartość tego typu.
int aNumber = 4;
int anotherNum = aNumber;
aNumber += 6;
System.out.println(anotherNum); // Prints 4
Obiekt jest dynamicznie tworzoną instancją klasy lub tablicą. Wartości referencyjne (często tylko referencje) są wskaźnikami do tych obiektów i specjalnym odwołaniem zerowym, które nie 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 Javie wszystko jest przekazywane wartością. W przypadku obiektów przekazywana wartość jest odniesieniem do obiektu. Kolejną różnicą między int i Integer w Javie jest to, jak są one przekazywane w wywołaniach 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 druga jest przekazywana jako pierwotna liczba całkowita typu 2. Podczas gdy 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 druga jest przekazywana jako odwołanie do obiektu, który zawiera wartość całkowitą 2.
@WolfmanDragon: Przekazywanie przez odniesienie działałoby tak:
public void increment(int x) {
x = x + 1;
}
int a = 1;
increment(a);
// a is now 2
Po wywołaniu przyrostu przekazuje odwołanie (wskaźnik) do zmiennej a . A przyrost funkcji bezpośrednio modyfikuje zmienną A .
A dla typów obiektów działałoby to 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 widzisz teraz różnicę?
W języku C #, int jest tylko alias dla System.Int32
, string dla System.String
dwukrotnie do System.Double
etc ...
Osobiście wolę int, string, double itp., Ponieważ nie wymagają using System;
oświadczenia :) Głupi powód, wiem ...
To jest już odpowiedzią na Javę, oto odpowiedź C #:
„Liczba całkowita” nie jest prawidłową nazwą typu w języku C #, a „int” jest tylko aliasem dla System.Int32. Ponadto, inaczej niż w Javie (lub C ++), nie ma żadnych specjalnych typów pierwotnych w C #, każda instancja typu w C # (w tym int) jest obiektem. Oto przykładowy 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;
}
int służy do deklarowania pierwotnej zmiennej
e.g. int i=10;
Liczba całkowita służy do tworzenia zmiennej referencyjnej klasy Integer
Integer a = new Integer();
Na platformach takich jak Java, int
s są prymitywami, podczas gdy Integer
są obiektami zawierającymi pola liczb całkowitych. Ważnym rozróżnieniem jest to, że prymitywy są zawsze przekazywane według wartości, a z definicji są niezmienne.
Każda operacja obejmująca zmienną pierwotną zawsze zwraca nową wartość. Z drugiej strony obiekty są przekazywane przez odniesienie. Można argumentować, że punkt do obiektu (AKA referencja) również jest przekazywany przez wartość, ale treść nie jest.
Jeszcze jedna rzecz, której nie widzę w poprzednich odpowiedziach: w Javie prymitywne klasy opakowań, takie jak Integer, Double, Float, Boolean ... i String, są rzekomo niezmienne, tak więc po przekazaniu instancji tych klas wywoływane metoda nie mogła w żaden sposób zmienić twoich danych, w przeciwieństwie do większości innych klas, które wewnętrzne dane mogłyby zostać zmienione za pomocą publicznych metod. Aby te klasy miały tylko metody „pobierające”, a nie „ustawiające” oprócz konstruktora.
W programie java Literały łańcuchowe są przechowywane w osobnej części pamięci sterty, tylko w instancji literałowej, aby zaoszczędzić pamięć przy ponownym użyciu tych instancji
czy kiedykolwiek wcześniej programowałeś (int) jest jednym z podstawowych typów, które możesz ustawić dla swoich zmiennych (podobnie jak char, float, ...).
ale liczba całkowita jest klasą opakowania, której można użyć do wykonania niektórych funkcji na zmiennej int (np. przekonwertować ją na ciąg znaków lub odwrotnie, ...), ale należy pamiętać, że metody w klasach opakowań są statyczne, dzięki czemu można ich używać w dowolnym momencie bez tworzenia wystąpienia klasy Integer. podsumowując:
int x;
Integer y;
x i y są zmiennymi typu int, ale y jest zawinięte przez klasę całkowitą i ma kilka metod, których używasz, ale w przypadku, gdy potrzebujesz wywołać niektóre funkcje klasy opakowującej liczby całkowitej, możesz to zrobić po prostu.
Integer.toString(x);
ale pamiętaj, że zarówno x, jak i y są poprawne, ale jeśli chcesz ich używać tylko jako prymitywnego typu, użyj prostej formy (używanej do definiowania x).
Jawa:
int
, double
, long
, byte
, float
, double
, short
, boolean
, char
- prymitywy. Służy do przechowywania podstawowych typów danych obsługiwanych przez język. typy pierwotne nie są częścią hierarchii obiektów i nie dziedziczą obiektu. Nie można przejść przez odwołanie do metody.
Double
, Float
, Long
, Integer
, Short
, Byte
, Character
, I Boolean
są typu Owijarki, pakowane w java.lang
. Wszystkie opakowania typu liczbowego definiują konstruktory, które umożliwiają konstruowanie obiektu na podstawie podanej wartości lub ciąg znaków reprezentujący tę wartość. Korzystanie z obiektów może dodać koszty nawet do 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 musi konwertować prymitywne typy na obiekty i odwrotnie.
Przykład konstruktorów:
Integer(int num)
Integer(String str) throws NumberFormatException
Double(double num)
Double(String str) throws NumberFormatException
Przykład boksowania / rozpakowywania:
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 autoboxowania / autounboxingu:
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 Schildta została wzięta za odniesienie.
Zmienna int zawiera 32-bitową liczbę całkowitą ze znakiem. Liczba całkowita (z wielką literą I) zawiera odwołanie do obiektu typu Integer (klasy) lub do wartości null.
Java automatycznie rzuca między nimi; od Integer do int za każdym razem, gdy obiekt Integer występuje jako argument dla operatora int lub jest przypisany do zmiennej int lub wartość int jest przypisana do zmiennej Integer. Ten casting nazywa się boxing / unboxing.
Jeśli zmienna Integer odwołująca się do wartości null zostanie rozpakowana, jawnie lub niejawnie, generowany jest wyjątek NullPointerException.
Int i Integer w Javie i C # to dwa różne terminy używane do reprezentowania różnych rzeczy. Jest to jeden z podstawowych typów danych, który można przypisać do zmiennej, która może dokładnie przechowywać. Jedna wartość zadeklarowanego typu na raz.
Na przykład:
int number = 7;
Gdzie int
jest typ danych przypisany do numeru zmiennej, która zawiera wartość siedem. Zatem an int
to tylko prymityw, a nie przedmiot.
Chociaż an Integer
jest klasą opakowania dla pierwotnego typu danych, który ma metody statyczne. Może to być użyte jako argument metody wymagającej obiektu, gdzie jako int może być użyte jako argument metody wymagającej wartości całkowitej, która może być użyta do wyrażenia arytmetycznego.
Na przykład:
Integer number = new Integer(5);
W obu językach (Java i C #) int
jest 4-bajtową liczbą całkowitą ze znakiem.
W przeciwieństwie do Java, C # Zapewnia zarówno liczby całkowite ze znakiem, jak i bez znaku. Ponieważ Java i C # są obiektowo zorientowane obiektowo, niektóre operacje w tych językach nie są mapowane bezpośrednio na instrukcje dostarczone przez środowisko wykonawcze i dlatego muszą być zdefiniowane jako część obiektu określonego typu.
C # zapewnia, System.Int32
który jest typem wartości wykorzystującym część pamięci, która należy do typu odwołania na stercie.
java zapewnia java.lang.Integer
typ referencyjny działający na int
. Te metody Integer
nie mogą być opracowywane 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.Any
wartoś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.When
stosując metody całkowite związane jak int.Parse()
, int.ToString()
itd. Są zestawiane w całkowita FCL System.Int32
struct wywołanie odpowiednich metod, takich jak Int32.Parse()
, Int32.ToString()
.
W Javie int
typ jest pierwotnym typem danych, gdzie jako Integer
typ jest obiektem.
W języku C # int
typ jest również typem danych takim samym jak System.Int32
. integer
(Podobnie jak innych typów wartości) mogą być zapakowane ( „owinięty”) do obiektu.
W Javie int jest prymitywnym typem danych, podczas gdy Integer jest klasą Helper, służy do konwersji jednego typu danych na inny.
Na przykład:
double doubleValue = 156.5d;
Double doubleObject = new Double(doubleValue);
Byte myByteValue = doubleObject.byteValue ();
String myStringValue = doubleObject.toString();
Prymitywne typy danych przechowują najszybszą dostępną pamięć, w której klasa Helper jest złożona, i przechowują w pamięci heep.
referencja ze szkolenia Java Essential „David Gassner”.
„int” jest pierwotnym typem danych, a „Integer” w klasie Wrapper w Javie. „Liczba całkowita” może być użyta jako argument metody wymagającej obiektu, gdzie jako „int” może być użyta jako argument metody wymagającej wartości całkowitej, która może być użyta do wyrażenia arytmetycznego.
01. Liczba całkowita może być zerowa. Ale int nie może być zerowy.
Integer value1 = null; //OK
int value2 = null //Error
02. Tylko wartości typu klas opakowań można przekazywać do dowolnej klasy kolekcji.
(Klasy opakowań - logiczne, znakowe, bajtowe, krótkie, całkowite, długie, zmiennoprzecinkowe, podwójne)
List<Integer> element = new ArrayList<>();
int valueInt = 10;
Integer valueInteger = new Integer(value);
element.add(valueInteger);
Ale zwykle dodajemy prymitywne wartości do klasy kolekcji? Czy punkt 02 jest poprawny?
List<Integer> element = new ArrayList<>();
element.add(5);
Tak 02 jest poprawne, ponieważ autoboxing.
Autoboxing to automatyczna konwersja dokonywana przez kompilator Java między typem pierwotnym a odpowiadającą mu klasą opakowania.
Następnie 5 przekonwertuj jako wartość całkowitą przez autoboxing.
int
jest predefiniowany w funkcji biblioteki c #, ale w Javie możemy stworzyć obiekt Integer
(Wersja Java) W prostych słowach int jest prymitywne, a Integer jest opakowaniem dla int.
Jeden przykład zastosowania Integer vs. int, gdy chcesz porównać i int zmienna ponownie null, wyrzuci 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...}
W java, zgodnie z moją wiedzą, jeśli uczysz się wtedy, kiedy piszesz int a; następnie w java generic skompiluje kod podobny do Integer a = new Integer()
. Tak więc, jak ogólnie, Integer
nie jest używany, ale int
jest używany. więc jest taka różnica.
int jest pierwotnym typem danych. Liczba całkowita jest klasą opakowania. Może przechowywać int dane jako obiekty.
int jest pierwotnym typem danych, podczas gdy liczba całkowita jest obiektem. Utworzenie obiektu za pomocą Integer daje dostęp do wszystkich metod dostępnych w klasie Integer. Ale jeśli utworzysz prymitywny typ danych za pomocą int, nie będziesz w stanie używać tych metod wbudowania i musisz je zdefiniować samodzielnie. Ale jeśli nie chcesz żadnych innych metod i chcesz zwiększyć wydajność pamięci programu, możesz użyć pierwotnego typu danych, ponieważ utworzenie obiektu zwiększy zużycie pamięci.