以下哪一项声明是选择分配适量内存的正确选择。选项1的初始收集容量为0,选项2的初始容量为10,选项3的初始容量为10。
如果底层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;
答案 0 :(得分:1)
这是微观优化。
从技术上讲,就内存分配而言,它们是有序的:
Option 3
优于Option 1
略好于Option 2
但是,Option 2
可能是您的最佳选择
Set
null
答案 1 :(得分:0)
如果是这样,在选项3中声明这个是否有意义,这样我就可以避免不必要的内存分配。
嗯, 你 也会创建实体。因为我喜欢在处理双向关联时使用防御式编程方法,如下所示:
public void addToEmails(Email email) {
emails.add(email);
email.setUser(this);
}
我倾向于选择选项#2,因为我不需要进行空检查。
老实说,我甚至没有考虑实例化空集合的“成本”。这很可能不会破坏我的应用程序性能。
如果你的应用程序变慢了(你甚至知道它为什么?它真的是内存或GC问题吗?你诊断或测量的是什么?),我很确定有比这更重要的优化去做。实际上,我打赌我的衬衫。
不要忘记:
如果无法衡量,则无法改善。 - Lord Kelvin