У меня есть массив, a
который постоянно обновляется. Давайте скажем a = [1,2,3,4,5]
. Мне нужно сделать точную копию a
и позвонить b
. Если a
бы измениться [6,7,8,9,10]
, b
все равно должно быть [1,2,3,4,5]
. Каков наилучший способ сделать это? Я попробовал for
цикл как:
for(int i=0; i<5; i++) {
b[i]=a[i]
}
но это, кажется, не работает правильно. Пожалуйста, не используйте расширенные термины, такие как глубокий текст и т. Д., Потому что я не знаю, что это значит.
System.arraycopy
, то увидите, что метод должен проверять различные вещи перед его запуском. Некоторые из этих проверок не нужны в цикле копирования, в зависимости от типа статического массива.clone()
оказывается самым быстрым для 250 000 элементов.src.clone()
он более читабелен и имеет гораздо меньше возможностей для ошибок, чем выделение нового массива и выполнениеarraycopy
. (А также бывает быстрым.)ты можешь использовать
также.
источник
Если вы хотите сделать копию:
Это путь:
Arrays.copyOf
может быть быстрее, чемa.clone()
на небольших массивах. Оба элемента копирования одинаково быстро, но clone () возвращает,Object
поэтому компилятор должен вставить неявное приведение кint[]
. Вы можете увидеть это в байт-коде, что-то вроде этого:источник
Хорошее объяснение от http://www.journaldev.com/753/how-to-copy-arrays-in-java
Методы копирования массива Java
источник
У меня есть ощущение, что все эти «лучшие способы скопировать массив» на самом деле не решат вашу проблему.
Ты говоришь
Глядя на этот цикл, нет очевидной причины, по которой он не работает ... если только:
a
иb
массивы перепутались (например ,a
иb
относятся к одному массиву), илиa
массив.В любом случае, альтернативные способы копирования не решат основную проблему.
Исправление для первого сценария очевидно. Для второго сценария вам нужно будет найти способ синхронизации потоков. Классы атомарных массивов не помогают, потому что у них нет конструкторов атомарных копий или методов клонирования, но синхронизация с использованием примитивного мьютекса поможет.
(В вашем вопросе есть подсказки, которые заставляют меня думать, что это действительно связано с ветками; например, ваше утверждение
a
постоянно меняется.)источник
Вы можете попробовать использовать Arrays.copyOf () в Java
источник
Все решения, которые вызывают длину из массива, добавляют ваш пример кода с избыточным значением null checkersconr:
Я рекомендую вам не изобретать колесо и использовать служебный класс, где все необходимые проверки уже выполнены. Рассмотрим ArrayUtils из Apache Commons. Ваш код становится короче:
Apache Commons вы можете найти там
источник
Вы также можете использовать
Arrays.copyOfRange
.Пример :
Этот метод похож
Arrays.copyOf
, но он более гибкий. Оба они используютSystem.arraycopy
под капотом.Смотрите :
источник
Для нулевой безопасной копии массива вы также можете использовать опциональный
Object.clone()
метод, предоставленный в этом ответе .источник
Optional
объект является просто пустым объектом со ссылкой на существующий массив. Что касается влияния на производительность, я бы сказал, что преждевременно говорить, что это на самом деле воздействие, поскольку этот тип конструкции является хорошим кандидатом для встраивания внутри JVM и, следовательно, не более, чем другие методы. Это вопрос стиля (функциональное программирование или процедурное программирование, но не только), рассматривать его как более сложный или нет.Если вы должны работать с сырыми массивами , а не
ArrayList
тоArrays
есть то , что вам нужно. Если вы посмотрите на исходный код, это самый лучший способ получить копию массива. У них есть немного защитного программирования, потому чтоSystem.arraycopy()
метод генерирует множество непроверенных исключений, если вы передаете ему нелогичные параметры.Вы можете использовать любой из
Arrays.copyOf()
них, который будет копировать с первогоNth
элемента в новый более короткий массив.или
Arrays.copyOfRange()
тоже сделает свое дело:Как видите, обе эти функции - просто обертки
System.arraycopy
с защитной логикой, что то, что вы пытаетесь сделать, является допустимым.System.arraycopy
это самый быстрый способ копирования массивов.источник
У меня была похожая проблема с 2D-массивами, и она закончилась. Я копировал основной массив и изменял значения внутренних массивов, и был удивлен, когда значения изменились в обеих копиях. В основном обе копии были независимыми, но содержали ссылки на одни и те же внутренние массивы, и мне пришлось сделать массив копий внутренних массивов, чтобы получить то, что я хотел.
Вероятно, это не проблема ОП, но я надеюсь, что она все еще может быть полезной.
источник