我正在尝试直接从文件中反序列化字符串,并且我有一个关于很长的字符串的问题:Java字符串的字符数限制等于Integer.MAX_VALUE
,即31 ^ 2-1。
但是,这里出现了我的问题:当我有一个UTF-8字符串,该字符串的大小小于该大小,但由大于1个字节的字符组成,然后我要求Java给我字节数组时,会发生什么?
更清楚地说,如果我可以运行此代码会怎样? (我的RAM还不够):
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 - Java String UTF-8限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37273974/