我正在尝试直接从文件反序列化字符串,但我有一个关于很长字符串的问题:Java 字符串的字符数限制等于 Integer.MAX_VALUE
,即 31^2-1 .
但是我的问题是:当我有一个小于该大小但由大小超过 1 个字节的字符组成的 UTF-8 字符串,然后我要求 Java 给我字节数组时,会发生什么?
更清楚地说,如果我可以运行这段代码会发生什么? (我的内存不够):
String toPrint = "";
String string100 = "";
int max = Integer.MAX_VALUE -100;
for (int i = 0; i < 100; i += 10) {
string100 += "1234567ñ90";
}
for (int i = 0; i < max; i += 100) {
toPrint += string100;
}
System.out.println("String complete!");
byte[] byteArray = toPrint.getBytes(StandardCharsets.UTF_8);
System.out.println(byteArray.length);
System.exit(0);
它是否打印“字符串完成!”?还是之前就坏了?
最佳答案
从根本上来说,Strings
的限制是其中的 char
数组不能长于最大数组长度,该长度大致为Integer。 MAX_VALUE
且大于变量 max
。字符串以 UTF-16 存储其字符,因此字符串的 UTF-16 表示形式不能超过最大数组长度。 UTF-8 中的字节数和逻辑字符(Unicode 代码点,或 UTF-32 字符)的数量最终并不重要。
现在让我们转向您的特定示例。由于“1234567ñ90”中的 10 个字符中的每一个都是单个 UTF-16 值,因此该字符串占用 String
的 char
数组的 10 个值。尽管您的代码性能糟糕并且内存要求很高,但它最终应该达到“字符串完成!”如果有足够的可用内存。但是,转换为 UTF-8 时会中断,因为字符串的 UTF-8 表示形式比最大数组长度长,因为“ñ”需要多个字节。
关于Java 字符串 UTF-8 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37273974/