3

使用 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>();
4

5 回答 5

3

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

如果值的三元组表示一个有意义的复合值,我会很想编写一个小类来封装它们三个,并为每个属性使用有意义的名称。这样,您最终可能会得到更易读的代码更高效的代码(因为不会有任何装箱)。

于 2011-07-28T17:42:04.750 回答
3

您的问题缺少上下文。这个问题已经被问过很多次了,没有单一的最佳解决方案。

在我看来,对数据建模的最佳方式是拥有一个代表您的数据的逻辑类型。(您当前正在使用元组,但最好使用带有方法的特定类型。)

所以,我会做以下事情:

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

就速度而言,这取决于您将如何使用数据。如果您正在寻找快速访问时间,最好使用 amap并将每个项目键入某个值。

于 2011-07-28T17:42:42.597 回答
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>();
于 2011-07-28T17:42:05.327 回答
0

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

Aditionaly arralist 只接受对象,因此它会自动装箱所有原语,但如果您使用的是一个类,它肯定不会自动装箱类中的 ivars。

于 2011-07-28T17:39:47.087 回答
0

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

于 2011-07-28T18:13:31.217 回答