java常量字符串过长报错的解决办法以及原因分析

作者:gusangg 时间:2023-10-18 10:15:25 

1.发生问题的场景

我在用java获取一个接口的大JSON字符串,并赋值给String常量时,遇到了java: 常量字符串过长这个报错

2.解决问题

2.1 可以使用StringBuilder(线程不安全)或StringBuffer(线程安全,即append方法被synchronize修饰)的append方法来拼接一个String,最后再通过toString()方法转为String即可

java常量字符串过长报错的解决办法以及原因分析

2.2 也可以使用 += 符号来拼接字符串,在javac中,String的 += 符号被重载为了StringBuilder的append方法,有兴趣的可以去了解一下

3.问题的原因

那么为啥会报这个问题呢?翻阅jvm规范发现:

java常量字符串过长报错的解决办法以及原因分析

在java中,常量String的结构体如下,其中的string_index指针指向常量池的一个条目,这个条目的结构体格式为CONSTANT_Utf8_info

java常量字符串过长报错的解决办法以及原因分析

我们来看这个CONSTANT_Utf8_info 结构体,由下图可知一个String类型的常量的最大长度为2^16-1,但事实真的如此吗?

java常量字符串过长报错的解决办法以及原因分析

经过测试,我发现实际最多存2^16-1-1个字符,这是为什么呢?我先去下载了javac的源码(在lib/scr.zip中),我在\lib\src\jdk.compiler\com\sun\tools\javac\jvm|Gen.java中看到了:

java常量字符串过长报错的解决办法以及原因分析

而这个PoolWriter.MAX_STRING_LENGTH的值为:

java常量字符串过长报错的解决办法以及原因分析

所以可以得出,javac允许常量String保存的最大字节数为0xFFFF-1即2^16-2 !!!

最后挖个坑,不知道为啥StringBuilder、StringBuffer、+=符号是如何让String动态增长的?

4.参考

1.java String 到底有多长?String超出长度怎么解决?

2.字符串String的+和+=及循环操作String的原理

来源:https://blog.csdn.net/weixin_43957537/article/details/127141232

标签:java,常量字符串,过长
0
投稿

猜你喜欢

  • 深入理解Android热修复技术原理之资源热修复技术

    2021-08-12 06:13:57
  • Java 详解循环屏障CyclicBarrier如何实现多线程分段等待执行完成

    2022-02-16 04:50:49
  • Android的支付密码输入框实现浅析

    2022-08-19 13:57:43
  • C# Winform按钮中图片实现左图右字的效果实例

    2022-05-01 12:51:41
  • Mybatis批量操作sql写法示例(批量新增、更新)

    2022-12-06 15:19:16
  • Android数据库中事务操作方法之银行转账示例

    2023-07-22 07:56:13
  • java操作Redis缓存设置过期时间的方法

    2023-09-12 05:49:09
  • spring aop注解配置代码实例

    2022-02-16 21:13:33
  • java中方法递归的简单示例

    2022-11-25 11:45:12
  • Java如何使用Optional与Stream取代if判空逻辑(JDK8以上)

    2022-01-15 02:52:53
  • c# 进程之间的线程同步

    2023-07-05 06:34:23
  • c#获取相同概率随机数的算法代码

    2022-09-07 21:18:13
  • Java实战宠物店在线交易平台的实现流程

    2022-07-06 22:04:37
  • mybatis-plus分页查询的实现示例

    2023-11-25 04:57:57
  • Java程序顺序结构中逻辑控制语句详解流程

    2023-06-10 17:54:08
  • Android开发之保存图片到相册的三种方法详解

    2022-07-26 04:49:10
  • Unity中的RegisterPlugins实用案例深入解析

    2022-04-02 10:14:41
  • SpringBoot实现监控Actuator,关闭redis监测

    2021-08-01 04:01:33
  • Android可筛选的弹窗控件CustomFiltControl

    2023-01-21 09:01:46
  • Java如何实现单链表的增删改查

    2021-09-19 09:49:25
  • asp之家 软件编程 m.aspxhome.com