Для массива объектов ArrayList:
ArrayList obj[10];
Объекты будут инициализированы по умолчанию, что хорошо для пользовательских типов, но может быть не тем, что вы хотите для встроенных типов.
Рассмотрим также:
std::vector<ArrayList> obj(10, ArrayList());
Это инициализирует объекты путем копирования того, что вы передаете в качестве второго параметра. Так что они все одинаковые, но не обязательно по умолчанию. И, как указывает litb, «10» в векторе можно заменить неконстантным выражением, тогда как «10» в объявлении массива не может.
Это фактически не помещает объекты ArrayList в стек, а помещает все 10 в одно выделение из кучи. Таким образом, очень редко могут возникнуть проблемы с производительностью, если вы действительно не можете позволить себе одно выделение. Однако std :: vector находится в стеке, и он удаляет все объекты кучи, которые он использует, когда он уничтожается. Таким образом, для обеспечения того, чтобы ваши ресурсы были освобождены, вектор ведет себя «как если бы» все было в стеке.
Обратите внимание, что смешивание контейнера Object со значениями ArrayList, как вы делаете в своем примере Java-кода, чревато опасностями в C ++. По сути, вы не можете этого сделать, даже если ArrayList расширяет Object, поскольку массив будет содержать хранилище только для 10 объектов, и ArrayList, вероятно, требует больше байтов для хранения, чем Object. В результате любой ArrayList, который вы пытаетесь скопировать в массив, будет «разрезан»: в массив помещается только начальная часть его представления.
Если вам нужен контейнер типа, говорящего о том, что он содержит объекты, но который на самом деле содержит ArrayLists, тогда вам нужен контейнер указателей. Чтобы получить хорошую обработку ресурсов, это, вероятно, означает, что вам нужен контейнер умных указателей.