[英]Java String UTF-8 limits
我正在嘗試直接從文件中反序列化字符串,並且我有一個關於很長的字符串的問題: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表示比最大數組長度長,因為“?”需要多個字節。
數組大小也限制為Integer.MAX_VALUE
(這就是為什么String
大小受到限制,畢竟有char[]
支持它),因此,如果編碼使用的字節多於此,則不可能獲得字節數組,無論String
大小以字符為單位。
最終結果將是OutOfMemoryError
,但是首先創建String
將會成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.