Разница в размере ссылочных переменных в Java.(Список против ArrayList) - PullRequest
0 голосов
/ 11 декабря 2018

Я поспорил с коллегой по работе, что помимо преимуществ Список интерфейса имеет над ArrayList <> для ссылочных переменных, мы также используем интерфейс List <> для ссылки на объект, потому что он легкий изаймет меньше памяти по сравнению с ArrayList <>.

Мое предположение неверно?Занимают ли List и ArrayList одинаковое количество места?

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

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

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Все типы ссылок занимают одинаковое количество памяти.Ссылка - это не что иное, как адрес ячейки памяти, где хранится фактический объект.

Типы ссылок содержат ссылки на объекты и предоставляют средства для доступа к тем объектам, которые хранятся где-то в памяти.Места памяти не имеют отношения к программистам.Все ссылочные типы являются подклассом типа java.lang.Object.

0 голосов
/ 11 декабря 2018

List - это интерфейс, который означает, что вы не можете использовать его самостоятельно.Поэтому он подчиняется ограничениям любого конкретного класса, используемого для его реализации (ArrayList, LinkedList и т. Д.).Поэтому вопрос не в том, меньше ли List, чем ArrayList, а в том, меньше ли ArrayList, чем LinkedList (или любая другая реализация List).

Поскольку переменные являются просто ссылкамидля места в памяти, безусловно, нет преимущества в размере использования List в качестве ссылки на объект по сравнению с ArrayList, за исключением несущественного размера файла .java

0 голосов
/ 11 декабря 2018

Все ссылочные переменные имеют одинаковый размер, да.Это несколько косвенно рассматривается в спецификации JVM в нескольких местах: §2.2 :

Как и язык программирования Java, виртуальная машина Java работает с двумя типами типов: примитивные типы и ссылочные типы .Соответственно, есть два вида значений, которые могут храниться в переменных, передаваться как аргументы, возвращаться методами и обрабатываться: примитивные значения и ссылочные значения .

(их выделение)

и §2.6.1 :

Одна локальная переменная может содержать значениетипа boolean, byte, char, short, int, float, reference или returnAddress.Пара локальных переменных может содержать значение типа long или double.

(мой акцент)

Как видите, хотяон вызывает вещи, которые имеют различия в размере (int, хранящиеся в одной переменной JVM, например, long, хранящиеся в паре переменных JVM), есть только один вид ссылки, который подходит для одной переменной JVM.(Переменная JVM - это не то же самое, что переменная на уровне исходного кода Java, хотя, очевидно, они тесно связаны.)


В комментарии вы сказали:

Я получил общее представление, потому что ссылка на ArrayList будет иметь больше функциональности, чем ссылка на Список ...

Это источник вашего недопонимания.Функциональность и т. Д. Не содержится в ссылке , она содержится в реализации (классе), связанной с тем, что ссылка относится к (объекту).Например:

List<String> list = new ArrayList<>();

, который объявляет переменную типа List (универсальные помахивания от руки) , которая ссылается на экземпляр ArrayList, который является объектом со связаннымреализация (класс ArrayList).Ссылка - это просто что-то, указывающее JVM, где объект находится в памяти, и ничего более.Вы можете думать о нем как о числе, однозначно идентифицирующем объект (или даже, если хотите, как адрес памяти, хотя это сложнее, чем это), хотя вы никогда не можете напрямую взаимодействовать с номером (адресом).Реализация (класс) не дублируется для каждого объекта (например, данные о состоянии объекта, но не методы, которые он использует), но даже если бы это было так, то дублирования не было бы в ссылка на объект, он будет находиться в самом объекте.List объектов нет, потому что List - это интерфейс.Есть только ArrayList объекты, LinkedList объекты и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...