簡體   English   中英

Java String UTF-8限制

[英]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值,因此該字符串占用Stringchar數組的10個值。 盡管您的代碼的性能令人恐懼,並且對內存的要求很高,但最終它應該變成“字符串完成!”。 如果有足夠的可用內存。 但是,當轉換為UTF-8時,它將中斷,因為字符串的UTF-8表示比最大數組長度長,因為“?”需要多個字節。

數組大小也限制為Integer.MAX_VALUE (這就是為什么String大小受到限制,畢竟有char[]支持它),因此,如果編碼使用的字節多於此,則不可能獲得字節數組,無論String大小以字符為單位。

最終結果將是OutOfMemoryError ,但是首先創建String將會成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM