在Java中,一个字符串最多能够包含多少数据?

33

我知道这可能是一个非常初学者的问题,但我找不到一个好的可靠资源来获取这些信息。

在Android应用程序中,我正在尝试通过不断添加更多数据来将数据保留在字符串中。最后,当用户关闭应用程序或点击“保存按钮”时,我会将其记录到数据 .csv 文件中。

我想知道Java中一个简单字符串可以容纳多少数据?这样,如果String数据类型耗尽了所分配的内存,应用程序就不会崩溃。 顺便说一下,我已经试图对我的应用程序进行压力测试,无论我存储多少数据在一个字符串中,它似乎都能正常运行。

Adit


你应该使用类似于 StringBuilder 的东西来实现。 - Sednus
2
请查看此链接 (https://dev59.com/QnM_5IYBdhLWcg3w43lt)。 - Daniel García Baena
3
(2^31 - 1)个字符 - SlowDeepCoder
感谢所有出色的答案和建议。我认为StringBuilder的概念是我所缺少的!谢谢 - Adit Gupta
3个回答

39

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

因此,理论上您可以拥有一个长度为 2,147,483,647 的字符串。我认为您不需要比这更长的字符串。

然而,正如 @TedHopp 在评论中指出并在其答案中发布的那样,Android 系统限制了您的堆空间,最低只有 16 MB。因此,您实际上永远不可能达到理论极限,并且字符串的最大长度会在 4-64 万字符范围内。


祝你好运,在Android设备上几乎无法接近那个限制。OP正在询问实际限制(“以便应用程序不崩溃”),而不是Java语言所施加的理论限制。 - Ted Hopp
@TedHopp 没错,我是根据标题中的“Java”来回答的。我会编辑我的答案。 - Raghav Sood
谢谢,StringBuilder的使用也是个好主意,但我不认为我的应用程序需要超过400万个字符! - Adit Gupta
那不可能是20亿吧?W.O. O. - Oussaki
通常来说,如果您有足够的RAM来存储一个2GB的字符串,那应该是足够的了 :) - 99Sono

10

这可能会受到应用程序可用堆大小的限制,这取决于手机型号和运营商/手机制造商。 对于Android设备,在此处的答案中列出了各种手机型号的最大堆大小; 它们的范围从16到256 MB不等。

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

综合考虑,最大字符串长度可能是4到6400万个字符左右,这取决于手机型号(远低于理论最大值231-1)。


8

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

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

然而,对于连接字符串序列,您应该使用StringBuilder,它专门用于此目的。


OP正在询问实际限制,而不是Java语言所施加的理论限制。不过使用StringBuilder的建议很好。 - Ted Hopp
非常有帮助,回答得很好。 - Akash5288

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接