使用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>();
答案 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 通过自动装箱创建对象,假设您输入的值是基元(double
,int
等)。当然,如果你使用Tuple类,你也会创建对象,但是你将创建对象数量的1/3,假设Tuple类维护了两个int
和一个double
。