Использует ли arraylist из Tuple (double, int, int) медленнее, чем два arraylists - PullRequest
3 голосов
/ 28 июля 2011

Является ли использование массива Tuple (double, int, int) медленнее, чем три отдельных массива?Я хочу избежать создания большого количества объектов Tuple, но метод 2 создает объекты с помощью автобокса?

//Method 1
Arraylist<Tuple> arr=new Arraylist<Tuple>();
Tuple t=new Tuple(double, int, int);
class Tuple{

    private double value;
    private int a;
    private int b;
}

//Method 2
Arraylist<Double> arr=new Arraylist<Double>();
Arraylist<Integer> arr=new Arraylist<Integer>();
Arraylist<Integer> arr=new Arraylist<Integer>();

Ответы [ 5 ]

3 голосов
/ 28 июля 2011

В вашем вопросе отсутствует контекст. Эта проблема задавалась много раз, и единого лучшего решения не существует.

На мой взгляд, лучший способ для моделирования данных - это иметь логический тип, который представляет ваши данные. (В настоящее время вы используете кортеж, но было бы лучше иметь определенный тип с методами.)

Итак, я бы сделал следующее:

List<NumberContainer> list = new ArrayList<NumberContainer>();

Что касается скорости, в частности - это зависит от того, как вы собираетесь использовать данные. Если вы ищете быстрое время доступа, возможно, лучше всего использовать map и ввести для каждого элемента какое-либо значение.

3 голосов
/ 28 июля 2011

Если вы не написали собственный класс Tuple, который поддерживает распакованный double и два значения int, они все равно будут упакованы ... так что в итоге вы закончитес дополнительным Tuple объектом на элемент, хотя только один базовый массив и ArrayList вместо 3.

Если тройка значений представляет собой значимое составное значение, я бы очень хотел написатьмаленький класс для инкапсуляции трех из них с осмысленными именами для каждого свойства.Таким образом, вы, скорее всего, получите более читаемый код и эффективный код (поскольку не будет никакого бокса).

1 голос
/ 28 июля 2011

Скорее всего, с использованием массива объектов (или, в вашем случае, кортежей), которые сохранят вам строку кода и поместят все в одно место (кортеж).

Вот пример кода для чегоЯ бы сделал.

//Class
class container() {
    int value1, value2;
    double value3;
    //Constructor
    container(int value1, int value2, double value3) {
        this.value1 = value1;
        this.value2 = value2;
        this.value3 = value3;
    }
}

//Implementation
ArrayList<container> arr=new ArrayList<container>();
0 голосов
/ 28 июля 2011

Чтобы ответить на ваш прямой вопрос, метод2 создает объекты с помощью автобокса, предполагая, что значения, которые вы вводите, являются примитивами (double, int и т. Д.). Конечно, если вы используете класс Tuple, вы также создаете объекты, но вы будете создавать 1/3 количества объектов, предполагая, что класс Tuple поддерживает два int s и double.

0 голосов
/ 28 июля 2011

Если Tople - это класс с 3 иварами, то в таком случае это будет путь.

Adralaly arralist принимает только объекты, поэтому он автоматически блокирует все примитивы, но если вы используете класс, он определенно не будет автоматически блокировать ивары в классе.

...