我的编程空间,编程开发者的网络收藏夹
学习永远不晚

String最大长度是多少

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

String最大长度是多少

这篇文章将为大家详细讲解有关String最大长度是多少,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

前言

当你看到这个问题“String长度限制是多少”时是不是感觉很无聊?的确,这就是我第一眼看到时的感觉。

但当深入追踪该问题时,才发现String的长度限制本身的意义并不重要,重要的是在此过程中会将大量知识点串联起来,简直是一个完美的问题。难怪在高阶段的面试中会出现类似的问题。

带大家追寻String长度的限制,需要提醒读者的是,结论并不重要,重要的是分析的过程,以及涉及到的知识储备。比如,String的底层实现、int类型的范围、《Java虚拟机规范》、Java编译器源码实现等大量知识点。

String源码追踪

要看String类的长度限制,肯定要先从String的源码实现看起,这里就以目前使用最多的JDK8为例来进行说明。JDK9及以后String的底层实现有所变化,大家可参考《JDK9对String字符串的新一轮优化》一文。

我们都知道,String类提供了一个length方法,我们是否可以直接通过这个方法得知String的最大长度?

 public int length() {     return value.length; }

这里文档并没有说明最大长度是多少,但我们可以从返回的结果类型得知一些线索。结果类型为int,也就是说int的取值范围便是限制之一。

如果你知道int在正整数部分的取值范围为2^31 -1那很好,如果不知道,可以查看对应的包装类Integer:

public final class Integer extends Number implements Comparable<Integer> {          @Native public static final int   MIN_VALUE = 0x80000000;           @Native public static final int   MAX_VALUE = 0x7fffffff;     // ... }

无论MIN_VALUE和MAX_VALUE的值或注释都说明了int的取值范围。此时计算一下String的最大长度应该是:

2^31 - 1 = 2147483647

回到length方法,我们看到length的值是通过是value获得的,而value在JDK8中是以char数组实现的:

public final class String     implements java.io.Serializable, Comparable<String>, CharSequence {          private final char value[];     // ...    }

Java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节。所以,还需要从将上面计算的值乘以2。

此时的计算公式为:

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

也就是说最大字符串占用内存空间约等于4GB。但此时,如果你声明一个长度为10万的字符串,你会发现编译器会抛出异常,提示信息如下:

错误: 常量字符串过长

不是说好的21亿吗?怎么10万个就异常了呢?其实这个异常是由编译期的限制决定的。

字符串常量池的编译期限制

了解过JVM虚拟机的朋友肯定知道,当通过字面量进行字符串声明时,在编译之后会以常量的形式进入到Class常量池。

String s = "程序新视界";

而常量池对String的长度是有限制的。常量池中的每一种数据项都有自己的类型。Java中的UTF-8编码的Unicode字符串在常量池中以CONSTANT_Utf8类型表示。

在《Java虚拟机规范》中可以看到对String是通过CONSTANT_String_info来定义的。

String最大长度是多少

可以看到“string_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Utf8_info(&sect;4.4.7)结构”。

继续看对CONSTANT_Utf8_info的定义:

String最大长度是多少

length则指明了bytes[]数组的长度,类型为u2。同样是在《Java虚拟机规范》中可以找到对u2的定义:

String最大长度是多少

u2表示两个字节的无符号数,1个字节有8位,2个字节就有16位。因此,u2可表示的最大值为2^16 - 1= 65535。

到这里,已经得出了第二个限制,也就是Class文件中常量池的格式规定了,其字符串常量的长度不能超过65535。

此时,如果尝试通过字面量声明一个65535长度的字符串:

String s = "8888...8888";//其中有65535万个字符"8"

编译器还会抛出同样的异常。这又是为什么呢?

这个问题我们同样可以从《Java虚拟机规范》(4.7.3节)中找到答案:

String最大长度是多少

原来是为了弥补早期设计时的一个bug,“长度刚好65535个字节,且以1个字节长度的指令结束,这条指令不能被异常处理器处理”,因此就将数组的最大长度限制到了65534了。

如果你能够查看JVM中编译器部分的源码,可以在Gen类中看到对此限制的代码实现:

