Какой из них использовать, int или Integer - PullRequest
53 голосов
/ 08 января 2009

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

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

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

Ответы [ 11 ]

111 голосов
/ 08 января 2009

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

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

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

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

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

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

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

10 голосов
/ 08 января 2009

На мой взгляд, выбор между объявлением чего-либо как int или Integer просто сводится к тому, является ли значение null действительным значением для него или нет. Autoboxing (и autounboxing) позаботятся о любых проблемах конвертации, когда число просто должно быть одного типа или другого. Производительность (как было отмечено) также вряд ли будет заметна почти во всех случаях.

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

5 голосов
/ 08 января 2009

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

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

4 голосов
/ 04 ноября 2010

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

2 голосов
/ 30 марта 2009

Чтобы дать вам представление, 2000 Integer добавит к вашему запросу около 0,5 мс. Если вам придется сериализовать эти данные, это может добавить немного больше.

Однако правильность должна быть на первом месте. Нет смысла быть очень быстрым, но ошибаться. Вы должны учитывать нулевые значения и то, как вы их обрабатываете. (Если столбец НЕ НЕДЕЙСТВИТЕЛЕН). Вы можете использовать Integer.MIN ___ VALUE или вы можете использовать поле long вместо int и использовать Long.MIN_VALUE для нуля. Даже если он больше, чем int, он все равно будет во много раз меньше и эффективнее, чем Integer.

1 голос
/ 17 октября 2015

int используется Java для большинства всех вычислений. Целое число используется во всех формах коллекций, кроме примитивных массивов.

использование большого количества временных целых чисел с трэш-сборщиком мусора и использование непроизводительного процессора в фоновом режиме, что вызовет общее замедление во всем. Слишком большое количество временных загрузок в секунду приведет к тому, что CG перейдет в аварийный режим «Мне нужна память сейчас», что может привести к задержкам в критически важных приложениях (например, интерактивная графика в реальном времени, контроллеры физических устройств или связь)

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

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

1 голос
/ 08 января 2009

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

0 голосов
/ 05 марта 2019

Один из возможных сценариев - проверка.

Представьте, что у нас есть следующий класс:

class Foo{
    @Min(value = 10)
    int val;
}

Если пользователь не предоставит значение для val в запросе, мы получим неприятный NumberFormatException.

Если int заменить на Integer, мы можем использовать @NotNull и решить эту проблему более изящно.

0 голосов
/ 12 июля 2017

Если вы хотите проверить значение 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");
        }
    }
}
...