创建对象的成本

时间:2015-08-14 00:28:21

标签: java

我正在考虑自己创建一个复杂的数据类型,但不确定它的成本。 让我们说,我有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加在一起的成本相比有多大?

3 个答案:

答案 0 :(得分:1)

不要premature optimizations。最明确的方法是拥有一个Person对象列表。如果您实际遇到此部分的性能问题,请考虑如何优化它。

关于对象的内存开销:

  • 每个对象本身has overhead of 8 bytes
  • 对象的字符串字段将占用与当前数组相同的大小
  • 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