android string参数最大长度,每日一问 | 我们经常用的 String类型,你知道它最大可以放多长的字符串吗?...
String被用作常量时,它被编译器当成字面量存放于常量池。常量池中主要存放两大类常量:字面量和符号引用;常量池中的每一个常量都是一个表,字符串常量存于CONSTANT_Utf8_info表(Tip:字节码文件由无符号数和表映射的数据构成,详见java虚拟机规范或者周志明老师的深入理解Java虚拟机)。
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
CONSTANT_Utf8_info表由tag、length和bytes组成。tag用于标识表的类型,大小为一个字节的无符号数;length表示使用utf-8缩略编码表示的字符串长度,大小为两个字节的无符号数;bytes存放被编码的字符串。字符串常量的最大值为2^16-1(65535)字节。当使用javac编译Test.java文件时,由于其中的字符串长度为65535,超出javac中规定的大小,编译失败;下面是含长度为65534的字符串的Test类编译前后的内容,位于0x7E~0x1007E(包括起止的两个字节)之间的数据为一个CONSTANT_Utf8_info表的映射,tag值为0x01(位于0x7E),之后的两个字节表示length值为0xFFFE(65534),随后的65534个字节字符串内容。
public class Test{
//65534个a
String str="aaaa...";
}
//字节码内容
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中,并且各个版本路径不一定相同,修改上面的字节码文件,将length值由0xFFFE改为0xFFFF,并将bytes数据添加一个字节,执行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存储方式决定。在JAVA SE 9之前,String内部是由char数组存储的,数组最大长度为Integer.MAX_VALUE(0x7fffffff),即2^31-1,并且char的取值范围在0~65535之间,占两个字节,因此String的最大长度为429496967294字节,运行时需要大约4GB的内存才能存储;JAVA SE 9及其后续版本将char数组改为byte数组,因此String的最大长度为2147483647字节。
android string参数最大长度,每日一问 | 我们经常用的 String类型,你知道它最大可以放多长的字符串吗?...相关推荐
- string生成固定长度的哈希_Redis 选择Hash还是String 存储数据?
点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:goodspeed 微信公众号:四月(ID:hiiiapril) 在stackov ...
- string 中的offset_【Java基础】String常量的长度有限制吗?
备注:JDK版本:1.8.0 最近同事问了我一个问题,String常量有长度限制吗? 为什么会问起这个问题呢,因为同事在开发中确实遇到了IDEA编译器编译过程中提示字符串常量过长的异常.异常的出现也就 ...
- 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?|附视频讲解
关于String有没有长度限制的问题,我之前单独写过一篇文章分析过,最近我又抽空回顾了一下这个问题,发现又有了一些新的认识.于是准备重新整理下这个内容. 这次在之前那篇文章的基础上除了增加了一些验证过 ...
- 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?
String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西容易被忽略的. 就如本文我们要讨论的问题:Java中的S ...
- 面试官:String的最大长度是多少?
之前有提到,指北君在做面试相关的事情.有面试官问了String的最大长度是多少?指北君听到这个问题之后有点懵,还好指北君抗住了. 指北君:面试官你好,可以开始面试了吗? 面试官:你好,那我们现在开始吧 ...
- android webview参数,Android webView解析URL参数
2015年6月18日 13:56:21 星期四 又当爹又当娘啊............ public void onPageFinished(WebView view, String url) { s ...
- 每日一问:LayoutParams 你知道多少?
前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:**View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的. ...
- Java 中的 String 有没有长度限制?
这是我的第 199 期分享 作者 | Hollis 来源 | Hollis(ID:hollischuang) 分享 | Java中文社群(ID:javacn666) 关于String有没有长度限制的问 ...
- PCIe 每日一问一答
以下转载自[毅力挑战]PCIe 每日一问一答(2022.03 归档)-阿里云开发者社区 一位有毅力的大神 2022.03.01 - PCIe Retimer 是什么? 随着 PCIe 的迭代,传输速率 ...
最新文章
- 链表-删除链表中的重复元素
- 深入浅出深拷贝与浅拷贝
- 谈谈varnish、squid、apache、nginx缓存的对比
- Location和Content-Location
- Bit-Z生态联盟正式上线 开启全球加密货币市场新征程
- Flink Forward Asia 2020 - Keynote 总结
- Machine Learning之Python篇(一)
- 《犯罪心理学》读书笔记(part4)--犯罪心理的形成与内在因素的影响(上)
- 网络流专题(最大流与费用流)(一)
- hmailserver批量添加用户
- 如何在面试时写出高质量的代码
- java最常见的runtime_Java常见runtime exception
- 2015年上半年总结
- SQL Server 轻松解决令你头疼的sa登录
- U盘启动盘恢复为普通盘
- C# 利用SQLite对.DB和.logdb加密和解密和SQLite创建数据库
- [转载]JXTA技术与应用发展
- 信息流项目计划和思路
- python游戏计分代码_Python笔试题之设计“跳一跳”小游戏计分器
- 实现销售合同结存条件
热门文章
- pagerank数据集_从小白视角理解数据挖掘十大算法
- linux qt手册,明远智睿I.MX6 Linux-4.1.15 QT5 程序编译手册
- 新版微软Edge浏览器:支持安装Chrome扩展
- 简单参数让谷歌Chrome浏览器单进程运行
- 轻量级RTSP服务SDK
- 计算机基础:程序、进程、线程
- npm error enoent:no such file or directory...are-we-there-yet ; package.json文件和node_modules模相互转化
- 浏览器tab标签显示网站标志图标
- Showdoc使用——接口文档
- 软件测试——语句覆盖