У меня есть интерфейс DataSeries
с методом
int[] getRawData();
По различным причинам (прежде всего, потому что я использую это с MATLAB и MATLAB, обрабатывает интервал [] хорошо) я должен возвратить массив, а не Список.
Я не хочу, чтобы мои классы с реализацией возвратили интервал [] массив, потому что это изменяемо. Что самый эффективный путь состоит в том, чтобы скопировать интервал [] массив (размеры в 1000-1000000 диапазонах длины)? Это clone()
?
Единственная альтернатива - Arrays # copyOf ()
(который использует System # arrayCopy ()
под капотами).
Просто проверьте это.
package com.stackoverflow.q2830456;
import java.util.Arrays;
import java.util.Random;
public class Test {
public static void main(String[] args) throws Exception {
Random random = new Random();
int[] ints = new int[100000];
for (int i = 0; i < ints.length; ints[i++] = random.nextInt());
long st = System.currentTimeMillis();
test1(ints);
System.out.println(System.currentTimeMillis() - st);
st = System.currentTimeMillis();
test2(ints);
System.out.println(System.currentTimeMillis() - st);
}
static void test1(int[] ints) {
for (int i = 0; i < ints.length; i++) {
ints.clone();
}
}
static void test2(int[] ints) {
for (int i = 0; i < ints.length; i++) {
Arrays.copyOf(ints, ints.length);
}
}
}
20203 20131
и когда меняются местами test1 ()
и test2 ()
:
20157 20275
Разница незначительна. Я бы сказал, просто используйте clone ()
, так как он лучше читается, а Arrays # copyOf ()
- только для Java 6.
Примечание: фактические результаты могут зависеть от используемой платформы и JVM, это было протестировано на Dell Latitude E5500 с Intel P8400, 4 ГБ оперативной памяти PC2-6400, WinXP, JDK 1.6.0_17_b04
Никто никогда не решал проблемы с производительностью своего приложения, выполняя и изменяя вызовы arraycopy () на clone () или наоборот.
На этот вопрос нет однозначного ответа. Дело не только в том, что он может отличаться на разных виртуальных машинах, версиях, операционных системах и оборудовании: он действительно отличается .
Я все равно протестировал его на очень недавнем OpenJDK (на недавнем ubuntu) и обнаружил, что arraycopy
намного быстрее. Так это мой ответ тебе? НЕТ! Потому что, если это окажется правдой, есть ошибка с встроенной функцией Arrays.copyOf
, и эта ошибка, скорее всего, будет исправлена, поэтому эта информация для вас временна.
http://www.javapractices.com/topic/TopicAction.do?Id=3
числа, вероятно, будут отличаться в зависимости от ваших спецификаций, но, похоже, клон - лучший выбор.