当前位置: 首页 > news >正文

合肥瑶海区网站建设价格/百度平台商家我的订单查询

合肥瑶海区网站建设价格,百度平台商家我的订单查询,移动互联网开发明日学院在线教育网页源码,上海网站设计建设公司作者:程序员自由之路出自:博客园原文:cnblogs.com/54chensongxia/p/13640352.html在学习和开发过程中,我们经常会讨论 short ,int 和 long 这些基本数据类型的取值范围,但是对于 String 类型我们好像很少注…

d93d10c9e9e8ca714a9f2ae8563864be.png

作者:程序员自由之路

出自:博客园

原文:cnblogs.com/54chensongxia/p/13640352.html


在学习和开发过程中,我们经常会讨论 short ,int 和 long 这些基本数据类型的取值范围,但是对于 String 类型我们好像很少注意它的“取值范围”。那么对于 String 类型,它到底有没有长度限制呢?

其实 String 类型的对象,他们是有长度限制的, String 对象并不能“存储”无限长度的字符串。关于 String 的长度限制要从编译时限制运行时限制两方面考虑。

编译期限制#

有JVM虚拟机相关知识的同学肯定知道,下面定义的字符串常量“自由之路”会被放入方法区的常量池中。

String s = "自由之路";
System.out.println(s);

Stirng 长度之所以会受限制,是因JVM规范对常量池有所限制。常量池中的每一种数据项都有自己的类型。Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8类型表示。

CONSTANT_Utf8的数据结构如下:

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

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

//65535个d,编译报错
String s = "dd..dd";//65534个d,编译通过
String s1 = "dd..d";

上面的列子中长度为65535的字符串s还是编译失败了,但是长度为65534的字符串 s1 编译是成功的。这个好像和我们刚刚的结论不符合。

其实,这时Javac编译器的额外限制。在Javac的源代码中可以找到以下代码:

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;}
}

代码中可以看出,当参数类型为String,并且长度大于等于65535的时候,就会导致编译失败。

这里需要重点强调下的是:String 的限制并不是对字符串长度的限制,而是对字符串底层存储的限制。这句话可能比较抽象,下面举个列子就清楚了。

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,也没超过Javac的限制,所以可以编译通过。

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

对于s3,一个英文字母d加上21845个中文”自“占用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)*2*16/8/1024/1024/1024 = 4GB

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

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

简单总结#

String 的长度是有限制的。

  • 编译期的限制:字符串的UTF8编码值的字节数不能超过65535,字符串的长度不能超过65534;
  • 运行时限制:字符串的长度不能超过2^31-1,占用的内存数不能超过虚拟机能够提供的最大值。
http://www.jmfq.cn/news/4999375.html

相关文章:

  • 比较好看的网站设计/百度app营销软件
  • 海南省建设网站的公司/百度一下就知道官方网站
  • 宁国市网站关键词优化外包/全网营销国际系统
  • 苏州网站排名/seo翻译
  • 做啥英文网站赚钱/旅行网站排名前十名
  • 前端网站建设插件/友链交换网站源码
  • 有没有免费的网站空间/优化疫情防控 这些措施你应该知道
  • 网站域名怎么进行实名认证/seo搜索引擎优化工资
  • 做视频网站注意什么/网络营销到底是干嘛的
  • 商丘网站制作案例/搜索引擎营销的常见方式
  • 江苏省网站备案查询/常用的网络推广的方法有哪些
  • 桂林做网站哪家好/百度推广一般要多少钱
  • 沈阳网站开发公司/网站代运营多少钱一个月
  • 亚马逊网站建设做什么/网络推广什么做
  • vb做的网站怎么调试/医院网站建设方案
  • 中国建设银行邵阳分行网站/2022今日最新军事新闻
  • 开发者模式对手机有伤害吗/网站seo的主要优化内容
  • 阳江房地产信息网官方网站/杨谦教授编的营销课程
  • 东莞 网站建设/安卓手机性能优化软件
  • z-blog做企业网站/哪个平台可以买卖链接
  • 网页的首页/南京百度快速排名优化
  • 涉县网站开发/安阳企业网站优化外包
  • 莱芜市网站建设/每天看七个广告赚40元的app
  • Wix做的网站在国内打不开/十大网络推广公司
  • 主题资源网站建设反思/百度推广后台登陆
  • 网站建设哪家公司便宜/新闻热点事件2021(最新)
  • 广州小型企业网站建设/西安网络优化大的公司
  • 做网站需要编程/宜昌网站seo收费
  • 武汉江汉路网站建设/天津提升专业关键词排名
  • 用ps做网站首页/抖音seo系统