Какой использовать, int или Integer

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

Если я определяю поле как Integer, будет ли какое-либо влияние на производительность из-за типа Integer, если я собираюсь получить более 2000 записей из БД !?

Заранее спасибо.

Скорее всего, вы обнаружите, что накладные расходы, связанные с физическим переносом данных из базы данных в вашу программу, превосходят влияние на производительность Integer-wrapper.

Thorbjørn Ravn Andersen 25.07.2012 13:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
68
1
50 554
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Integer теоретически медленнее, чем int, однако влияние на производительность должно быть минимальным, если только вы не гадите числа. Также оптимизация JIT снизит потерю производительности.

Используйте тот, который лучше подходит для вашей ситуации с точки зрения примитивного или ссылочного типа.

Ответ принят как подходящий

Integer - лучший вариант, так как он может работать с null; для int, null станет 0 незаметно, если используется resultSet.getInt(..). В противном случае может возникнуть исключение, например «Невозможно установить для null примитивное свойство».

Производительность здесь не имеет большого значения.

  • если вы выберете int, вы в конечном итоге добавите дополнительный код обработки; и это не принесет вам большой пользы. Ваш код не будет чистым и прямым, много шаблонного кода, и вы даже не получите повышения производительности.
  • позвольте мне прояснить, что для баз данных значение null не равно нулю. Иногда вы попадаете в 0, где предназначалась null. Представьте себе случай, когда пользователь отправил форму и не предоставил никакого значения для int. По умолчанию вы получите 0. Это имеет смысл, или действительно имеет смысл, когда это поле в базе данных - not null.

Адил, я думаю, вам следует отредактировать свой ответ, чтобы включить информацию в свои комментарии. Они имеют отношение к этому обсуждению и могут быть упущены некоторыми людьми, просто взглянув на ответ.

William Brendel 08.01.2009 13:00

@Adeel: Как null молча превратиться в 0?

Miserable Variable 08.01.2009 13:04

@ Уильям Брендель. Я включил свои комментарии в исходный пост. Спасибо.

Adeel Ansari 08.01.2009 13:05

@ Hemal: java.sun.com/javase/6/docs/api/java/sql/…

Adeel Ansari 08.01.2009 13:07

Дополнительные сведения о проблеме null <-> int и других проблемах ORM см. В [Несоответствие импеданса] [1] [1]: en.wikipedia.org/wiki/Object-Relational_impedance_mismatch

tddmonkey 08.01.2009 13:52

getInt (int) возвращает int - null уже будет незаметно преобразован в 0. Вместо этого вы должны использовать isNull () в вашем DAO для проверки столбцов, допускающих значение NULL, а затем вы можете использовать либо нулевое целое число, либо магическое число (-1 ) в вашей модели, в зависимости от ваших потребностей.

JeeBee 08.01.2009 14:14

Когда вы начнете использовать этот код, производительность может стать проблемой. Если ваш код включает в себя много «int blah = object.getBlah (); doCalcsOn (blah); object.setBlah (blah)», то этот код будет вызывать создание по крайней мере одного нового объекта каждый раз при его выполнении. Что нужно иметь в виду.

wds 08.01.2009 18:10

Я предполагаю, что это зависит, среди прочего, от того, что вы используете для доступа к базе данных. С простым старым JDBC вы могли бы работать с int, в то время как ORM все равно мог молча конвертировать их в Integers. И Integer позволит вам обрабатывать нули.

Вы действительно должны принимать решение, основываясь на том, что вам нужно для выполнения вашего объекта, а не на затратах на производительность. Решение, основанное на производительности, должно быть принято после того, как профилировщиком будет выявлена ​​проблема скорости - корень всего зла и всего такого.

Посмотрите на некоторые особенности обоих и используйте их для своего решения, например

  • Integer может быть null, int - нет. Так является ли int в БД полем Nullable?
  • Вам нужен доступ к методам класса Integer?
  • Вы занимаетесь арифметикой?

Лично я всегда предпочитаю обертку примитиву. Но это всего лишь предпочтение, а не какие-либо технические достоинства.

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

Adeel Ansari 08.01.2009 13:08

Верно, но если вы выполняете несколько вычислений, разбросанных по сторонам, возможно, вы захотите использовать параметр int, чтобы избежать множественных приведений.

tddmonkey 08.01.2009 13:50

На мой взгляд, выбор между объявлением чего-либо как 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, которая не прогрелась.

Peter Lawrey 04.11.2010 22:17

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 - это не то, что вы хотите использовать.

Ratata Tata 29.11.2013 04:57

Этот тест - слишком маленький и примитивный способ показать хоть что-нибудь. Не то, чтобы это что-то значило, но после добавления раунда разминки я получаю следующие моменты: Integer Loop: 0.0018 s, Int Loop: 0.0020 s. Вероятно, большая часть того, что происходит в циклах, будет оптимизирована.

Lii 16.11.2015 12:21

int нельзя транслировать на String с использованием toString или (String).

Integer может транслировать в String с toString или (String), и он может обрабатывать null.

Вы можете использовать String.valueOf(int), чтобы «преобразовать» int в String. Как указывает ответ @Adeel, единственное преимущество здесь - возможность обрабатывать null.

Marcelo 28.11.2012 16:43

Я не уверен, какой классный компилятор вы используете, но вы никогда не можете В ролях an Integer to String.

tddmonkey 02.08.2013 17:03

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 и решить эту проблему более изящно.

Другие вопросы по теме