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类型,你知道它最大可以放多长的字符串吗?...相关推荐

  1. string生成固定长度的哈希_Redis 选择Hash还是String 存储数据?

    点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:goodspeed 微信公众号:四月(ID:hiiiapril) 在stackov ...

  2. string 中的offset_【Java基础】String常量的长度有限制吗?

    备注:JDK版本:1.8.0 最近同事问了我一个问题,String常量有长度限制吗? 为什么会问起这个问题呢,因为同事在开发中确实遇到了IDEA编译器编译过程中提示字符串常量过长的异常.异常的出现也就 ...

  3. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?|附视频讲解

    关于String有没有长度限制的问题,我之前单独写过一篇文章分析过,最近我又抽空回顾了一下这个问题,发现又有了一些新的认识.于是准备重新整理下这个内容. 这次在之前那篇文章的基础上除了增加了一些验证过 ...

  4. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?

    String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西容易被忽略的. 就如本文我们要讨论的问题:Java中的S ...

  5. 面试官:String的最大长度是多少?

    之前有提到,指北君在做面试相关的事情.有面试官问了String的最大长度是多少?指北君听到这个问题之后有点懵,还好指北君抗住了. 指北君:面试官你好,可以开始面试了吗? 面试官:你好,那我们现在开始吧 ...

  6. android webview参数,Android webView解析URL参数

    2015年6月18日 13:56:21 星期四 又当爹又当娘啊............ public void onPageFinished(WebView view, String url) { s ...

  7. 每日一问:LayoutParams 你知道多少?

    前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:**View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的. ...

  8. Java 中的 String 有没有长度限制?

    这是我的第 199 期分享 作者 | Hollis 来源 | Hollis(ID:hollischuang) 分享 | Java中文社群(ID:javacn666) 关于String有没有长度限制的问 ...

  9. PCIe 每日一问一答

    以下转载自[毅力挑战]PCIe 每日一问一答(2022.03 归档)-阿里云开发者社区 一位有毅力的大神 2022.03.01 - PCIe Retimer 是什么? 随着 PCIe 的迭代,传输速率 ...

最新文章

  1. 链表-删除链表中的重复元素
  2. 深入浅出深拷贝与浅拷贝
  3. 谈谈varnish、squid、apache、nginx缓存的对比
  4. Location和Content-Location
  5. Bit-Z生态联盟正式上线 开启全球加密货币市场新征程
  6. Flink Forward Asia 2020 - Keynote 总结
  7. Machine Learning之Python篇(一)
  8. 《犯罪心理学》读书笔记(part4)--犯罪心理的形成与内在因素的影响(上)
  9. 网络流专题(最大流与费用流)(一)
  10. hmailserver批量添加用户
  11. 如何在面试时写出高质量的代码
  12. java最常见的runtime_Java常见runtime exception
  13. 2015年上半年总结
  14. SQL Server 轻松解决令你头疼的sa登录
  15. U盘启动盘恢复为普通盘
  16. C# 利用SQLite对.DB和.logdb加密和解密和SQLite创建数据库
  17. [转载]JXTA技术与应用发展
  18. 信息流项目计划和思路
  19. python游戏计分代码_Python笔试题之设计“跳一跳”小游戏计分器
  20. 实现销售合同结存条件

热门文章

  1. pagerank数据集_从小白视角理解数据挖掘十大算法
  2. linux qt手册,明远智睿I.MX6 Linux-4.1.15 QT5 程序编译手册
  3. 新版微软Edge浏览器:支持安装Chrome扩展
  4. 简单参数让谷歌Chrome浏览器单进程运行
  5. 轻量级RTSP服务SDK
  6. 计算机基础:程序、进程、线程
  7. npm error enoent:no such file or directory...are-we-there-yet ; package.json文件和node_modules模相互转化
  8. 浏览器tab标签显示网站标志图标
  9. Showdoc使用——接口文档
  10. 软件测试——语句覆盖