 private void checkStringConstant(DiagnosticPosition pos, Object constValue) {     if (nerrs != 0 || // only complain about a long string once         constValue == null ||         !(constValue instanceof String) ||         ((String)constValue).length() < Pool.MAX_STRING_LENGTH)         return;     log.error(pos, "limit.string");     nerrs++; }

其中Pool.MAX_STRING_LENGTH的定义如下:

public class Pool {     public static final int MAX_STRING_LENGTH = 0xFFFF;     //... }

再次尝试声明一个长度为65534的字符串,会发现可以正常编译了。此时,可以得出结论,在编译期字符串的最大长度为65534。

我们知道,Java是区分编译期和运行期的,那么在运行期是否有长度限制呢?

运行期的长度限制

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

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

其中参数count就是字符串的最大长度。此时的计算与前面的算法一致,这里先转换为bit,然后再转换为GB:

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

也就是说,运行时理论上可以支持4GB大小的字符串,超过这个限制就会抛出异常的。JDK9对String的存储进行了优化,底层使用byte数组替代了char数组,对于纯Latin1字符来说可以节省一半的空间。

当然,这个4GB的限制是基于JVM能够分配这么多可用的内存的前提下的。

小结

通过上述的分析,可以得出结论:第一,在编译期字符串的长度不能超过65534;第二,在运行期,字符串的长度不能超过2^31-1,占用内存(4GB)不能超过虚拟机所分配的最大内存。

关于String最大长度是多少就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

String最大长度是多少

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle中varchar最大长度是多少

oracle 中varchar的最大长度取决于oracle版本和数据库字符集:oracle 11g和更早版本为4000字节,oracle 12c及更高版本为32767字节。单字节字符集(如ascii)的最大长度为4000个字符,多字节字符集
oracle中varchar最大长度是多少
2024-05-08

Java中Arraylist的最大长度是多少

这篇文章主要介绍了Java中Arraylist的最大长度是多少,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Arraylist的最大长度Arraylist的MAX_ARRAY
2023-06-29

oracle中nvarchar2的最大长度是多少

在Oracle数据库中,NVARCHAR2数据类型用于存储Unicode字符集的可变长度字符串。NVARCHAR2数据类型的最大长度取决于数据库版本和配置。一般来说,对于Oracle 12c及更高版本,NVARCHAR2数据类型的最大长度
oracle中nvarchar2的最大长度是多少
2024-04-09

MySQL中每种类型标识符的最大长度是多少?

众所周知,MySQL 中的某些对象被称为标识符。这些对象包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间等。标识符使用 Unicode (UTF-8) 存储。每种类型标识符的最大长度如下表所示:Sr.编号标识符最大长度(字符)1
2023-10-22

PHP 函数命名的最佳长度是多少?

php 函数的最佳命名长度约为 10-30 个字符,具体取决于复杂性和目的。短函数名便于记忆和输入,但可能模糊不清。长函数名提高可读性,但可能笨重且难以记住。命名约定包括使用动词或动名词、使用小写和大写字母区分单词,避免使用缩写和技术性命名
PHP 函数命名的最佳长度是多少?
2024-04-19

java int的长度是多少

int:int 数据类型是32位、有符号的以二进制补码表示的整数; (推荐学习:java课程)最小值是 -2,147,483,648(-2^31);最大值是 2,147,483,647(2^31 - 1);一般地整型变量默认为 int 类型;
java int的长度是多少
2016-10-23

oracle中number的长度是多少

oracle number 数据类型的最大长度为 38 位,包含小数点和小数位:38 位整数部分和 128 位小数部分。精度是指小数点后可存储的数字位数,范围从 0 到 128 不等。选择适当的长度时,需考虑数据范围、精度要求和存储空间。O
oracle中number的长度是多少
2024-05-03

java int长度多少

java int长度多少int的取值范围为: -2^31——2^31-1,即-2147483648——2147483647。1、对于正数来说,它的补码就是它本身。2、对于负数来说,它的补码是它对应的正数的二进数所有位取反之后加一。3、由负数的补码求原码也是相同
java int长度多少
2017-07-04

mysql中int(5)的长度是多少

这篇文章主要介绍“mysql中int(5)的长度是多少”,在日常操作中,相信很多人在mysql中int(5)的长度是多少问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql中int(5)的长度是多少”的疑
2023-07-06

电脑最佳温度是多少度

最佳温度取决于电脑的使用环境和硬件要求。一般来说,大多数电脑的最佳工作温度范围在 20°C 到 25°C 之间。如果温度超过这个范围,电脑可能会出现性能下降、硬件故障或运行不稳定的问题。因此,为了保持电脑的正常运行,应该确保电脑周围的环境温
2023-08-31

MySQL VARCHAR 最大大小是多少?

MySQL版本5.0.3之前能够存储255个字符,但从版本5.0.3开始,能够存储65,535个字符。MySQL官方文档指出:MySQL 5.0.3及更高版本中VARCHAR的有效最大长度取决于最大行大小(65,535字节,这是所有列共享的
2023-10-22

PHP数组长度限制是多少?

PHP中数组的长度并没有固定的限制,它可以根据系统的内存大小来动态调整。在PHP中,数组是一种非常灵活的数据结构,可以存储任意数量的元素,每个元素可以是任意类型的值,甚至可以是另一个数组。PHP数组的长度限制主要取决于系统的内存大小和PH
PHP数组长度限制是多少?
2024-03-13

sql中varchar默认长度是多少

sql 中 varchar 数据类型的默认长度因 dbms 而异,通常为:mysql:255 个字符postgresql:255 个字符microsoft sql server:1 个字符(必须显式指定)oracle:2000 个字符(如果
sql中varchar默认长度是多少
2024-05-02

mysql最大连接数是多少

mysql最大连接数是151。mysql数据库最大连接数是指在同一时间内可以与 mysql数据库建立的最大连接数,这个数字对于高流量的Web应用程序和大型企业应用程序至关重要,如果超过了最大连接数,那么新的连接将无法建立,从而导致应用程序崩
2023-07-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录