String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西容易被忽略的。

就如本文我们要讨论的问题:Java中的String有没有长度限制?

这个问题要分两个阶段看,分别是编译期和运行期。不同的时期限制不一样。

1

编译期

首先,我们先来合理的推断一下,当我们在代码中使用String s = "";的形式来定义String对象的时候,""中字符的个数有没有限制呢?

既然是合理的推断,那就要要足够的依据,所以我们可以从String的源码入手,根据public String(char value[], int offset, int count)的定义,count是int类型的,所以,char value[]中最多可以保存Integer.MAX_VALUE个,即2147483647字符。(jdk1.8.0_73)

但是,实验证明,String s = "";中,最多可以有65534个字符。如果超过这个个数。就会在编译期报错。

public static void main(String[] args) {    String s = "a...a";// 共65534个a    System.out.println(s.length());    String s1 = "a...a";// 共65535个a    System.out.println(s1.length());}

以上代码,会在String s1 = "a…a";// 共65535个a处编译失败:

✗ javac StringLenghDemo.javaStringLenghDemo.java:11: 错误: 常量字符串过长

明明说好的长度限制是2147483647,为什么65535个字符就无法编译了呢?

当我们使用字符串字面量直接定义String的时候,是会把字符串在常量池中存储一份的。那么上面提到的65534其实是常量池的限制。

常量池中的每一种数据项也有自己的类型。Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8类型表示。

CONSTANTUtf8info是一个CONSTANTUtf8类型的常量池数据项,它存储的是一个常量字符串。常量池中的所有字面量几乎都是通过CONSTANTUtf8info描述的。CONSTANTUtf8_info的定义如下:

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

由于本文的重点并不是CONSTANTUtf8info的介绍,这里就不详细展开了,我们只需要我们使用字面量定义的字符串在class文件中,是使用CONSTANTUtf8info存储的,而CONSTANTUtf8info中有u2 length;表明了该类型存储数据的长度。

u2是无符号的16位整数,因此理论上允许的的最大长度是2^16=65536。而 java class 文件是使用一种变体UTF-8格式来存放字符的,null 值使用两个 字节来表示,因此只剩下 65536- 2 = 65534个字节。

关于这一点,在the class file format spec中也有明确说明:

The length of field and method names, field and method descriptors, and other constant string values is limited to 65535 characters by the 16-bit unsigned length item of the CONSTANTUtf8info structure (§4.4.7). Note that the limit is on the number of bytes in the encoding and not on the number of encoded characters. UTF-8 encodes some characters using two or three bytes. Thus, strings incorporating multibyte characters are further constrained.

也就是说,在Java中,所有需要保存在常量池中的数据,长度最大不能超过65535,这当然也包括字符串的定义咯。

2

运行期

上面提到的这种String长度的限制是编译期的限制,也就是使用String s= "";这种字面值方式定义的时候才会有的限制。

那么。String在运行期有没有限制呢,答案是有的,就是我们前文提到的那个Integer.MAX_VALUE ,这个值约等于4G,在运行期,如果String的长度超过这个范围,就可能会抛出异常。(在jdk 1.9之前)

int 是一个 32 位变量类型,取正数部分来算的话,他们最长可以有

2^31-1 =2147483647 个 16-bit Unicodecharacter2147483647 * 16 = 34359738352 位34359738352 / 8 = 4294967294 (Byte)4294967294 / 1024 = 4194303.998046875 (KB)4194303.998046875 / 1024 = 4095.9999980926513671875 (MB)4095.9999980926513671875 / 1024 = 3.99999999813735485076904296875 (GB)

有近 4G 的容量。

推荐阅读:

  • 程序员笑话:牧羊人与IT咨询顾问

  • 漫话:如何给女朋友解释鸿蒙OS是怎样实现跨平台的?

  • 一份工作坚持多久跳槽最合适?

  • linux中的技巧和快捷键总结

喜欢我可以给我设为星标哦

好文章,我 在看 

java string 最大长度_我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?...相关推荐

  1. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?

    String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西容易被忽略的. 就如本文我们要讨论的问题:Java中的S ...

  2. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?|附视频讲解

    关于String有没有长度限制的问题,我之前单独写过一篇文章分析过,最近我又抽空回顾了一下这个问题,发现又有了一些新的认识.于是准备重新整理下这个内容. 这次在之前那篇文章的基础上除了增加了一些验证过 ...

  3. 华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???

    华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题??? 什么是NIO 缓冲区(Buffer) 缓冲区类型 获取缓冲区 核心属性 核心方法 非直接缓冲区和直接缓冲区 非直接缓冲区 ...

  4. java 反射获取属性名和值_面试官这样问我Java反射原理,我刚好都会

    上周我投递出了简历,岗位是java后端开发工程师.这周美团面试官给我进行了面试,面试过程中他问了Java的反射原理.(不得不夸一句,美团的效率真高,上午面完一面,晚上二面马上安排上了.) 无论什么Ja ...

  5. 面试官这样问我Java反射原理,我刚好都会

    上周我投递出了简历,岗位是java后端开发工程师.这周美团面试官给我进行了面试,面试过程中他问了Java的反射原理.(不得不夸一句,美团的效率真高,上午面完一面,晚上二面马上安排上了.) 无论什么Ja ...

  6. 互联网校招 | 大厂面试官常问的java八股文都在了

    前言 作为Java程序员,应该学习怎样的技术?去招聘网站上随便一搜,看看岗位要求就能够十分清楚了,自己具备怎样的技术和能力,就会影响自己的工作环境和社会地位.所以,多学一些大厂技术是百里无一害的! 今 ...

  7. 面试问到java并发_那些面试官必问的JAVA多线程和并发面试题及回答

    Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环 ...

  8. java综合面试题_综合性18道面试官必问经典Java面试题!

    Java具有简单性.面向对象.分布式.健壮性.安全性.平台独立与可移植性.多线程.动态性等特点 .Java可以编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等. 线程的概念 线程进程 ...

  9. 美团四面 Java 岗,终获 offer,我是这么回答面试官的

    前言 经历了 10 月的疫情挣扎与 11 月失业的煎熬,终于来到了春末的 12 月,内心的压力也稍稍的松懈了一些,终于可以放心找个工作了,可是随着的等待面试的机会的越来越少,这份焦虑反而越来越大,也偶 ...

  10. 一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer

    一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer. 墨眉无锋墨家代码 2020-11-22 20:16:50 10525 收藏 56 分类专栏: Java ...

最新文章

  1. 重排序、hb、ConcurrentHashMap弱一致性(jdk1.6)
  2. 中文 iOS/Mac 开发博客列表
  3. CF626E. Simple Skewness
  4. 【Git入门之五】版本管理
  5. 【CodeForces - 471C】MUH and House of Cards (思维,找规律)
  6. 应用安全-提权/降权相关整理
  7. 使用.NET System.IO.Pipelines和Kestrel套接字库创建Redis客户端
  8. android蓝牙在有效范围内自动连接,android – 如何在范围内找到可用的蓝牙设备?...
  9. 多物理场面向对象模拟环境MOOSE学习手册
  10. 【转载】HTTPS那些事(图文版)-Network Tips
  11. 关于蜗牛星际的升级问题!
  12. 微信支付申请资料及费率
  13. 讲理论,重实战,腾达内部SpringBoot王者晋级之路全彩小册开源
  14. 看一个师兄的操作系统视频有感
  15. modbus串口调试助手 MODBUS调试 智能仪表通讯必备软件 RS485串口通讯
  16. 用户即将一分钟后关闭计算机,Win10开机提示“你的电脑将在一分钟后自动重启”怎么办?...
  17. python SQL语句 占位符
  18. 【分享】光模块PPT
  19. Spring、Struts2+Spring+Hibernate整合步骤
  20. xml 压缩_研究最新的XML压缩技术

热门文章

  1. 小D课堂 - 新版本微服务springcloud+Docker教程_3-07 Eureka服务注册中心配置控制台问题处理...
  2. vim编辑器初级(一)
  3. 使用JSONP实现跨域通信
  4. 指针二维二维数组和二重指针 的疑问 二维数组名为什么不能直接赋值给二重指针...
  5. rac备份及恢复的重要概念之一——Redo Threads和Streams
  6. Win32 编程
  7. 软件工程第一次作业(第一次思考这些问题)
  8. C++中的void类型
  9. 自行实现PHP代码注解特性
  10. Zoj 3511 线段树