В чем разница между int и Integer в Java и C #?

Я читал Больше Джоэла о программном обеспечении, когда натолкнулся на то, что Джоэл Спольски говорил что-то о программистах определенного типа, знающих разницу между intи Integerв Java / C # (объектно-ориентированных языках программирования).

Так в чем же разница?

2.08.2008 21:47:34
C # не имеет целочисленного типа.
Judah Gabriel Himango 5.03.2010 02:58:39
26 ОТВЕТОВ
РЕШЕНИЕ

В Java тип int является примитивом, а тип Integer - объектом.

В C # тип int такой же, как System.Int32и является типом значения (то есть больше похож на java int). Целое число (так же, как и любые другие типы значений) может быть упаковано («обернуто») в объект.


Различия между объектами и примитивами несколько выходят за рамки этого вопроса, но подведем итог:

Объекты предоставляют средства для полиморфизма, передаются по ссылке (или, точнее, имеют ссылки, переданные по значению) и выделяются из кучи . И наоборот, примитивы являются неизменяемыми типами, которые передаются по значению и часто выделяются из стека .

245
18.03.2020 11:25:23
Утверждение, что «объекты [...] передаются по ссылке», вводит в заблуждение и неверно, ИМО. Точнее сказать, что «ссылки на объекты передаются по значению». (Также примитивы не всегда выделяются из стека - рассмотрим примитивное поле внутри объекта ...)
Jon Skeet 27.10.2008 11:18:02
В C #, по крайней мере, int является ключевым словом языка, эквивалентным типу Int32 CLR (фактически CTS).
Scott Dorman 31.01.2009 03:36:09
Извините, английский язык не заставляет «передавать что-то по ссылке» и «передавать ссылку на что-то по значению» эквивалентные операторы, и при этом они не имеют эквивалентного значения в контексте языка программирования.
Alan Krueger 7.07.2010 15:59:14
-1. Это может точно описать, как Java это обрабатывает, но для C # это совершенно неправильно.
Joey 12.01.2011 11:40:26
Почему за это проголосовали? Ответ неверный. Это не совсем верно для Java, и даже близко не подходит для C #. Тот , кто читает это будет знать меньше о теме , чем они это делали раньше.
Thom Smith 17.09.2012 14:03:42

Ну, в Java int - это примитив, а Integer - это объект. Это означает, что если вы создали новое целое число:

Integer i = new Integer(6);

Вы можете вызвать какой-нибудь метод для i:

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

Тогда как с int:

int i = 6;

Вы не можете вызывать какие-либо методы, потому что это просто примитив. Так:

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

выдаст ошибку, потому что int не является объектом.

int является одним из немногих примитивов в Java (наряду с char и некоторыми другими). Я не уверен на 100%, но я думаю, что объект Integer более или менее просто имеет свойство int и целый набор методов для взаимодействия с этим свойством (например, метод toString ()). Так что Integer - это модный способ работы с int (точно так же, как, возможно, String - это модный способ работы с группой символов).

Я знаю, что Java - это не C, но, поскольку я никогда не программировал на C, это самый близкий ответ. Надеюсь это поможет!

Целочисленный объект javadoc

Целочисленное сравнение Ojbect и int примитивное

152
26.11.2013 00:10:45
в C # int является синонимом Int32, см. stackoverflow.com/questions/62503/c-int-or-int32-should-i-care
ripper234 19.09.2008 11:13:57
Я не знаю Java, но нет типа Integer, но Int32, Int64, и все они являются структурой, которая является типом значения. Примитив означает в C #, что типы определяются в FCL (Framework Class Library) командой CLR, и поэтому они называются примитивными. В этом случае даже Date obj называется примитивным типом.
Tarik 24.04.2012 18:05:19

