0

I have the below declaration in my code:

String[] array1 = new String[];

if array1 has 1.000.000 elements (all strings with 80 characters) how heavy is it? I mean for the RAM memory.

4

2 回答 2

7

答案是它取决于许多因素:

  • 您正在使用的 JVM;即提供者和版本
  • 无论您使用的是 32 位还是 64 位 JVM。
  • 无论您是否使用“压缩 oops”(在 64 位 HotSpot JVM 上:-XX:+UseCompressedOops)。
  • 是否使用 UTF-8 字符串(一些 HotSpot JVM 支持:-XX:+UseCompressedStrings)
  • String 数组的元素是否存在null
  • String 数组的元素是否是同一个引用,
  • 字符串是否被实习,实习是否有效,
  • 字符串是否共享相同的后备数组,
  • 等等。

默认情况下,动态创建的字符串不会被实习。如果你实习他们,你可以节省空间,如果你的数据集中有很多“相等”的字符串。但是如果字符串池的另一面有存储开销(它是一个大的哈希表),那么如果相等与不相等的字符串的比率太小,那么您会浪费空间而不是节省空间。

关于支持数组的点也很复杂。背景是split方法(例如)创建共享原始字符串字符数组的字符串对象。如果您创建大量相同原始字符串的子字符串,则可以节省空间。但另一方面是,如果您创建大字符串的小子字符串,则小子字符串可能会导致原始字符串的整个后备数组保持可访问性。

于 2012-04-05T13:24:32.470 回答
4

它依赖于实现。假设一个典型的 JVM 在内部使用 UTF-16 编码,它可能是这样的。

100 万个元素 * 80 个字符 * 2 个字节 = 1.6 亿字节的文本数据。

为每个字符串的内部数据结构(比如 16 个字节左右)、对每个字符串的引用(比如 8 个字节)和数组本身(比如 12 个字节)添加一些开销,你有:

184,000,012 字节

于 2012-04-05T13:01:02.443 回答