Java中String能存储多少个字符

 更新时间:2026年02月07日 09:30:01   作者:念念清晰  
本文主要介绍了Java中字符串长度的限制,Java中字符串长度的限制,

首先String的length方法返回是int。所以理论上长度一定不会超过int的最大值。

编译器源码如下,限制了字符串长度大于等于65535就会编译不通过

private void checkStringConstant(DiagnosticPosition var1, Object var2) {
    if (this.nerrs == 0 && var2 != null && var2 instanceof String &&   ((String)var2).length() >= 65535) {
        this.log.error(var1, "limit.string", new Object[0]);
        ++this.nerrs;
    }
}

Java中的字符常量都是使用UTF8编码的,UTF8编码使用1~4个字节来表示具体的Unicode字符。所以有的字符占用一个字节,而我们平时所用的大部分中文都需要3个字节来存储。

//65534个字母,编译通过
String s1 = "dd..d";

//21845个中文”自“,编译通过
String s2 = "自自...自";

//一个英文字母d加上21845个中文”自“,编译失败
String s3 = "d自自...自";

对于s1,一个字母d的UTF8编码占用一个字节,65534字母占用65534个字节,长度是65534,长度和存储都没超过限制,所以可以编译通过。

对于s2,一个中文占用3个字节,21845个正好占用65535个字节,而且字符串长度是21845,长度和存储也都没超过限制,所以可以编译通过。

对于s3,一个英文字母d加上21845个中文”自“占用65536个字节,超过了存储最大限制,编译失败。

JVM规范对常量池有所限制。量池中的每一种数据项都有自己的类型。Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANTUtf8类型表示。CONSTANTUtf8的数据结构如下:

CONSTANT_Utf8_info {
    u1 tag;
    u2 length;
    u1 bytes[length];
}

我们重点关注下长度为 length 的那个bytes数组,这个数组就是真正存储常量数据的地方,而 length 就是数组可以存储的最大字节数。length 的类型是u2,u2是无符号的16位整数,因此理论上允许的的最大长度是2^16-1=65535。所以上面byte数组的最大长度可以是65535

运行时限制

String 运行时的限制主要体现在 String 的构造函数上。下面是 String 的一个构造函数:

public String(char value[], int offset, int count) {
    ...
}

上面的count值就是字符串的最大长度。在Java中,int的最大长度是2^31-1。所以在运行时,String 的最大长度是2^31-1。

但是这个也是理论上的长度,实际的长度还要看你JVM的内存。我们来看下,最大的字符串会占用多大的内存。

(2^31-1)*16/8/1024/1024/1024 = 2GB

所以在最坏的情况下,一个最大的字符串要占用 2GB的内存。如果你的虚拟机不能分配这么多内存的话,会直接报错的。

补充 JDK9以后对String的存储进行了优化。底层不再使用char数组存储字符串,而是使用byte数组。对于LATIN1字符的字符串可以节省一倍的内存空间。

到此这篇关于Java中String能存储多少个字符的文章就介绍到这了,更多相关Java String 存储字符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot集成Apache Kafka的实战指南

    Spring Boot集成Apache Kafka的实战指南

    Apache Kafka 是一个分布式流处理平台,广泛用于构建实时数据管道、日志聚合系统和事件溯源架构,下面我们来看看如何在 Spring Boot 项目中集成 Kafka吧
    2025-06-06
  • mybatis-plus通用枚举@JsonValue接收参数报错No enum constant

    mybatis-plus通用枚举@JsonValue接收参数报错No enum constant

    最近在使用mybatis-plus时用到了通用枚举,遇到了问题,本文主要介绍了mybatis-plus通用枚举@JsonValue接收参数报错No enum constant,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • java五子棋小游戏实现代码

    java五子棋小游戏实现代码

    这篇文章主要为大家详细介绍了java五子棋实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • SpringBoot中MyBatis-Flex的集成和使用实现

    SpringBoot中MyBatis-Flex的集成和使用实现

    MyBatis-Flex是一个基于MyBatis的数据访问框架,MyBatis-Flex能够极大地提高我们的开发效率和开发体验,本文主要介绍了SpringBoot中MyBatis-Flex的集成和使用实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • SpringBoot实现热部署的方式总结

    SpringBoot实现热部署的方式总结

    所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用,对于Java来说,热部署就是在运行时更新Java类文件,本文将深入探讨SpringBoot有哪些方式可以实现热部署,感兴趣的朋友可以小编一探讨学习
    2023-06-06
  • 解读为何java中的boolean类型是32位的

    解读为何java中的boolean类型是32位的

    这篇文章主要介绍了为何java中的boolean类型是32位的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • SpringBoot基于Java Agent实现项目监控

    SpringBoot基于Java Agent实现项目监控

    在生产环境中,监控对于项目问题的分析排查变得尤为重要,本文将介绍如何利用Java Agent技术实现对SpringBoot应用的无侵入式监控,有需要的小伙伴可以了解下
    2025-07-07
  • ssm mybatis如何配置多个mapper目录

    ssm mybatis如何配置多个mapper目录

    这篇文章主要介绍了ssm mybatis如何配置多个mapper目录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • Spring如何使用三级缓存解决循环依赖

    Spring如何使用三级缓存解决循环依赖

    在Spring框架中,循环依赖是指两个或多个Bean相互依赖,形成闭环,导致无法完成初始化,此问题仅存在于单例Bean中,而原型Bean会抛出异常,Spring通过三级缓存及提前暴露策略解决循环依赖:一级缓存存放完全初始化的Bean
    2024-11-11
  • Spring Cloud实战技巧之使用随机端口

    Spring Cloud实战技巧之使用随机端口

    这篇文章主要给大家介绍了关于Spring Cloud实战技巧之使用随机端口的相关资料,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06

最新评论