Java基础---String的长度限制

这篇具有很好参考价值的文章主要介绍了Java基础---String的长度限制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

典型回答

常量池限制

运行期限制


  • 典型回答

  • String有长度限制,编译期和运行期不一样
  • 编译期需要用 CONSTANT_Utf8_info 结构用于表示字符串常量的值,而这个结构是有长度限制,他的限制是65535
  • 运行期,String的length参数是Int类型的,那么也就是说,String定义的时候,最大支持的长度就是int的最大范围值
  • 根据Integer类的定义,java.lang.Integer#MAX_VALUE 的最大值是2^31 - 1;
  • 常量池限制

  • javac是将Java文件编译成class文件的一个命令,那么在Class文件生成过程中,就需要遵守一定的格式
  • 根据《Java虚拟机规范》中第4.4章节常量池的定义,CONSTANT_String_info 用于表示 java.lang.String 类型的常量对象,格式如下:

    string长度限制,Java基础,java,开发语言

  • 其中,string_index 项的值必须是对常量池的有效索引,常量池在该索引处的项必须是 CONSTANT_Utf8_info 结构,表示一组 Unicode 码点序列,这组 Unicode 码点序列最终会被初始化为一个 String 对象
  • CONSTANT_Utf8_info 结构用于表示字符串常量的值:

    string长度限制,Java基础,java,开发语言

  • 其中,length则指明了bytes[]数组的长度,其类型为u2,通过翻阅《规范》,可以获悉
  • u2表示两个字节的无符号数,那么1个字节有8位,2个字节就有16位
  • 16位无符号数可表示的最大值位2^16 - 1 = 65535
  • 也就是说,Class文件中常量池的格式规定了,其字符串常量的长度不能超过65535
  • 那么尝试使用以下方式定义字符串:

    string长度限制,Java基础,java,开发语言

  • 尝试使用javac编译,同样会得到"错误: 常量字符串过长",那么原因是什么呢?
  • 其实,这个原因在javac的代码中是可以找到的,在Gen类中有如下代码:

    string长度限制,Java基础,java,开发语言

  • 代码中可以看出,当参数类型为String,并且长度大于等于65535的时候,就会导致编译失败
  • 这个地方可以尝试着debug一下javac的编译过程,也可以发现这个地方会报错
  • 如果尝试以65534个字符定义字符串,则会发现可以正常编译
  • 其实关于这个值,在《Java虚拟机规范》也有过说明:

    string长度限制,Java基础,java,开发语言

  • 运行期限制

  • 上面提到的这种String长度的限制是编译期的限制,也就是使用String s= "";
  • 这种字面值方式定义的时候才会有的限制
  • 那么,String在运行期有没有限制呢,答案是有的
  • String类中有很多重载的构造函数,其中有几个是支持用户传入length来执行长度的:

    string长度限制,Java基础,java,开发语言

  • 可以看到,这里面的参数length是使用int类型定义的,那么也就是说,String定义的时候,最大支持的长度就是int的最大范围值
  • 根据Integer类的定义,java.lang.Integer#MAX_VALUE 的最大值是2^31 - 1; 这个值约等于4G
  • 在运行期,如果String的长度超过这个范围,就可能会抛出异常
  • (在jdk 1.9之前)int 是一个 32 位变量类型,取正数部分来算的话,他们最长可以有

    string长度限制,Java基础,java,开发语言

  • 有近 4G 的容量
  • 可能会有疑惑,编译的时候最大长度都要求小于65535了,运行期怎么会出现大于65535的情况呢
  • 这其实很常见,如以下代码:

    string长度限制,Java基础,java,开发语言文章来源地址https://www.toymoban.com/news/detail-797510.html

  • 得到的字符串长度就有10万,另外在实际应用中遇到过这个问题
  • 一次系统对接,需要传输高清图片,约定的传输方式是对方将图片转成BASE64编码,接收到之后再转成图片
  • 在将BASE64编码后的内容赋值给字符串的时候就抛了异常
  • 后来为了解决这个问题,不再传输图片的BASE64编码内容了,而是先把文件上传到OSS或者FTP中,然后直接传递文件地址

到了这里,关于Java基础---String的长度限制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java开发中常见的String对象

    String对象加载场内存方式有两种,一种是直接使用“”号创建的加载内存时会会把该字符串直接加载到字符常量中去,并且后文中出现相同使用“”号定义的常量时不会再在内存中创建直接使用第一次创建的字符串,另一种直接使用构造器创建的会创建出一个新的字符串,

    2024年02月11日
    浏览(41)
  • java基础四-String/StringBuffer/StringBuilder区别

    String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。 StringBuffer 和

    2024年02月14日
    浏览(48)
  • 【JavaSE】Java基础语法(三十七):Java 中的 String 类(源码级别)

    String 表示 字符串类型,属于 引用数据类型 。Java 中 String 是 不可变 的。 在 Java 当中 双引号 括起来的字符串,是直接存储在“方法区”的“字符串常量池”当中的。 源码: 源码: 源码: 源码: 源码: 源码: 源码: 源码: https://blog.csdn.net/qq_44715943/article/details/116308837

    2024年02月06日
    浏览(49)
  • java基础Object转String的四种方式

    java中Object转String有以下几种方法: 1.object.toString()方法 这种方法要注意的是object不能为null,否则会报NullPointException,一般别用这种方法。 2.String.valueOf(object)方法 这种方法不必担心object为null的问题,若为null,会将其转换为”null”字符串,而不是null。这一点要特别注意。”

    2023年04月08日
    浏览(43)
  • Java基础09 —— 字符序列--String、StringBuilder、StringBuffer区别及其方法介绍

    字符与字符串 字符类型(char)是Java中的基本数据类型,占2个字节16位,默认值是 ‘u0000’ 。字符是用单引号引住的单个符号. 字符串(String)是用双引号引住的任意个字符,是引用数据类型,默认值是null 。字符串其实就是字符组成的序列 字符串声明 举例: 字符序列 多个字符

    2024年02月09日
    浏览(38)
  • Java String list 转 String[]

    太久没写这么基础的java代码了,直接调用(String[])indexs.toArray(),结果报错java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module jatrap\\\'),想了一下,记录免得下次又忘记了 直接使用 list.stream().toArray(String[]::new

    2024年02月15日
    浏览(47)
  • 【Java扫盲篇】String、String Buffer和String Builder的区别

    你在面试时,面试官让你讲讲 String String Buffer String Builde r的区别,你是否能流畅的、完整的叙述出他们三者的区别? 相同点: 他们的底层都是由char数组实现的。 不同点: String对象一旦创建,是不能修改的,如果要修改,会重新开辟空间来存储修改后的对象;而String Buffer和

    2024年04月22日
    浏览(38)
  • Java 字符串数组定义_「string数组」string 数组怎么定义

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 点击跳转浏览。 String arr[] = new String[10]; //创建一个长度为10的String 类型数组。 String arr[] = {“张三”,“李四”}; 这个是最常用的 String[] arr = new String[10];

    2024年02月15日
    浏览(51)
  • Java String、StringBuffer

    构造方法 通过字符数组构造,结果abc 通过字节数组构造,结果abc //把字符串转化为字节数组 当前代码编译环境为UTF-8,出现异常时,直接抛出异常即可。main+throws UnsupportedEncodingException 编译环境为UTF-8,但是运用gb2312这个编译环境重新编译,就出现了乱码,如图示。 常用方法

    2024年04月14日
    浏览(33)
  • 【JAVA】String类

    作者主页:paper jie_的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏

    2024年01月25日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包