日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android string参数最大长度,每日一问 | 我们经常用的 String类型,你知道它最大可以放多长的字符串吗?...

發(fā)布時間:2025/3/12 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android string参数最大长度,每日一问 | 我们经常用的 String类型,你知道它最大可以放多长的字符串吗?... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

String被用作常量時,它被編譯器當成字面量存放于常量池。常量池中主要存放兩大類常量:字面量和符號引用;常量池中的每一個常量都是一個表,字符串常量存于CONSTANT_Utf8_info表(Tip:字節(jié)碼文件由無符號數(shù)和表映射的數(shù)據(jù)構(gòu)成,詳見java虛擬機規(guī)范或者周志明老師的深入理解Java虛擬機)。

CONSTANT_Utf8_info {

u1 tag;

u2 length;

u1 bytes[length];

}

CONSTANT_Utf8_info表由tag、length和bytes組成。tag用于標識表的類型,大小為一個字節(jié)的無符號數(shù);length表示使用utf-8縮略編碼表示的字符串長度,大小為兩個字節(jié)的無符號數(shù);bytes存放被編碼的字符串。字符串常量的最大值為2^16-1(65535)字節(jié)。當使用javac編譯Test.java文件時,由于其中的字符串長度為65535,超出javac中規(guī)定的大小,編譯失敗;下面是含長度為65534的字符串的Test類編譯前后的內(nèi)容,位于0x7E~0x1007E(包括起止的兩個字節(jié))之間的數(shù)據(jù)為一個CONSTANT_Utf8_info表的映射,tag值為0x01(位于0x7E),之后的兩個字節(jié)表示length值為0xFFFE(65534),隨后的65534個字節(jié)字符串內(nèi)容。

public class Test{

//65534個a

String str="aaaa...";

}

//字節(jié)碼內(nèi)容

Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000: CA FE BA BE 00 00 00 34 00 13 0A 00 05 00 0E 08 J~:>...4........

00000010: 00 0F 09 00 04 00 10 07 00 11 07 00 12 01 00 03 ................

00000020: 73 74 72 01 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 str...Ljava/lang

00000030: 2F 53 74 72 69 6E 67 3B 01 00 06 3C 69 6E 69 74 /String;...

00000040: 3E 01 00 03 28 29 56 01 00 04 43 6F 64 65 01 00 >...()V...Code..

00000050: 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 .LineNumberTable

00000060: 01 00 0A 53 6F 75 72 63 65 46 69 6C 65 01 00 09 ...SourceFile...

00000070: 54 65 73 74 2E 6A 61 76 61 0C 00 08 00 09 01 FF Test.java.......

00000080: FE 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 ~aaaaaaaaaaaaaaa

...

00010070: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 0C aaaaaaaaaaaaaaa.

00010080: 00 06 00 07 01 00 04 54 65 73 74 01 00 10 6A 61 .......Test...ja

00010090: 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 00 21 va/lang/Object.!

000100a0: 00 04 00 05 00 00 00 01 00 00 00 06 00 07 00 00 ................

000100b0: 00 01 00 01 00 08 00 09 00 01 00 0A 00 00 00 27 ...............'

000100c0: 00 02 00 01 00 00 00 0B 2A B7 00 01 2A 12 02 B5 ........*7..*..5

000100d0: 00 03 B1 00 00 00 01 00 0B 00 00 00 0A 00 02 00 ..1.............

000100e0: 00 00 01 00 04 00 02 00 01 00 0C 00 00 00 02 00 ................

000100f0: 0D

javac無法編譯字符串常量長度超過65534的java文件

原因:javac中對字符串常量長度做了限制,可以下面的checkStringConstant方法中看出。(Tip:javac源碼位于OpenJDK中,并且各個版本路徑不一定相同,修改上面的字節(jié)碼文件,將length值由0xFFFE改為0xFFFF,并將bytes數(shù)據(jù)添加一個字節(jié),執(zhí)行java命令,程序正常運行。)

//位于javac源碼中的Gen.java文件,Errors.LimitString 為constant string too long

//Pool.MAX_STRING_LENGTH值為0xFFFF

/** Check a constant value and report if it is a string that is

* too large.

*/

private void checkStringConstant(DiagnosticPosition pos, Object constValue) {

if (nerrs != 0 || // only complain about a long string once

constValue == null ||

!(constValue instanceof String) ||

((String)constValue).length() < Pool.MAX_STRING_LENGTH)

return;

log.error(pos, "limit.string");

nerrs++;

}

String被當作變量時,其長度由String存儲方式?jīng)Q定。在JAVA SE 9之前,String內(nèi)部是由char數(shù)組存儲的,數(shù)組最大長度為Integer.MAX_VALUE(0x7fffffff),即2^31-1,并且char的取值范圍在0~65535之間,占兩個字節(jié),因此String的最大長度為429496967294字節(jié),運行時需要大約4GB的內(nèi)存才能存儲;JAVA SE 9及其后續(xù)版本將char數(shù)組改為byte數(shù)組,因此String的最大長度為2147483647字節(jié)。

總結(jié)

以上是生活随笔為你收集整理的android string参数最大长度,每日一问 | 我们经常用的 String类型,你知道它最大可以放多长的字符串吗?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。