Redian新闻
>
面试官:String 能存储多少个字符?

面试官:String 能存储多少个字符?

公众号新闻

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7343883765540831283


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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

2、编译器源码如下,限制了字符串长度大于等于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个字节,超过了存储最大限制,编译失败。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

3、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

4、运行时限制

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

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

补充

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


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
面试官让我手撕Transformer。。。The New Talent Show Striking Fear Into China’s Biggest Pop Stars哈佛留学生被“野鸡大学”学生抢走offer! 硅谷面试官揭秘求职真相......“我都数不过来万玛才旦到底写了多少个故事”|《老狗》映后Spring 全家桶版本更新:Spring Boot、Spring Security 和 Spring ModulithCloudflare R2 存储引入了事件通知和低频访问存储层今日神图 | 如何高情商回复面试官的提问?面试官:Spring 为什么不支持 static 字段的注入?心眼子训练 | 面试官:如果收到了更好的OFFER,你还会选择我们吗?程序员必备:彻底弄懂常见的 7 种中文字符编码量产存储检测设备,德伽存储完成数千万元天使轮融资|36氪首发一周重磅日程:中国5月PMI、美国核心PCE、美联储多位票委密集发声面对“性能墙”、“存储墙”双墙阻碍,四大新型存储升级算力仅剩3席|MBB导师教研组倾力研发,全面覆盖面试常见题型,并采取课堂模拟面试,三周搞定案例面试!全民山寨时代,还会有多少个周口杰伦和反诈小陈?面试官:“领导给你100块买咖啡,发现是假钞怎么办?”这样回答,当场录取!Python程序因一个字符串被苹果App Store封杀?开发者:审核规则太黑了!“在美国,我又被华人面试官使绊子了”面试官让我手撕Transformer哈佛金牌面试官:锁定这10步黄金实操法则,孩子随时名校ready!8000 血壮山河之军心似铁 序言那些爆火的历史文化街区背后,到底牺牲了多少个传统村落!量产存储检测设备,德伽存储完成数千万元天使轮融资|早起看早期面试官:“如果我鼻子里有块鼻屎,你怎么提醒我?”妹子神回复拿下工作美股基本面 - 2024_03_11 * 晨报 * 金山云盘前涨逾14% H股大幅上涨近19% 小摩上调其评级至超配。比特币市我和老伴(七)下山豪门阔太郭晶晶:人生有多少个十年?How Shanghainese Comedy is Standing Up to the Mainstream微信为什么傻乎乎的同一个文件存储多份?西班牙语还是法语作为面试官,我在面试产品经理时,重点考察的5个能力谷歌裁员继续!面试当天,面试官没了……Last Stop: Looking Past the Stigma Facing China’s MorticiansPython 社区被苹果坑!只因一个字符串审核被拒,核心开发者们想了 8 天办法
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。