StringUtil

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: Java中字符串最大长度受限于虚拟机规范,字符串字面量在class文件中存储时最大为65534,超长需分段处理。本文介绍通过StringBuilder分组拼接解决超长字符串接收问题的方法。

超长String接收处理1 背景String内部是以char数组的形式存储,数组的长度是int类型,那么String允许的最大长度就是Integer.MAX_VALUE了。又由于java中的字符是以16位存储的,因此大概需要4GB的内存才能存储最大长度的字符串。不过这仅仅是对字符串变量而言,如果是字符串字面量(string literals),如“abc"、"1a2b"之类写在代码中的字符串literals,那么允许的最大长度取决于字符串在常量池中的存储大小,也就是字符串在class格式文件中的存储格式:

Java

运行代码复制代码

private String getOutOfMaxLengthStr() {

 

   StringBuilder sb = new StringBuilder();

   sb.append("65535长度字符串");

   sb.append("65578长度字符串");

 

   json.put("test", sb.toString());

 

   // 总字符串长度

   int length = json.get("test").toString().length();

 

   // 整数组

   int size = length / 65534;

 

   // 最后一组起始脚标

   int lastLength = (65534 * size);

 

   // 分组追加

   StringBuilder sbuffer = new StringBuilder();

   for (int i = 0; i < size; i++) {

       String str = json.get("test").toString().substring(65534 * i, 65534 * (i + 1));

       sbuffer.append(str);

   }

 

   // 最后一组

   String lastStr = json.get("test").toString().substring(lastLength, length);

   sbuffer.append(lastStr);

 

   return sbuffer.toString();

}


CONSTANT_Utf8_info {

u1 tag;

u2 length;

u1 bytes[length];

}

理论上允许的string literal的最大长度是2^16-1=65535。然而实际测试表明,允许的最大长度仅为65534,超过就编译错误了。2 问题描述问题的关键就在于,不管从Http还是RPC等协议中,我们都没办法直接用字符串字面量去直接接收,即:String result = ****,因为这样会直接报错:常量字符串过长所以需要将数据进行分组处理3 解决方案

Java

运行代码复制代码

private String getOutOfMaxLengthStr() {

StringBuilder sb = new StringBuilder();

sb.append("65535长度字符串");

sb.append("65578长度字符串");

json.put("test", sb.toString());

// 总字符串长度

int length = json.get("test").toString().length();

// 整数组

int size = length / 65534;

// 最后一组起始脚标

int lastLength = (65534 * size);

// 分组追加

StringBuilder sbuffer = new StringBuilder();

for (int i = 0; i < size; i++) {

String str = json.get("test").toString().substring(65534 * i, 65534 * (i + 1));

sbuffer.append(str);

}

// 最后一组

String lastStr = json.get("test").toString().substring(lastLength, length);

sbuffer.append(lastStr);

return sbuffer.toString();

}

相关文章
|
缓存 JSON 前端开发
Web项目中,常用的几种清理浏览器缓存的方式
Web项目中,常用的几种清理浏览器缓存的方式
696 0
|
6月前
|
缓存
QLExpress使用及源码分析
本文介绍基于QLExpress的规则引擎实现方案,涵盖实体构建、接口定义与脚本编写。通过@QLAlias注解映射字段别名,结合YAML配置规则表达式,实现逻辑解耦。运行时动态解析AST语法树,支持汉化变量与上下文绑定,并提供缓存与延迟执行机制,提升性能与灵活性。
141 0
QLExpress使用及源码分析
|
6月前
|
人工智能 机器人 Java
黑马最新项目
AIGC项目涵盖大模型私有化部署、聊天机器人、RAG知识库及代码提示工具;天机AI集成SpringAI与多模型工作流;云岚到家聚焦微服务与分布式架构;四方保险构建统一支付与时序数据应用;星辰WMS与Dify项目即将发布。
384 0
黑马最新项目
|
6月前
|
canal 缓存 关系型数据库
微服务原理篇(Canal-Redis)
本文介绍了ES索引同步的常见方案,重点讲解Canal+MQ数据同步机制。通过解析MySQL的binlog日志,Canal模拟slave伪装接入主库,实现增量数据捕获,并结合RabbitMQ保证消息顺序性地同步至Elasticsearch。同时探讨了缓存一致性问题,提出使用分布式锁(如Redis)控制并发写操作,避免双写不一致。还涵盖Redis持久化、集群模式、过期淘汰策略及缓存三剑客(穿透、雪崩、击穿)的解决方案,系统梳理了高并发场景下的数据同步与缓存保障技术体系。
696 0
 微服务原理篇(Canal-Redis)
|
6月前
|
存储 关系型数据库 MySQL
微服务原理篇(XXLJOB-幂等-MySQL)
本文介绍了XXL-JOB任务调度的优势、组成结构及热点商品缓存更新任务的实现,涵盖幂等性概念与解决方案,并深入解析了MySQL存储引擎特性、索引失效场景、回表与覆盖索引原理以及SQL调优和分库分表策略。
318 0
微服务原理篇(XXLJOB-幂等-MySQL)
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型专业名词解释手册
本手册由油炸小波设计提示词、Manus创作,系统梳理大语言模型核心概念,涵盖基础原理、训练技术、优化压缩、推理应用、评估调试及伦理安全六大模块,深入浅出解析LLM关键技术术语。
674 0
|
6月前
|
Arthas 存储 运维
记Arthas实现一次CPU排查与代码热更新
本文介绍使用Arthas排查Java应用CPU占用过高问题的完整流程,涵盖线程分析、阻塞定位、watch命令追踪异常、jad反编译实现热更新及火焰图分析,实现无需重启应用的高效故障排查与代码修复。
248 0
|
6月前
|
XML 算法 安全
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
RAG通过检索与生成结合,提升大模型在企业场景的准确性与可控性。分块策略是其核心,直接影响检索效果与生成质量。本文系统解析五种主流分块方法:固定大小、语义、递归、基于结构及LLM分块,对比其优缺点与适用场景,并提出组合优化建议,助力构建高效、可信的RAG系统。
305 0
|
6月前
|
人工智能 自然语言处理 API
全面认识MCP:大模型连接真实世界的“USB-C接口”
MCP(模型上下文协议)是Anthropic推出的开放标准,被誉为AI时代的“USB-C”。它统一了大模型与工具、数据源的连接方式,简化集成,提升安全与扩展性,推动AI智能体实现复杂任务自动化,正重塑全球AI应用生态。
1084 0
|
6月前
|
人工智能 NoSQL 前端开发
面试真题
汇总多套AI与后端技术面试题,涵盖RAG、微服务、JVM、分布式锁、MySQL优化、大模型部署等核心技术点,深入考察候选人项目经验、系统设计能力及对AI工程化的理解。
332 0

热门文章

最新文章