Разница между `int` и `Integer` в Java: что должен знать тестировщик? 2025

Привет! Меня зовут Василий Волгин, я авто-тестировщик с опытом более 3 лет. Сегодня я хочу разобрать довольно простой, но важный вопрос: чем отличаются `int` и `Integer` в Java и почему это важно знать тестировщикам (как ручным, так и автоматизаторам).

План статьи:

  1. Что такое `int` и `Integer`?
  2. Ключевые отличия.
  3. Использование в тестировании.
  4. Типовые ошибки.
  5. Практические советы.

1. Что такое `int` и `Integer`?

int — примитивный тип данных для целых чисел. Быстр и прост в использовании.

Например:

int a = 10; int b = a + 5; System.out.println(b); // 15

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

Например:

Integer a = 10; Integer b = a + 5; System.out.println(b); // 15

2. Ключевые отличия

  1. Тип данных: int хранится как значение. Integer хранится как ссылка на объект.
  2. Производительность: Операции с int быстрее, так как они выполняются на уровне процессора. Integer медленнее из-за создания и работы с объектом.
  3. Автоупаковка и распаковка: Java автоматически преобразует int в Integer (и наоборот). Это удобно, но может вызывать баги:
Integer a = null; int b = a; // NullPointerException

4. Коллекции: Примитивные типы нельзя использовать в коллекциях (List, Map и т. д.), поэтому здесь нужен Integer.

List<Integer> numbers = new ArrayList<>(); numbers.add(10); // OK numbers.add(null); // Допустимо, но может вызвать проблемы при обработке.

3. Использование в тестировании

3.1. Работа с коллекциями

  • Ручное тестирование: Если API возвращает коллекции, содержащие Integer, проверьте, как система обрабатывает значения null. Например:
List<Integer> numbers = getNumbersFromAPI(); for (Integer num : numbers) { if (num == null) { System.out.println("Null value found!"); } }

Частый баг: некорректная обработка значений null в циклах или при математических операциях.

Integer sum = 0; for (Integer num : numbers) { sum += num; // NullPointerException, если num == null }

Автотесты: Для автоматизации важно тестировать edge-кейсы. Пример на JUnit:

@Test public void testIntegerCollection() { List<Integer> numbers = Arrays.asList(10, null, 20); assertThrows(NullPointerException.class, () -> { int sum = 0; for (Integer num : numbers) { sum += num; } }); }

3.2. Тестирование веб-сайтов и работы с базами данных

  • Ручное тестирование: Представьте форму на сайте, где пользователь вводит возраст. Поле связывается с базой данных, где значение хранится, как Integer. Протестируйте:
  1. Ввод корректных значений (25, 0, -1).
  2. Оставление поля пустым (должно сохраняться null, а не 0).
  3. Ввод некорректных значений (abc, 12345678901234567890).
  • Автоматизированное тестирование: Проверяйте обработку данных в связке с базой. Например, через JDBC:
@Test public void testDatabaseIntegerHandling() throws SQLException { Connection connection = DriverManager.getConnection("jdbc:your_database_url"); Statement stmt = connection.createStatement(); stmt.executeUpdate("INSERT INTO users (age) VALUES (null)"); ResultSet rs = stmt.executeQuery("SELECT age FROM users WHERE id = 1"); if (rs.next()) { Integer age = rs.getObject("age", Integer.class); assertNull(age); // Проверяем, что null корректно сохраняется и извлекается } }

4. Типовые ошибки

1. NullPointerException из-за автоупаковки:

Integer value = getValueFromAPI(); // Метод может вернуть null int result = value + 5; // Ошибка!

2. Неверное сравнение ссылок:

Integer a = 128; Integer b = 128; System.out.println(a == b); // false, так как ссылки разные System.out.println(a.equals(b)); // true, сравнение значений

Для значений в диапазоне от -128 до 127 сравнение через == может работать, так как эти значения кэшируются.

3. Неправильная обработка значений null в API:

Если метод возвращает Integer, всегда проверяйте его на null:

Integer age = getAgeFromAPI(); if (age == null) { System.out.println("Age is not provided!"); }

5. Практические советы

1. Для автотестов с коллекциями:

  • Проверяйте значения null при работе с List<Integer>.
  • Тестируйте сортировку и фильтрацию коллекций с null:
List<Integer> numbers = Arrays.asList(10, null, 5); numbers.sort(Comparator.nullsLast(Integer::compareTo)); System.out.println(numbers); // [5, 10, null]

2. Для тестирования базы данных:

  • Убедитесь, что API корректно работает с полями, где допустимы null.
  • Протестируйте граничные значения (-2,147,483,648, 2,147,483,647) и некорректные данные.

3. Безопасность сравнения:

  • Для Integer используйте .equals() вместо ==, чтобы избежать багов со ссылками.

4. Инициализация:

  • Для int: используйте значение по умолчанию (0).
  • Для Integer: всегда проверяйте на null перед использованием.

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

_____

Василий Волгин QAA
Василий Волгин QAA
Начать дискуссию