2008-10-28 2 views
1

В Java мы всегда можем использовать массив для хранения ссылки на объект. Затем у нас есть ArrayList или HashTable, который автоматически расширяется для хранения объектов. Но знает ли кто-нибудь собственный способ иметь автоматически расширяемый массив ссылок на объекты?Существует ли расширяемый список ссылок на объекты в Java?

Редактировать: Что я хочу сказать, я хочу знать, имеет ли Java API какой-то класс, способный хранить ссылки на объекты (но не хранить фактический объект, например XXXList или HashTable), и возможность автоматического расширения.

+1

ArrayList _is_ автоматически расширяемый массив ссылок на объекты. Все, что не является примитивным типом (int, char и т. Д.), Является ссылкой на объект. – 2008-10-28 03:27:19

+0

Вы не можете сохранить «фактический объект», объекты могут связываться только через ссылки на другие объекты. – Owen 2008-10-28 04:27:53

ответ

5

Ядровые массивы по определению имеют фиксированный размер. Если вам нужен автоматический рост, вы используете классы XXXList.

EDIT - вопрос был выяснен немного

Когда я первым начинаю изучать Java (идущий от C и C++ фона), это, вероятно, одна из первых вещей, которые споткнулись меня. Надеюсь, я смогу пролить свет.

В отличие от C++, массивы объектов в Java do не объекты магазина. Они хранят ссылки на объекты.

В C++, если вы объявили что-то подобное:

String myStrings[10]; 

Вы получили бы 10 объектов String. На данный момент было бы совершенно законно делать что-то вроде println (myStrings [5] .length); - вы получили бы «0» - конструктор по умолчанию для String создает пустую строку с длиной 0.

В Java, когда вы строите новый массив, вы получаете пустой контейнер, который может содержать 10 ссылок на String. Поэтому вызов:

String[] myStrings = new String[10]; 
println(myStringsp[5].length); 

будет бросать исключения нулевого указателя, потому что вы на самом деле не поместил ссылку типа String в массив еще.

Если вы исходите из фона C++, подумайте о новой String [10] как эквивалентной новой (String *) [10] из C++.

Таким образом, с учетом этого, она должна быть достаточно ясно, почему ArrayList является решением для автоматического расширяющегося массива объектов (а на самом деле, ArrayList реализуются с помощью простых массивов, с помощью алгоритма роста, построенного в этом Распределяет новые расширенные массивы по мере необходимости и копирует содержимое из старого в новое).

На практике существует относительно мало ситуаций, когда мы используем массивы. Если вы пишете контейнер (что-то похожее на ArrayList или BTree), то они полезны или если вы делаете много манипуляций с байтом низкого уровня, но на уровне, который происходит в большинстве случаев, используя один из классов Collections является, безусловно, предпочтительным методом.

0

Существует нет первоклассной языковой конструкции, которая делает то, что я знаю, если это то, что вы ищете.

-5

Если вы можете написать свой код в javascript, да, вы можете это сделать. Массивы javascript - это редкие массивы. он будет расширяться, какой бы вы ни хотели.

можно написать

а [0] = 4;
a [1000] = 434;
a [888] = "строка";

1

Что вы подразумеваете под «родным» способом? Если вы хотите расширить список объектов f, то вы можете использовать ArrayList. С коллекциями List вы получаете метод get (index), который позволяет вам обращаться к объектам в списке по индексу, который дает вам аналогичную функциональность массиву. Внутренне ArrayList реализован с массивом, и ArrayList обрабатывает его автоматически для вас.

0

Это не очень эффективно, но если вы просто добавляете массив, вы можете использовать Apache Commons ArrayUtils.add(). Он возвращает копию исходного массива с дополнительным элементом в нем.

1

Прямо из Array Java Tutorials на солнечной странице:

-> Массив представляет собой объект-контейнер, который содержит фиксированного количества значений одного типа.

Поскольку размер массива объявляется при его создании, на самом деле нет возможности его расширять. Вся цель объявления массива определенного размера состоит в том, чтобы выделять столько памяти, сколько будет использоваться, когда программа будет выполнена. Что вы может do объявляет второй массив, который является функцией, основанной на размере оригинала, копирует все исходные элементы в нее и затем добавляет необходимые новые элементы (хотя это не очень «автоматическое»:)). В противном случае, как вы и некоторые другие упомянули, списки списков - это наиболее эффективный способ.

4

Все классы, реализующие Collection, расширяемы и сохраняют только ссылки: вы не храните объекты, вы создаете их в некотором пространстве данных и только манипулируете ссылками на них, пока они не выйдут из области действия без ссылки на них.

Вы можете поместить ссылку на объект в двух или более коллекциях. Вот как вы можете отсортировать хеш-таблицы и такие ...

1

В Java все переменные объекта являются ссылками. Таким образом,

Foo myFoo = new Foo(); 
Foo anotherFoo = myFoo; 

означает, что обе переменные относятся к одному и тому же объекту, а не к двум отдельным копиям. Аналогично, когда вы помещаете объект в Collection, вы сохраняете только ссылку на объект. Поэтому использование ArrayList или аналогичного - это правильный способ иметь автоматически расширяющуюся часть хранилища.