Я добавлю к превосходным ответам, приведенным выше, и расскажу о боксе и распаковке, и о том, как это применимо к Java (хотя в C # она тоже есть) Я буду использовать только терминологию Java, потому что я более в этом разбираюсь .

Как уже упоминалось в ответах, intэто просто число (называемое unboxed типом), тогда Integerкак это объект (который содержит число, следовательно, упакованный тип). В Java, это значит , ( за исключением не в состоянии вызывать методы int), вы не можете сохранить intили другие типы не-объект в коллекции ( List, Mapи т.д.). Чтобы сохранить их, вы должны сначала упаковать их в соответствующий тип в штучной упаковке.

В Java 5 и более поздних версиях есть что-то, называемое auto-boxing и auto-unboxing, что позволяет делать бокс / распаковку за кулисами. Сравните и сопоставьте: версия Java 5:

Deque<Integer> queue;

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

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

Java 1.4 или более ранняя версия (также нет обобщений):

Deque queue;

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

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

Следует отметить, что, несмотря на краткость версии Java 5, обе версии генерируют идентичный байт-код. Таким образом, хотя автоматическая упаковка и автоматическая распаковка очень удобны, потому что вы пишете меньше кода, эти операции выполняются за кулисами при тех же затратах времени выполнения, поэтому вы все равно должны знать об их существовании.

Надеюсь это поможет!

37
18.03.2020 11:26:48
Deque отсутствует в Java 1.5 или 1.4. Был добавлен в 1.6.
Leo Izen 19.09.2010 02:54:34

Я просто напишу здесь, так как некоторые другие посты немного неточны по отношению к C #.

Правильно: int это псевдоним для System.Int32.
Неправильно: float это не псевдоним для System.Float, но дляSystem.Single

По сути, int - это зарезервированное ключевое слово в языке программирования C # и псевдоним для System.Int32типа значения.

Однако float и Float - это не одно и то же, поскольку правильным типом системы для '' float'' является System.Single. Есть некоторые типы, подобные этим, которые имеют зарезервированные ключевые слова, которые не соответствуют именам типов напрямую.

В C # нет никакой разницы между '' int'' и '' System.Int32'' или любыми другими парами или ключевыми словами / системными типами, за исключением определения перечислений. С помощью перечислений вы можете указать размер хранилища для использования, и в этом случае вы можете использовать только зарезервированное ключевое слово, а не имя типа среды выполнения системы.

Будет ли значение в int храниться в стеке, в памяти или как объект кучи, на который ссылаются, зависит от контекста и того, как вы его используете.

Это объявление в методе:

int i;

определяет переменную iтипа System.Int32, живущую в регистре или в стеке, в зависимости от оптимизации. То же объявление в типе (структура или класс) определяет поле члена. То же объявление в списке аргументов метода определяет параметр с теми же параметрами хранения, что и для локальной переменной. (обратите внимание, что этот абзац недействителен, если вы начнете использовать методы итератора в миксе, это совершенно разные звери)

Чтобы получить объект кучи, вы можете использовать бокс:

object o = i;

это создаст коробочную копию содержимого iв куче. В IL вы можете получить доступ к методам объекта кучи напрямую, но в C # вам нужно привести его обратно к int, который создаст другую копию. Таким образом, объект в куче не может быть легко изменен в C # без создания новой коробочной копии нового значения int. (Тьфу, этот абзац не так легко читается.)

28
30.11.2015 15:31:10

Относительно Java 1.5 и автобоксов существует важная «причуда», которая проявляется при сравнении объектов Integer.

В Java, Integer объекты со значениями -128 до 127 неизменны (то есть, для одного конкретного целого значения, скажем , 23, все объекты Integer экземпляр через программу со значением 23 указывает на точное же объекта).

Пример, это возвращает true:

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

Пока это возвращает ложь:

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

== сравнивает по ссылке (переменные указывают на один и тот же объект).

Этот результат может отличаться или не различаться в зависимости от того, какую JVM вы используете. Спецификация autoboxing для Java 1.5 требует, чтобы целые числа (от -128 до 127) всегда помещались в один и тот же объект-оболочку.

Решение? =) При сравнении объектов Integer всегда следует использовать метод Integer.equals ().

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

Больше информации на java.net Пример на bexhuff.com

19
5.08.2008 20:54:33
Объекты, созданные с помощью оператора new, всегда будут возвращать false при сравнении с ==. Андреас путает Integer.valueOf (int) с новым Integer (int)
McDowell 15.09.2008 18:22:59
Примечание: значение по умолчанию 127выбирается изsun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
KNU 2.10.2014 16:04:57
@andnil - я работаю с Бексом в Stellent. Он очень хороший ресурс, чтобы цитировать +1 для ссылки на bexhuff.com!
bcar 18.01.2016 16:44:52
Ciro Santilli 冠状病毒审查六四事件法轮功 17.02.2016 12:16:01

