2010-09-01 46 views
1

以下哪个声明是正确选择分配适当内存量的声明。方案1的初始收集能力为0,方案2的初始容量为10,方案3没有声明任何东西。您将如何声明OneToMany成员变量

如果底层ORM提供程序最终加载这些对象,是不是使用setEmails(..)方法来设置Collection的值。如果是这样,只要在选项3中声明这一点是有意义的,这样我就可以避免不必要的内存分配。

Option 1 
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private Set<Email> emails = new HashSet<Email>(0); 

Option 2 
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private Set<Email> emails = new HashSet<Email>(); 

Option 3 
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
private Set<Email> emails; 
+1

选项2具有16的能力在这里;) – Bozho 2010-09-01 05:44:47

+0

得到了与拥有10 – user339108 2010-09-01 05:48:43

+0

选项默认值为1的容量,无论出于何种nitpickery它值得一列表困惑,也有容量为1。(对于常规的Sun HashSet实现) – Affe 2010-09-01 07:08:29

回答

1

这是microoptimization。

从技术上讲,在内存分配方面,他们是有序的:

Option 3优于Option 1略好于Option 2

但尽管如此,Option 2可能是您的最佳选择

  • Set韩元”当你添加项目时,你必须扩展它
  • 你的代码会更容易处理,因为你赢了不用为了检查null
+0

如果底层的ORM使用setEmails(..)将邮件设置为延迟加载,它实际上覆盖了我的初始设置,所以我认为选项3将是最理想的,因为我将不会分配任何空间。在这种情况下,您自动扩展的参数不可行 – user339108 2010-09-01 05:47:21

+0

我的应用程序变得越来越慢,我试图优化其可能性 – user339108 2010-09-01 05:49:43

+0

但是,当您最初创建对象时,您必须在外部初始化它。一个品味的问题。这里是内存,而不是CPU(缓慢) - 在其他地方寻找问题。 – Bozho 2010-09-01 05:58:42

0

如果是这样,这将是有意义的只是把这个声明为备选方案3中,让我能避免不必要的内存分配。

好,确实也创造实体。而且因为我喜欢用防守风格的编程方法具有双向协会工作时,就像这样:

public void addToEmails(Email email) { 
    emails.add(email); 
    email.setUser(this); 
} 

我倾向于选择方案2,因为我没有做空校验。

说实话,我甚至没有想到实例化一个空集合的“成本”。这很可能不会导致我的应用程序性能下降。

如果你的应用程序变得很慢(你甚至知道它是为什么?它是真的是内存还是GC问题?你诊断或测量了什么?),我确信有更多的关键优化比这个一个要做。其实,我打赌我的衬衫。

而且不要忘记:

如果你无法衡量它,你不能改进它。 --Lord开尔文