Какие знаешь типы данных в Java?

«Какие знаешь типы данных в Java?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java строгая статическая типизация. Все типы данных делятся на две основные категории: примитивные (primitive) и ссылочные (reference).

1. Примитивные типы (8 штук)

Хранятся в стеке (stack memory), хранят непосредственно значение.

Тип Размер Диапазон/Значения По умолчанию
byte 8 бит -128 .. 127 0
short 16 бит -32 768 .. 32 767 0
int 32 бита ~ -2.1 млрд .. 2.1 млрд 0
long 64 бита огромный (около 9*10^18) 0L
float 32 бита числа с плавающей точкой 0.0f
double 64 бита числа с плавающей точкой (двойная точность) 0.0d
char 16 бит символы Unicode (0..65535) 'u0000'
boolean ~ (JVM-dependent) true или false false

2. Ссылочные типы

Хранят ссылку (адрес) на объект в куче (heap memory). К ним относятся:

  • Объекты классов (например, String, Integer, ArrayList, ваши собственные классы).
  • Массивы (например, int[], String[][]).
  • Интерфейсы.
  • Перечисления (enum).

Ключевые отличия:

  • Примитивы работают быстрее и занимают меньше памяти, но не имеют методов.
  • Ссылочные типы могут быть null, имеют методы (через .), участвуют в наследовании.
  • Для каждого примитива есть класс-обертка (Wrapper Class): Byte, Short, Integer, Long, Float, Double, Character, Boolean. Автоупаковка (autoboxing) и распаковка (unboxing) позволяют легко конвертировать между ними.

Пример для тестировщика (важность понимания типов):

// Частая ошибка в коде и источник багов
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // false! Сравнение ссылок, а не значений.
System.out.println(a.equals(b)); // true. Правильное сравнение.

// Из-за кэширования в Integer от -128 до 127
Integer x = 127;
Integer y = 127;
System.out.println(x == y); // true (особенность реализации)

При написании автотестов на Java нужно четко понимать, когда используется примитив, а когда объект, чтобы корректно писать ассерты (например, assertEquals(10, actualValue) для int и assertEquals(Integer.valueOf(10), actualValue) для Integer).