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

Bhu*_*han 2 java memory arrays string 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 ...
Run Code Online (Sandbox Code Playgroud)

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

建立:

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

题:

我的问题是为什么String[]需要比这更多的空间char[]?是因为它就像一个对象数组?(因为String也是一个Object).如果有人可以解释低级细节,那将是非常好的.

编辑1:

这是我以前做的事情:

String[] parts = line.split(" ");                // Creating a String[]
Run Code Online (Sandbox Code Playgroud)

这是我改为:

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

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

SLa*_*aks 10

由于char是基本类型,因此字符数组将直接将这些字节存储在数组中,而根本不存在每个字符的开销.

与此相反,String是一个对象,所以阵列将指针存储到String实例在堆别处,其每一个都有其自己的虚表,长度和其他信息(包括一个单独的参照的开销char[]与实际文本).拥有大量对象也会增加GC堆碎片的风险.

另外,如果你通过连接而不是StringBuilders 来构建字符串,你还会获得大量额外的副本,占用更多的内存.