Что такое ссылочные типы данных в программировании?

«Что такое ссылочные типы данных в программировании?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ссылочные типы данных хранят не само значение, а адрес (ссылку) на область памяти, где это значение находится. При присваивании или передаче в функцию копируется именно эта ссылка, а не данные объекта.

Ключевые особенности:

  • Общее состояние: Несколько переменных могут ссылаться на один объект. Изменения, сделанные через одну ссылку, видны через все другие.
  • Сравнение: Оператор == (в большинстве языков) сравнивает ссылки (адреса в памяти), а не содержимое объектов.
  • Null-значение: Ссылочные переменные могут иметь специальное значение (например, null, None), указывающее на отсутствие объекта.
  • Распространённые примеры: Объекты, массивы, коллекции, строки (в некоторых языках).

Пример на Java:

import java.util.ArrayList;
import java.util.List;

public class ReferenceExample {
    public static void main(String[] args) {
        // list1 и list2 ссылаются на один и тот же объект в куче (heap)
        List<String> list1 = new ArrayList<>();
        list1.add("test");
        List<String> list2 = list1;

        list2.add("another");
        System.out.println(list1); // Выведет: [test, another]
        System.out.println(list1 == list2); // true (ссылки равны)

        // Сравнение содержимого требует специального метода
        List<String> list3 = new ArrayList<>(list1);
        System.out.println(list1.equals(list3)); // true (содержимое одинаково)
        System.out.println(list1 == list3); // false (это разные объекты)
    }
}

Противопоставление: В отличие от примитивных (значимых) типов (например, int, boolean), которые хранят значение непосредственно и копируются по значению.