java - 为什么 String[] 比 char[] 占用更多空间?

标签 java arrays string memory char

目标:

我正在编写一个 Java 应用程序来读取大型文本文件,其中数据以字符列的格式表示。例如:

A B R S Y E ...
R E W I W I ...
E Q B U O Y ...
W Q V G O R ...

即由空格分隔的单个字母表。 每个这样的行都有数百万个这样的字符。每个文件都有几个这样的行。

设置:

我的工作是按列操作文件。所以我逐行读取文件,拆分 ' ' 并创建数组。从这些数组中,我创建了一个二维数组。一切都很好,因为我在一个有 10 行的小文件上进行了测试。但是当我读取包含 500 行的文件时它开始失败。我的机器和 JVM 有很多内存,所以我没想到会这样。因此,我做了一些分析,发现将行读入 String[] 占用的内存比预期的多。因此,我将 String[] 更改为 char[]。内存使用率急剧下降,一切都很好。

问题:

我的问题是为什么 String[]char[] 占用更多的空间?是因为它就像一个对象数组吗? (因为字符串也是一个对象)。如果有人能解释底层细节,那就太好了。

编辑 1:

这是我之前做的:

String[] parts = line.split(" ");                // Creating a String[]

我把它改成了:

String rowNoSpaces = line.replaceAll(" ", "");   // Removing all the spaces
char[] columns= rowNoSpaces.toCharArray();       // Creating a char[], instead of String[]

如果需要更多信息,请告诉我。

最佳答案

由于 char 是原始类型,char 数组将直接将这些字节存储在数组中,完全没有每个字符的开销。

相比之下,String是一个对象,所以数组会在堆的其他地方存储指向String实例的指针,每个实例都有自己的vtable开销,length , & 其他信息(包括对带有实际文本的 char[] 的单独引用)。拥有大量对象还会增加 GC 堆碎片的风险。

此外,如果您通过连接而不是 StringBuilder 来构建字符串,您还会得到很多额外的副本,占用更多的内存。

关于java - 为什么 String[] 比 char[] 占用更多空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27554703/

相关文章:

c# - C#中的字符串有多长?

c - KR练习4.7 Ungets功能测试

java - 如何使用 SVN 和 Maven 获取内部版本号?

arrays - 什么是循环排序数组?

arrays - 将 Array[String] 的 Spark 列拆分为 String 列

java - 如果String是一个对象,但与Array(也是一个对象)不同,为什么我们可以直接打印出它的值?

java - 有人能告诉我这段代码的逻辑错误是什么吗?

java - 在 servlet 中启动线程,可能是什么问题?

java - 如何使用 java 在 unix 中从 Windows 运行 bash 程序

javascript - 如何使用 JavaScript 读取 Json 中的数组