2015-02-24 86 views

回答

2

Java对象有一个8字节的头,如果是单维数组,则有4字节开销来容纳数组长度。

例如,如果您创建了7个字符串,那么您将为对象使用7 * 8字节= 56字节开销。如果你在一个单维数组中容纳它们,你可以为数组对象添加8个字节+数组长度为4个字节,因此你将有56个字节+12个字节= 78个字节的开销。

在多维数组的情况下,在Java中它们是一组数组,因此多维数组的每一行都有一个对象的开销。

+0

很好的答案。非常感谢安东尼奥 – 2015-02-25 07:30:40

0

String[]使用稍微更多的内存,专门用于创建一个具有length属性的数组引用。但是,我们正在讨论的差异非常小,我会建议哪种解决方案更容易阅读(我认为这是数组)。

4

这取决于你正在谈论的是什么样的内存以及你的意思是100个字符串不在数组中。

让我们开始我们可以肯定地说。

  1. 如果我们假设字符串创建以同样的方式,那么字符串的实际表示将占据在两种情况下的堆空间是相同的。

  2. 的100个字符串本身可能占据的幅度更多的空间订单比String[] 100元,或100个单个String变量。

不同之处在于我们如何保持对字符串的引用。

  • 如果它们在String[]保持,阵列对象将采取的阵列元件100个字加3或为数组头和填充4个字。

  • 如果将它们作为对象的实例字段进行保存,则会为这些字段记录100个堆字。 (加上可能的对象的头+填充,如果这不是另外计算,那将是2或3个堆字)。

  • 如果它们被作为静态字段保存,则需要100个堆字。 (另外可能是隐藏的“静态”对象的头+填充...如果不是其他方式)

  • 如果它们作为局部变量保存,则不需要堆空间。相反,引用将占用100个字的堆栈空间。


我想知道什么时候内存问题是至关重要的面糊的做法。

正如您所看到的,整体差异很小,可能太小而不重要。

而且,在实践中,您还需要考虑使用数组的代码大小与使用100个单独变量的代码大小的差异。这将取决于应用程序如何使用字符串。事实上,代码大小的差异可能很容易弥补上述差异。

我的建议是不打扰这一思路。使用任何一种表示方式为您提供最易读和可维护的代码。即使您需要表示数百万个单独的字符串组,也不会出现1或2个机器字的差异。