Мне нужно создать объект передачи данных, который я буду использовать для хранения записей, полученных из базы данных. В этом объекте передачи данных мне нужно объявить числовое поле. Для того, что лучше - int или Целое число
Если я определяю поле как Integer, будет ли какое-либо влияние на производительность из-за типа Integer, если я собираюсь получить более 2000 записей из БД !?
Заранее спасибо.




Integer теоретически медленнее, чем int, однако влияние на производительность должно быть минимальным, если только вы не гадите числа. Также оптимизация JIT снизит потерю производительности.
Используйте тот, который лучше подходит для вашей ситуации с точки зрения примитивного или ссылочного типа.
Integer - лучший вариант, так как он может работать с null; для int, null станет 0 незаметно, если используется resultSet.getInt(..). В противном случае может возникнуть исключение, например «Невозможно установить для null примитивное свойство».
Производительность здесь не имеет большого значения.
int, вы в конечном итоге добавите дополнительный код обработки; и это не принесет вам большой пользы. Ваш код не будет чистым и прямым, много шаблонного кода, и вы даже не получите повышения производительности.0, где предназначалась null. Представьте себе случай, когда пользователь отправил форму и не предоставил никакого значения для int. По умолчанию вы получите 0. Это имеет смысл, или действительно имеет смысл, когда это поле в базе данных - not null.Адил, я думаю, вам следует отредактировать свой ответ, чтобы включить информацию в свои комментарии. Они имеют отношение к этому обсуждению и могут быть упущены некоторыми людьми, просто взглянув на ответ.
@Adeel: Как null молча превратиться в 0?
@ Уильям Брендель. Я включил свои комментарии в исходный пост. Спасибо.
@ Hemal: java.sun.com/javase/6/docs/api/java/sql/…
Дополнительные сведения о проблеме null <-> int и других проблемах ORM см. В [Несоответствие импеданса] [1] [1]: en.wikipedia.org/wiki/Object-Relational_impedance_mismatch
getInt (int) возвращает int - null уже будет незаметно преобразован в 0. Вместо этого вы должны использовать isNull () в вашем DAO для проверки столбцов, допускающих значение NULL, а затем вы можете использовать либо нулевое целое число, либо магическое число (-1 ) в вашей модели, в зависимости от ваших потребностей.
Когда вы начнете использовать этот код, производительность может стать проблемой. Если ваш код включает в себя много «int blah = object.getBlah (); doCalcsOn (blah); object.setBlah (blah)», то этот код будет вызывать создание по крайней мере одного нового объекта каждый раз при его выполнении. Что нужно иметь в виду.
Я предполагаю, что это зависит, среди прочего, от того, что вы используете для доступа к базе данных. С простым старым JDBC вы могли бы работать с int, в то время как ORM все равно мог молча конвертировать их в Integers. И Integer позволит вам обрабатывать нули.
Вы действительно должны принимать решение, основываясь на том, что вам нужно для выполнения вашего объекта, а не на затратах на производительность. Решение, основанное на производительности, должно быть принято после того, как профилировщиком будет выявлена проблема скорости - корень всего зла и всего такого.
Посмотрите на некоторые особенности обоих и используйте их для своего решения, например
Integer может быть null, int - нет. Так является ли int в БД полем Nullable?Integer?Лично я всегда предпочитаю обертку примитиву. Но это всего лишь предпочтение, а не какие-либо технические достоинства.
автобокс позаботится об этом, если это случится однажды. В противном случае используйте его перед выполнением любых сложных вычислений.
Верно, но если вы выполняете несколько вычислений, разбросанных по сторонам, возможно, вы захотите использовать параметр int, чтобы избежать множественных приведений.
На мой взгляд, выбор между объявлением чего-либо как int или Integer просто сводится к тому, является ли null допустимым для него значением или нет. Autoboxing (и autounboxing) позаботится о любых проблемах с преобразованием, когда число просто должно быть того или иного типа. Производительность (как уже указывалось) также вряд ли будет заметной почти во всех случаях.
Кроме того, тип int должен быть естественным выбором и, вероятно, будет наиболее производительным, если это все равно будет проблемой. Если вам нужно иметь возможность хранить нули, тогда вы имеют используете Integer (а также убедитесь, что никакие нулевые ссылки не распаковываются автоматически для метода, который принимает просто целые числа, поскольку это приведет к исключению NullPointerException).
Чтобы дать вам представление, 2000 Integer добавит к вашему запросу около 0,5 мс. Если вам нужно сериализовать эти данные, это может добавить немного больше.
Однако правильность должна быть на первом месте. Нет смысла быть очень быстрым, но ошибаться. Вы должны учитывать нулевые значения и то, как вы их обрабатываете. (Если столбец НЕ НЕДЕЙСТВИТЕЛЕН) Вы можете использовать Integer.MIN ___ VALUE или вы можете использовать поле длинный вместо int и использовать Long.MIN_VALUE для null. Несмотря на то, что он больше, чем int, он все равно будет во много раз меньше и эффективнее, чем Integer.
int в 10 раз быстрее, чем целое
мы тестируем этот код с библиотекой производительности jetm
int n;
EtmPoint point1 = etmMonitor.createPoint("test:objects");
for (n = 0; n < 1000000; n++) {
Integer t = 0;
t = 10;
t = 11;
}
point1.collect();
EtmPoint point = etmMonitor.createPoint("test:primitives");
for (n = 0; n < 1000000; n++) {
int t = 0;
t = 10;
t = 11;
}
point.collect();
etmMonitor.render(new SimpleTextRenderer());
и результаты:
тест:объекты 10.184
тест: примитивы 1.151
int во много раз быстрее, однако даже в вашем примере вы сделали миллион итераций, чтобы увидеть разницу. Попробуйте всего 2000 значений, которые будет использовать OP. Также вы должны сначала протестировать вариант, который вы считаете самым быстрым, чтобы избежать любой базы, созданной JVM, которая не прогрелась.
2000 элементов или выполнение теста от Integer до int даст тот же результат. int быстрее Integer. Имейте в виду, что Integer - это класс, и приведенный выше код можно перевести как C++ примерно так: for (n = 0; n <2000; n ++) {Integer * t = new Integer (0); t-> privateJVMSetValue (10); t-> privateJVMSetValue (11); } Конечно, для объекта возможно значение null. И если вам это действительно нужно, int - это не то, что вы хотите использовать.
Этот тест - слишком маленький и примитивный способ показать хоть что-нибудь. Не то, чтобы это что-то значило, но после добавления раунда разминки я получаю следующие моменты: Integer Loop: 0.0018 s, Int Loop: 0.0020 s. Вероятно, большая часть того, что происходит в циклах, будет оптимизирована.
int нельзя транслировать на String с использованием toString или (String).
Integer может транслировать в String с toString или (String), и он может обрабатывать null.
Вы можете использовать String.valueOf(int), чтобы «преобразовать» int в String. Как указывает ответ @Adeel, единственное преимущество здесь - возможность обрабатывать null.
Я не уверен, какой классный компилятор вы используете, но вы никогда не можете В ролях an Integer to String.
int используется Java для большинства вычислений. Integer используется во всех формах Коллекций, кроме примитивных массивов.
Использование большого количества временных целых чисел со сборщиком мусора и использование непрофильного процессора в фоновом режиме, что вызовет общее замедление во всем. Слишком большое количество временных файлов, удаляемых в секунду, приведет к тому, что CG перейдет в аварийный режим «Мне нужна память сейчас», что может вызвать сбои в работе приложений, критичных к задержке (например: интерактивная графика в реальном времени, контроллеры физических устройств или связь)
Поэтому для меня, если у меня много вложенных вызовов, которые не выполняют математику, но имеют доступ к большому количеству коллекций, таких как использование ключей для карт, я использую Integer, чтобы избежать тонны автоматического бокса при передаче аргументов.
Если операции являются математическими или используются в качестве счетчиков циклов или других математических операций и не хранятся в коллекциях (кроме примитивных массивов), я использую примитив. То же самое и со всеми другими примитивами, кроме String, который является полноценным объектом.
Если вы хотите проверить значение null, лучше всего подходит Integer, но если вы хотите сравнить целое число, лучше int. В следующем примере я использую целое число c = 1000 и d = 1000 и сравниваю его, возвращая false, но в случае int они вернут true.
public class IntegerCompare {
public static void main(String[] args) {
int a = 1000;
int b = 1000;
Integer c = 1000;
Integer d = 1000;
if (a == b) {
System.out.println("int Value Equals");
}
if (c == d) {
System.out.println("Integer value Equals");
} else {
System.out.println("Integer Value Not Equals");
}
}
}
Один из возможных сценариев - проверка.
Представьте, что у нас есть следующий класс:
class Foo{
@Min(value = 10)
int val;
}
Если пользователь не укажет значение для val в запросе, мы получим неприятный NumberFormatException.
Если int заменить на Integer, мы можем использовать @NotNull и решить эту проблему более изящно.
Скорее всего, вы обнаружите, что накладные расходы, связанные с физическим переносом данных из базы данных в вашу программу, превосходят влияние на производительность Integer-wrapper.