Каков наилучший способ сделать изменяемый размер массива в Java? Я пробовал использовать Vector, но это перемещает все элементы, когда когда вы вставляете, и мне нужен массив, который может расти, но элементы остаются на месте. Я уверен, что для этого есть простой ответ, но я все еще не совсем уверен.
Как я могу сделать изменяемый размер массива в Java?
Ответ 1
В качестве альтернативы вы можете использовать ArrayList. Это реализация интерфейса списка с изменяемым размером.
Использование (с использованием String):
List<String> myList = new ArrayList<String>();
myList.add("a");
myList.add("c");
myList.add("b");
Порядок будет таким же, как вы его положили: a, c, b.
Вы также можете получить отдельный элемент, например:
String myString = myList.get(0);
Что даст вам 0-й элемент: "a".
Ответ 2
Как сказал Санджо: "An array is a static datastructure, so they can't grow
". Интерфейс списка может поддерживаться array (например ArrayList, как отметил Кевин в своем сообщении ). Когда структура списка заполнена и в список добавлен новый элемент. Затем структура сначала создает новый массив, который может содержать старые элементы плюс новый элемент, который должен быть добавлен в список.
Интерфейс списка имеет разные реализации, все из которых имеют плюсы и минусы, и вы должны выбрать наилучшее решение проблемы. Ниже я попытаюсь дать краткий обзор, когда использовать эту реализацию:
Небезопасные реализации:
- ArrayList: Реализуемая реализация интерфейса списка. Вы должны использовать эту реализацию, когда выполняете много операций
size, isEmpty, get, set, iterator, and listIterator
, выполняемых в постоянное время. Операцияadd
работает в режиме амортизированного постоянного времени, то есть при добавлении n элементов требуется время O (n). Я думаю, вы должны использовать эту реализацию, когда делаете больше поисков (get()
), а затем добавляете элементы в список (add()
). - LinkedList: эта реализация не является резервной копией массива, а "связывает" узлы вместе. По-моему, вы должны использовать эту реализацию, когда вы делаете больше
add()
, затемget()
.
Реализованные по потоку реализации:
Имейте в виду, что эти реализации списков не являются thread -safe, что означает, что можно получить условия гонки, когда они присоединяются к ним из нескольких потоков. Если вы хотите использовать реализации List из нескольких потоков, я бы посоветовал вам изучить пакет java.util.concurrent и использовать реализацию из этого класса.
Ответ 3
A LinkedList?
Ответ 4
Вероятно, вам следует использовать ArrayList вместо Vector для объяснений причин, объясненных в других ответах.
Однако...
Я попытался использовать Vector, но это сдвигает все элементы за счет того, когда когда вы вставляете, и мне нужен массив, который может расти, но элементы остаются на месте.
Когда вы выполняете insertElementAt(pos, elem)
, вы специально попросили переместить элемент. Если вы не хотите, чтобы элементы были сдвинуты, вы должны использовать set(pos, elem)
. Или, если вы хотите добавить элемент в конец вектора, вы также можете использовать add(elem)
.
Кстати, предыдущий абзац применяется ко всем реализациям List
, а не только Vector
, хотя детали и производительность реализации различаются для разных типов List
.
Ответ 5
Отъезд ArrayList
Ответ 6
Я попытался использовать Vector, но это сдвигает все элементы за счет того, когда когда вы вставляете, и мне нужен массив, который может расти, но элементы остаются на месте.
Возможно, вы захотите использовать ArrayList вместо Vector.
Оба они предоставляют один и тот же интерфейс, и вы можете заменить их на оба из них, вызвав set(idx, element)
. Это не происходит. Это также не позволяет вам увеличивать массив: вы можете вставлять только в уже занятые позиции (не превышающие текущий размер массива), чтобы добавить новые элементы в конце, вы должны использовать add(element)
.
Разница между ArrayList и Vector заключается в том, что у Vector есть код синхронизации, который вам больше не нужен, что делает ArrayList немного быстрее.
Ответ 7
Если вы хотите управлять данными массива после того, как все элементы уже вставлены или удалены, существует способ, который пытается создать LinkedList или ArrayList, просто изменить размер после завершения ввода данных, вы можете передать ArrayList на Массив, затем выполните все, что вы обычно делаете в Array.
Ответ 8
ArrayList и LinkedList
Космическая сложность:
a) ArrayList: Выделяет кусок памяти при инициализации и удваивании каждый раз, когда он достигает максимального размера, когда вы добавляете элемент динамически.
b) LinkedList: Он выделяет память только каждый раз, когда вы добавляете элемент в список.
Сложность выполнения:
a) ArrayList: Поиск быстрее, вставка и удаление медленнее по сравнению со связанным списком
b) LinkedList: Вставка и удаление выполняется быстрее, поиск медленнее по сравнению с массивом.
Ответ 9
Используйте ArrayList или LinkedList.
Ответ 10
Использование замечательных классов в структуре коллекций лучше, чем использование массивов. Но в случае, если ваш вопрос с точки зрения "опроса", вот что вам следует делать. Создайте свой собственный метод изменения размера, например:
int[] oldArray = {1,2,3};
int oldSize = java.lang.reflect.Array.getLength(oldArray);
Class elementType = oldArray.getClass().getComponentType();
Object newArray = java.lang.reflect.Array.newInstance(
elementType,newSize);
int preserveLength = Math.min(oldSize,newSize);
if (preserveLength > 0)
System.arraycopy (oldArray,0,newArray,0,preserveLength);
oldArray = newArray;