29

我知道这可能是一个非常愚蠢的问题,但我没有找到可以获取此信息的可靠资源。

在 Android 应用程序中,我试图通过继续附加更多数据来将数据保存在 String 中。最后,当用户关闭应用程序或点击“保存按钮”时,我将其记录到数据 .csv 文件中。

我想知道一个简单的字符串在java中可以保存多少数据?, 这样如果 String 数据类型用完分配的内存,应用程序就不会崩溃。顺便说一句,我尝试对我的应用程序进行压力测试,无论我在一个字符串中存储多少数据,它似乎都运行良好。

阿迪特

4

3 回答 3

36

看到String类的length()方法返回一个 int 值,该方法返回的最大长度将为 Integer.MAX_VALUE,即 2^31 - 1(或大约 20 亿)。

所以理论上你可以有一个 2,147,483,647 个字符的字符串。我不认为你应该需要更多。

但是,正如@TedHopp 在评论中指出并在他的回答中发布的那样,Android 系统会限制您的堆空间,低至 16 MB。因此,您实际上永远无法达到理论极限,并且将在 4-6400 万字符范围内的某个地方使用字符串达到最大值。

于 2013-03-12T18:27:16.540 回答
9

这可能会受到应用程序可用的堆大小的限制。这可能因手机型号和运营商/手机生产商而异。对于 Android 设备,这里的答案列出了各种手机型号的最大堆大小;它们的范围从 16 到 256 MB。

请注意,Java 将字符串存储为 UTF-16 代码,因此每个字符占用两个字节。无论您是直接附加字符串还是使用 StringBuilder(更好),您有时都需要两倍的内存:一个用于存储现有字符串,另一个用于在需要扩展时存储新的字符串/缓冲区。

综合考虑,最大字符串长度可能约为 4 到 6400 万个字符,具体取决于电话(远低于 2 31 -1 的理论最大值)。

于 2013-03-12T18:32:37.323 回答
6

蜥蜴比尔这个问题中回答了

您应该能够获得长度为 Integer.MAX_VALUE 的字符串(根据 Java 规范,数组的最大大小始终为 2147483647 (2 31 - 1),String 类用于内部存储)或最大堆大小的一半(因为每个字符是两个字节),以较小者为准。

但是,对于您的字符串连接序列,您应该使用为此目的而制作的StringBuilder 。

于 2013-03-12T18:27:09.263 回答