В Java есть два основных типа в JVM . 1) Примитивные типы и 2) Типы ссылок. int является примитивным типом, а Integer является типом класса (который является своего рода ссылочным типом).

Примитивные значения не разделяют состояние с другими примитивными значениями. Переменная, тип которой является примитивным типом, всегда содержит примитивное значение этого типа.

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

Объект - это динамически создаваемый экземпляр класса или массив. Ссылочные значения (часто просто ссылки) являются указателями на эти объекты и специальной нулевой ссылкой, которая не ссылается ни на один объект. Там может быть много ссылок на один и тот же объект.

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

Также в Java все передается по значению. Для объектов передаваемое значение является ссылкой на объект. Итак, еще одно различие между int и Integer в Java заключается в том, как они передаются в вызовах методов. Например, в

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

Переменная два передается как примитивный целочисленный тип 2. Тогда как в

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

Переменная два передается как ссылка на объект, который содержит целочисленное значение 2.


@WolfmanDragon: передача по ссылке будет работать так:

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

Когда вызывается приращение, он передает ссылку (указатель) на переменную a . И функция приращения напрямую изменяет переменную a .

А для типов объектов это будет работать следующим образом:

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

Вы видите разницу сейчас?

19
5.02.2009 06:58:19
По вашему определению, нет передачи по ссылке. Все, что передается, должно иметь значение (даже ноль - это значение), даже если это просто значение указателя, в противном случае это просто пустой набор. Согласно терминам CS, передача по ссылке передает значение ссылки (указатель). Я немного запутался.?
WolfmanDragon 31.01.2009 03:12:18

В C # int это просто псевдоним for System.Int32, string for System.String, double for и System.Doubleт.д ...

Лично я предпочитаю int, string, double и т. Д., Потому что они не требуют using System;утверждения :) Глупая причина, я знаю ...

11
5.06.2014 10:12:06
И следует добавить, что int / Int32 в C # не совпадают с Integer в Java.
Judah Gabriel Himango 5.03.2010 03:02:50

Есть много причин использовать классы-оболочки:

  1. Мы получаем дополнительное поведение (например, мы можем использовать методы)
  2. Мы можем хранить нулевые значения, тогда как в примитивах мы не можем
  3. Коллекции поддерживают хранение объектов, а не примитивов.
10
31.07.2014 10:38:33

Это уже было дано для Java, вот ответ C #:

«Integer» не является допустимым именем типа в C #, а «int» является просто псевдонимом для System.Int32. Кроме того, в отличие от Java (или C ++) в C # нет специальных примитивных типов, каждый экземпляр типа в C # (включая int) является объектом. Вот пример демонстрационного кода:

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;
}
8
4.08.2008 21:02:54
Для ясности, в C # int и System.Int32 не являются объектами. Они являются типами значений и обрабатываются в CLR значительно иначе, чем объекты.
Peter Meyer 30.09.2008 20:00:47
Собственно, в C # Int32 это объект. Это структурный объект valuetype, производный от system.object. Он не обрабатывается особо иначе, чем другие объекты-значения, как это было бы в Java.
Wedge 30.09.2008 20:46:47

int используется для объявления примитивной переменной

e.g. int i=10;

Integer используется для создания ссылочной переменной класса Integer

Integer a = new Integer();
8
11.12.2011 07:19:32

В таких платформах, как Java, ints - это примитивы, а Integerобъект - это целочисленное поле. Важным отличием является то, что примитивы всегда передаются по значению и по определению являются неизменными.

Любая операция с примитивной переменной всегда возвращает новое значение. С другой стороны, объекты передаются по ссылке. Можно утверждать, что точка на объект (AKA ссылка) также передается по значению, а содержимое - нет.

8
10.06.2013 18:55:53
@peter Mortense, Как (int a; Integer a;) влияет на программу, я имею в виду, как они имеют значение во время выполнения.
Anuj Masand 27.06.2017 11:19:09

