使用Tuple(double,int,int)的arraylist比两个arraylists慢

时间:2011-07-28 17:36:18

标签: java arraylist autoboxing

使用Tuple(double,int,int)的arraylist比三个单独的arraylists慢吗?我想避免创建大量的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 个答案:

答案 0 :(得分:3)

除非您编写了一个自定义Tuple类,该类维护未装箱的 double和两个int值,否则它们将被装箱...所以基本上你最终会得到每个项目的额外Tuple个对象,尽管只有一个基础数组而ArrayList而不是3个。

如果值的三倍代表一个有意义的复合值,我会非常想写一个小类来为每个属性封装其中三个有意义的名称。这样你最终可能会得到更易读的代码高效代码(因为不会有任何装箱)。

答案 1 :(得分:3)

您的问题缺少背景。这个问题已被多次询问,并没有单一的最佳解决方案。

在我看来,对数据建模的最佳方法是使用表示数据的逻辑类型。 (您当前正在使用元组,但最好使用方法来获得特定类型。)

所以,我会做以下事情:

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

特别是速度 - 这取决于您将如何使用数据。如果您正在寻找快速访问时间,最好使用map并在某个值上键入每个项目。

答案 2 :(得分:1)

最有可能使用一组对象(或者在你的情况下,使用元组)来保存一行代码,并将所有内容放在一个地方(元组。)

以下是我要做的示例代码。

//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>();

答案 3 :(得分:0)

如果Tople是一个有3个ivars的班级,那么这就是你要走的路。

Aditionaly arralist只接受对象,因此它会自动显示所有基元,但是如果你正在使用一个类,那么它肯定不会在类中自动装箱。

答案 4 :(得分:0)

要回答您的直接问题,method2 通过自动装箱创建对象,假设您输入的值是基元(doubleint等)。当然,如果你使用Tuple类,你也会创建对象,但是你将创建对象数量的1/3,假设Tuple类维护了两个int和一个double