属性字段与属性值映射

Dan*_*l K 5 java optimization coding-style

我有一个包含大约 10 个属性的 (java) 类,其中许多属性可能保持未初始化状态,并且在对象的生命周期内不会被访问。

因此我正在考虑使用 aMap<String,Object>作为属性名称 -> 属性值映射而不是很多字段,以节省资源。
现在我想知道,是否存在任何官方或非官方规则,何时以及如何决定所描述的可能性之一。在我考虑使用这样的映射之前,一个类应该有多少个属性?我应该使用它吗?

在此先感谢您的建议/意见。

Voo*_*Voo 3

好吧,我认为你这样做是为了节省内存,因为显然你并没有通过访问映射而不是字段来节省 CPU 资源。那么让我们看看效果如何:(假设 64 位 JVM 没有压缩 oops - 这是不现实的,但不应该改变结果太多,你可以轻松地自己计算)

基本上java中的一个字段永远不会占用超过8个字节(参考的字大小)。因此,这意味着对于具有 10 个字段的类,假设所有字段均未使用,我们可以节省的最佳大小是 8*10 字节 = 80 字节。

现在您想用一个 HashMap 来替换它 - 这意味着我们已经为此使用了 8 个额外字节。此外,HashMap 总是被初始化,因此我们得到的开销为:2 个字头 + 引用 + 3 个整数 + 浮点数 + 1 个数组(2 个字开销,4 字节大小,默认 16 个引用),这会占用182 bytes内存。

我恭喜你节省了一大笔钱-110 bytes!

PS:我认为哈希集的支持数组的最小可能默认值为 2,因此您可以使用它并得出均匀值。但是,一旦将对象存储在集合中,您就会从该类使用的 Wrapper 对象中获得额外的开销。所以这确实是一个坏主意。