我正在考虑自己创建一个复杂的数据类型,但不确定它的成本。
让我们说,我有3个名单,姓名,年龄,性别,
List<String> name = new ArrayList<String>;
List<Integer> age = new ArrayList<Integer>;
List<String> gender = new ArrayList<String>;
我想将这些列表中的每个元素组合在一起,如下所示:
public class Person {
private String name;
private int age;
private String gender;
public void Person(String name,int age,String gender){
this.name = name;
this.age = age;
this.gender = gender;
}
public void getName () {
return name;
}
public void getAge () {
return age;
}
public void getGender () {
return gender;
}
}
然后我可以创建包含这些信息的对象:
Person person1 = new Person("John",22,"Male")
;
但问题是名称列表如此之大,可能有1,000,000个名称(也是年龄和性别列表),这意味着我需要创建1,000,000个Person对象。将包含姓名,年龄和性别的对象传递给另一个班级是一个好主意,还是我应该分别传递这些名称,年龄,性别?
包含名称,年龄和性别的对象与String name,int age和String gender加在一起的成本相比有多大?
答案 0 :(得分:1)
不要premature optimizations。最明确的方法是拥有一个Person对象列表。如果您实际遇到此部分的性能问题,请考虑如何优化它。
关于对象的内存开销:
int
4个字节 vs 4 + 16个字节的元素相比,List<Integer>
字段将占用更小的空间 强> 因此,总而言之,如果您将分组列表分组到单个对象列表中,则会在每条记录上保存 12个字节。
UPD 由于alignment
,实际保存可能是8个字节答案 1 :(得分:0)
如果你考虑一下,那么做一个Person列表而不是3个单独的列表会更有意义。如果要创建3个列表,将它们保持在一起会很复杂,并且您仍然会为每个String名称,int age和String gender保存一个对象。
人们所做的所有数组列表都是为人们保留参考文献,因此它与大小相同,只是在一个列表中,以减少混淆,因为每个人拥有与三个人完全相同的数据量列表加在一起。
答案 2 :(得分:0)
您的原始代码已经分配了一个额外的对象(Integer
),因此更改为Person
不会更改您的内存消耗,因为age
是基元,而不是对象。
您可以通过确保不分配大量重复字符串来挤压内存,具体取决于获取gender
的方式。如果它来自解析操作,您可能会为每个男性分配一个新的“男性”字符串。请考虑将性别更改为Enum
。