java数组有多重? 2 月,1 周 Questions & Answers 313 我的代码中有以下声明: String[] array1 = new String[]; 如果array1有1.000.000个元素(所有字符串都有80个字符),那么它有多重?我是说内存
# 1 楼答案 它依赖于实现。假设一个典型的JVM在内部使用UTF-16编码,它可能是这样的 100万个元素*80个字符*2字节=文本数据的1.6亿字节 为每个字符串的内部数据结构(比如16个字节左右)、对每个字符串的引用(比如8个字节)和数组本身(比如12个字节)增加一些开销,您可以: 184000012字节
# 2 楼答案 答案是,它取决于许多因素: 你正在使用的JVM;i、 e.供应商和版本 无论您使用的是32位还是64位JVM李> 无论您是否使用“压缩的oops”(在64位热点JVM上:-XX:+UseCompressedOops)李> 是否使用UTF-8字符串(一些热点JVM支持:-XX:+UseCompressedStrings) 字符串数组的元素是否为null 字符串数组的元素是否是相同的引用 是否对弦进行了实习,实习是否有效 字符串是否共享相同的支持数组 等等李> 默认情况下,动态创建的字符串不会被占用。如果在数据集中有许多“相等”的字符串,那么对它们进行实习可以节省空间。但是,如果字符串池的另一面有存储开销(这是一个大的哈希表),那么如果相等字符串与不相等字符串的比率太小,那么您将浪费空间,而不是节省空间 关于支持阵列的问题也很复杂。背景是split方法(例如)创建共享原始String的schracter数组的String对象。如果你为同一个原始字符串创建了很多子字符串,这可以节省空间。但另一方面,如果你在一个大字符串中创建一个小的子字符串,那么这个小的子字符串可以使原始字符串的整个后备数组保持可访问性
# 1 楼答案
它依赖于实现。假设一个典型的JVM在内部使用UTF-16编码,它可能是这样的
100万个元素*80个字符*2字节=文本数据的1.6亿字节
为每个字符串的内部数据结构(比如16个字节左右)、对每个字符串的引用(比如8个字节)和数组本身(比如12个字节)增加一些开销,您可以:
184000012字节
# 2 楼答案
答案是,它取决于许多因素:
null
默认情况下,动态创建的字符串不会被占用。如果在数据集中有许多“相等”的字符串,那么对它们进行实习可以节省空间。但是,如果字符串池的另一面有存储开销(这是一个大的哈希表),那么如果相等字符串与不相等字符串的比率太小,那么您将浪费空间,而不是节省空间
关于支持阵列的问题也很复杂。背景是
split
方法(例如)创建共享原始String的schracter数组的String对象。如果你为同一个原始字符串创建了很多子字符串,这可以节省空间。但另一方面,如果你在一个大字符串中创建一个小的子字符串,那么这个小的子字符串可以使原始字符串的整个后备数组保持可访问性