Еще одна вещь, которую я не вижу в предыдущих ответах: в Java примитивные классы-обертки, такие как Integer, Double, Float, Boolean ... и String, предполагаются инвариантными, поэтому при передаче экземпляра этих классов вызываемый Метод не может каким-либо образом изменить ваши данные, в отличие от большинства других классов, чьи внутренние данные могут быть изменены его открытыми методами. Так что в этих классах есть только методы «getter», но нет «setters», кроме конструктора.

В Java-программе строковые литералы хранятся в отдельной части памяти кучи, только для литерала, чтобы сэкономить память, многократно используя эти экземпляры.

7
5.03.2010 02:48:56

если вы когда-либо программировали до этого, тогда (int) является одним из примитивных типов, которые вы можете установить для своих переменных (например, char, float, ...).

но Integer - это класс-оболочка, который вы можете использовать для выполнения некоторых функций над переменной int (например, преобразовать ее в строковую или наоборот, ...), но имейте в виду, что методы в классах-оболочках являются статическими, поэтому вы можете использовать их в любое время без создания экземпляра класса Integer. в качестве резюме:

int x;
Integer y; 

x и y обе являются переменными типа int, но y упакован в класс Integer и имеет несколько используемых вами методов, но в случае, если вам нужно вызвать некоторые функции класса-оболочки Integer, вы можете сделать это просто.

Integer.toString(x);

но имейте в виду, что x и y являются corect, но если вы хотите использовать их просто как примитивный тип, используйте простую форму (используется для определения x).

7
31.08.2016 05:53:10

Джава:

int, double, long, byte, float, double, short, boolean, char- примитивы. Используется для хранения основных типов данных, поддерживаемых языком. примитивные типы не являются частью иерархии объектов и не наследуют объект. Это нельзя передать ссылкой на метод.

Double, Float, Long, Integer, Short, Byte, Character, И Boolean, относятся к типу Упаковщики, расфасованные в java.lang. Все оболочки числового типа определяют конструкторы, которые позволяют объекту быть построенным из данного значения или строкового представления этого значения. Использование объектов может добавить накладные расходы даже к самым простым расчетам.

Начиная с JDK 5, Java включала в себя две очень полезные функции: автоматическую коробку и автоматическую коробку. Автобокс / распаковка значительно упрощает и оптимизирует код, который должен преобразовывать примитивные типы в объекты, и наоборот.

Пример конструкторов:

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

Пример упаковки / распаковки:

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

Пример автобокса / автобокса:

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

Книга П.С. Герберта Шильдта была взята в качестве справочной.

7
21.04.2018 19:51:58

Переменная int содержит 32-разрядное целое число со знаком. Integer (с заглавной I) содержит ссылку на объект (класса) типа Integer или на ноль.

Java автоматически приводит между ними; от Integer до int всякий раз, когда объект Integer встречается в качестве аргумента оператора int или назначается переменной int, или значение int присваивается переменной Integer. Этот кастинг называется бокс / распаковка.

Если целочисленная переменная, ссылающаяся на null, является явной или неявной, без нее, создается исключение NullPointerException.

4
26.11.2015 10:54:15

Int и Integer в Java и C # - это два разных термина, используемых для обозначения разных вещей. Это один из примитивных типов данных, который может быть назначен переменной, которая может хранить точно. Одно значение его объявленного типа за один раз.

Например:

int number = 7;

Где intтип данных, назначенный переменной номер, который содержит значение семь. Так что intэто просто примитив, а не объект.

Хотя an Integerявляется классом-оболочкой для примитивного типа данных, который имеет статические методы. Это может быть использовано в качестве аргумента для метода, который требует объекта, где int может использоваться в качестве аргумента для метода, который требует целочисленного значения, которое можно использовать для арифметического выражения.

Например:

Integer number = new Integer(5);
4
30.11.2015 14:53:02

