gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:44:46 31 4
gpt4 key购买 nike

目标:

我正在编写一个 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com