Java: самый эффективный способ оборонительно скопировать интервал []?

У меня есть интерфейс DataSeries с методом

int[] getRawData();

По различным причинам (прежде всего, потому что я использую это с MATLAB и MATLAB, обрабатывает интервал [] хорошо) я должен возвратить массив, а не Список.

Я не хочу, чтобы мои классы с реализацией возвратили интервал [] массив, потому что это изменяемо. Что самый эффективный путь состоит в том, чтобы скопировать интервал [] массив (размеры в 1000-1000000 диапазонах длины)? Это clone()?

6
задан Jason S 13 May 2010 в 21:29
поделиться

3 ответа

Единственная альтернатива - 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

7
ответ дан 8 December 2019 в 15:59
поделиться
  1. Никто никогда не решал проблемы с производительностью своего приложения, выполняя и изменяя вызовы arraycopy () на clone () или наоборот.

  2. На этот вопрос нет однозначного ответа. Дело не только в том, что он может отличаться на разных виртуальных машинах, версиях, операционных системах и оборудовании: он действительно отличается .

  3. Я все равно протестировал его на очень недавнем OpenJDK (на недавнем ubuntu) и обнаружил, что arraycopy намного быстрее. Так это мой ответ тебе? НЕТ! Потому что, если это окажется правдой, есть ошибка с встроенной функцией Arrays.copyOf , и эта ошибка, скорее всего, будет исправлена, поэтому эта информация для вас временна.

7
ответ дан 8 December 2019 в 15:59
поделиться

http://www.javapractices.com/topic/TopicAction.do?Id=3

числа, вероятно, будут отличаться в зависимости от ваших спецификаций, но, похоже, клон - лучший выбор.

1
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: