Java中String接受的最大字符串的长度是多少

最近在使用String的时候遇到用string接字符串,结果出现String 接不住,数据过多,超出长度了.原来String是有容量限制的
我们可以使用串接操作符得到一个长度更长的字符串,那么,String对象最多能容纳多少字符呢?查看String的源代码我们可以得知类String中

是使用域 count 来记录对象字符的数量,而count 的类型为 int,因此,我们可以推测最长的长度为 2^32,也就是4G。

  不过,我们在编写源代码的时候,如果使用 Sting str = "aaaa";的形式定义一个字符串,那么双引号里面的ASCII字符最多只能
有 65534 个。为什么呢?因为在class文件的规范中, CONSTANT_Utf8_info表中使用一个16位的无符号整数来记录字符串的长
度的,最多能表示 65536个字节,而java class 文件是使用一种变体UTF-8格式来存放字符的,null值使用两个字节来表示,因此只剩
下 65536- 2 = 65534个字节。也正是变体UTF-8的原因,如果字符串中含有中文等非ASCII字符,那么双引号中字符的数量会更少(一
个中文字符占用三个字节)。如果超出这个数量,在编译的时候编译器会报错
超出后bug如下:
11-16 17:07:51.301 12598-12598/com.hx.socialapp E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 520536)
11-16 17:07:51.326 12598-12598/com.hx.socialapp E/RongLog: [ RongExceptionHandler ] uncaughtException
                                                           java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 520536 bytes
                                                               at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4050)
                                                               at android.os.Handler.handleCallback(Handler.java:836)
                                                               at android.os.Handler.dispatchMessage(Handler.java:103)
                                                               at android.os.Looper.loop(Looper.java:203)
                                                               at android.app.ActivityThread.main(ActivityThread.java:6436)
                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113)
                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:974)
                                                            Caused by: android.os.TransactionTooLargeException: data parcel size 520536 bytes
                                                               at android.os.BinderProxy.transactNative(Native Method)
                                                               at android.os.BinderProxy.transact(Binder.java:626)
                                                               at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3908)
                                                               at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4042)
                                                               at android.os.Handler.handleCallback(Handler.java:836) 
                                                               at android.os.Handler.dispatchMessage(Handler.java:103) 
                                                               at android.os.Looper.loop(Looper.java:203) 
                                                               at android.app.ActivityThread.main(ActivityThread.java:6436) 
                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113) 
                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:974) 


展开阅读全文

没有更多推荐了,返回首页