На обоих языках (Java и C #) intесть 4-байтовое целое число со знаком.

В отличие от Java, C # предоставляет целые значения со знаком и без знака. Поскольку Java и C # являются объектно-ориентированными объектами, некоторые операции в этих языках не отображаются непосредственно на инструкции, предоставляемые во время выполнения, и поэтому должны быть определены как часть объекта некоторого типа.

C # предоставляет System.Int32тип значения, использующий часть памяти, которая принадлежит ссылочному типу в куче.

Java предоставляет, java.lang.Integerкоторый является ссылочным типом, работающим на int. Методы в Integerне могут быть скомпилированы напрямую для выполнения инструкций во время выполнения. Таким образом, мы упаковываем значение int для преобразования его в экземпляр Integer и используем методы, которые ожидают экземпляр некоторого типа (например toString(), parseInt()и valueOf()т. Д.).

В C # переменная int относится к System.Int32.Any4-байтовому значению в памяти и может интерпретироваться как примитив int, которым можно манипулировать с помощью экземпляра System.Int32. Так что int - это псевдоним для System.Int32.Whenиспользования целочисленных методов, таких как int.Parse(), int.ToString()и т. Д. Integer компилируется в ГКЛ System.Int32STRUCT вызывая соответствующие методы , такие как Int32.Parse(), Int32.ToString().

4
30.11.2015 14:54:17

В Java intтип является примитивным типом данных, где в качестве Integerтипа используется объект.

В C # intтип также является типом данных System.Int32. integer(Так же , как и любые другие типы значений) могут быть в штучной упаковке ( «обернут») в объект.

4
27.04.2017 08:47:47

В Java int является примитивным типом данных, а Integer является классом Helper, он используется для преобразования одного типа данных в другой.

Например:

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

Примитивные типы данных хранят самую быструю доступную память, где класс Helper сложен, и хранятся в памяти heep.

ссылка от "David Gassner" Java Essential Training.

3
31.08.2016 05:51:38

«int» - это примитивный тип данных и «Integer» в классе Wrapper в Java. «Integer» может использоваться в качестве аргумента для метода, который требует объекта, где «int» может использоваться в качестве аргумента для метода, который требует целочисленного значения, которое может использоваться для арифметического выражения.

2
4.08.2017 09:57:22

01. Целое число может быть нулевым. Но int не может быть нулевым.

Integer value1 = null; //OK

int value2 = null      //Error

02. Только может передать значения типа Wrapper Classes любому классу коллекции.

(Wrapper Classes - Boolean, Символ, Байт, Короткое, Целое, Длинное, Плавающее, Двойное)

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

Но обычно мы добавляем примитивные значения в класс коллекции? Точка 02 верна?

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

Да 02 правильно, beacouse autoboxing.

Автобокс - это автоматическое преобразование, которое делает компилятор Java между типом примитива и соответствующим им классом-оболочкой.

Затем 5 конвертировать в целочисленное значение путем автобокса.

1
5.06.2018 11:35:14

int предопределено в библиотечной функции c #, но в Java мы можем создать объект Integer

1
9.08.2018 10:00:31

(Java версия) В простых словах int является примитивным, а Integer является объектом-оболочкой для int.

Один пример, где использовать Integer против int. Когда вы захотите сравнить переменную int и переменную null снова, будет выдано сообщение об ошибке.

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
15.02.2018 21:04:45

В Java согласно моим знаниям, если вы учитесь, то, когда вы пишете Int; то в Java родового будет компилировать код , как Integer a = new Integer(). Так что согласно дженерикам Integerне используется, а intиспользуется. так что там такая разница.

0
9.08.2018 09:59:40
Есть 18 других ответов на этот вопрос. Ваш добавляет что-то, что другие пропустили? Это не помогает, что это не грамматически для начала.
Teepeemm 23.09.2016 19:21:18

int является примитивным типом данных. Integer - это класс-оболочка. Он может хранить данные int как объекты.

0
3.06.2019 07:01:04

int является примитивным типом данных, тогда как Integer является объектом. Создание объекта с помощью Integer даст вам доступ ко всем методам, которые доступны в классе Integer. Но если вы создадите примитивный тип данных с помощью int, вы не сможете использовать эти встроенные методы, и вам придется определять их самостоятельно. Но если вам не нужны никакие другие методы и вы хотите повысить эффективность использования памяти программой, вы можете использовать примитивный тип данных, поскольку создание объекта увеличит потребление памяти.

0
3.07.2019 05:35:18