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 .
źródło
Cóż, w Javie int jest prymitywem, podczas gdy liczba całkowita jest obiektem. Oznacza to, że jeśli utworzyłeś nową liczbę całkowitą:
Możesz wywołać metodę na:
Natomiast z int:
Nie można wywoływać żadnych metod, ponieważ jest to po prostu prymityw. Więc:
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!
Javadoc obiekt liczb całkowitych
Integer Ojbect vs. int pierwotne porównanie
źródło
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 gdyInteger
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 naint
), nie można przechowywaćint
lub inne rodzaje non-object (w zbiorachList
,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:
Java 1.4 lub wcześniejsza (bez generycznych):
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!
źródło
Po prostu opublikuję tutaj, ponieważ niektóre inne posty są nieco niedokładne w stosunku do C #.
Prawidłowo:
int
to alias dlaSystem.Int32
.Źle:
float
nie jest aliasem dlaSystem.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:
definiuje zmienną
i
typuSystem.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:
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.)źródło
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:
Chociaż zwraca wartość 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.
Więcej informacji na java.net Przykład na bexhuff.com
źródło
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.
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.
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
Zmienna druga jest przekazywana jako pierwotna liczba całkowita typu 2. Podczas gdy w
Zmienna druga jest przekazywana jako odwołanie do obiektu, który zawiera wartość całkowitą 2.
@WolfmanDragon: Przekazywanie przez odniesienie działałoby tak:
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:
Czy widzisz teraz różnicę?
źródło
W języku C #, int jest tylko alias dla
System.Int32
, string dlaSystem.String
dwukrotnie doSystem.Double
etc ...Osobiście wolę int, string, double itp., Ponieważ nie wymagają
using System;
oświadczenia :) Głupi powód, wiem ...źródło
Istnieje wiele powodów, aby używać klas opakowań:
źródło
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:
źródło
int służy do deklarowania pierwotnej zmiennej
Liczba całkowita służy do tworzenia zmiennej referencyjnej klasy Integer
źródło
Na platformach takich jak Java,
int
s są prymitywami, podczas gdyInteger
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.
źródło
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
źródło
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:
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.
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).
źródło
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
, IBoolean
są typu Owijarki, pakowane wjava.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:
Przykład boksowania / rozpakowywania:
Przykład autoboxowania / autounboxingu:
Książka PS Herberta Schildta została wzięta za odniesienie.
źródło
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.
źródło
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:
Gdzie
int
jest typ danych przypisany do numeru zmiennej, która zawiera wartość siedem. Zatem anint
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:
źródło
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 naint
. Te metodyInteger
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 (jaktoString()
,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 aliasSystem.Int32.When
stosując metody całkowite związane jakint.Parse()
,int.ToString()
itd. Są zestawiane w całkowita FCLSystem.Int32
struct wywołanie odpowiednich metod, takich jakInt32.Parse()
,Int32.ToString()
.źródło
W Javie
int
typ jest pierwotnym typem danych, gdzie jakoInteger
typ jest obiektem.W języku C #
int
typ jest również typem danych takim samym jakSystem.Int32
.integer
(Podobnie jak innych typów wartości) mogą być zapakowane ( „owinięty”) do obiektu.źródło
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:
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”.
źródło
„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.
źródło
01. Liczba całkowita może być zerowa. Ale int nie może być zerowy.
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)
Ale zwykle dodajemy prymitywne wartości do klasy kolekcji? Czy punkt 02 jest poprawny?
Tak 02 jest poprawne, ponieważ
autoboxing.
Następnie 5 przekonwertuj jako wartość całkowitą przez autoboxing.
źródło
int
jest predefiniowany w funkcji biblioteki c #, ale w Javie możemy stworzyć obiektInteger
źródło
(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.
źródło
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, aleint
jest używany. więc jest taka różnica.źródło
int jest pierwotnym typem danych. Liczba całkowita jest klasą opakowania. Może przechowywać int dane jako obiekty.
źródło
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.
źródło