String 类可以说是在 Java 中使用最频繁的类了,就算是刚刚接触 Java 的初学者也不会陌生,因为对于 Java 程序来说,main 方法就是使用一个 String 类型数组来作为参数的(String[] args)。

对于这样一个频繁使用的类,String 字符串可以有多长呢?十万字符?一百万字符?还是无限的呢?

要弄清楚 String 的最大长度,首先应该了解 String 类的内部实现。在 String 类中,是使用一个字符数组来维护字符序列的,其声明如下:

private final char value[];

这也就是说,String 的最大长度取决于字符数组的最大长度,我们知道,在指定数组长度的时候,可以使用 byte、short、char、int 类型,而不能够使用 long 类型。这也就是说,数组的最大长度就是 int 类型的最大值,即 0x7fffffff,十进制就是 2147483647,同理,这也就是 String 所能容纳的最大字符数量。

而且,我们来看下 java.lang.String#length() 源码:

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

可以看出获得 String 对象长度的 length 方法返回值是 int 类型的,而不是 long 类型的,也是因为这个原因。

不过,这个最大值只是在理论上能够达到的值,在我们实际的使用中,一般情况下获得的最大长度比理论值要小。下面我们写一个最简单的程序来看。

/*** @author wupx* @date 2020/01/13*/
public class StringTest {public static void main(String[] args) {char[] c = new char[Integer.MAX_VALUE];}
}

运行这个程序,在通常情况下,都会产生如下的错误:

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit at test.StringTest.main(StringTest.java:9)

产生这个错误的原因就是内存溢出,也就是系统无法分配这么大的内存空间所致。计算一下,一个 char 类型占用 2 字节,2147483647 个 char 类型就是 4294967294 字节,这接近于 4GB 大小,想要申请这么一大块连续的内存空间,失败也就不足为奇了。

那么,到底我们所用的计算机能够承受多大的字符数组呢,这跟软件与硬件等诸多因素都有关,我们可以编写程序来获得可申请最大字符数组的近似值。

/*** @author wupx* @date 2020/01/13*/
public class StringTest {public static void main(String[] args) {for (int i = 0; i < 100; i++) {int len = Integer.MAX_VALUE - i;try { char[] ch = new char[len];System.out.println("len: " + len + " OK");} catch (Error e) {System.out.println("len: " + len + " " + e);}}}
}

运行结果如下:

len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483645 OK
len: 2147483644 OK
len: 2147483643 OK

根据运行结果可以看出 String 的最大长度为 Integer.MAX_VALUE - 2 或 2 ^ 31 - 3。

总结

在 String 类内部,是使用一个字符数组(char[])来维护字符序列的。

String 的最大长度也就是字符数组的最大长度,理论上最大长度为 int 类型的最大值,即 2147483647。

在实际中,一般可获取的最大值小于理论最大值,在我的电脑上得出的最大值是 2 ^ 31 - 3,大家可以在自己的电脑上测试下。

String 字符串最长可以有多长?相关推荐

  1. Java的socket连接以及string字符串长度过长解决

    一.socket连接服务: 1.客户端:Java package cn.lw;import java.io.BufferedReader; import java.io.BufferedWriter; ...

  2. 查找两个字符串a,b中的最长公共子串

    查找两个字符串a,b中的最长公共子串 文章目录 查找两个字符串a,b中的最长公共子串 一.题目描述 二.代码 一.题目描述 题目描述: 查找两个字符串a,b中的最长公共子串.若有多个,输出在较短串中最 ...

  3. 数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划

    最长公共子序列 /*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 o ...

  4. 《好未来编程题》字符串中找出连续最长的数字串

    题目:读入一个字符串str,输出字符串str中的连续最长的数字串 输入描述: 个测试输入包含1个测试用例,一个字符串str,长度不超过255. 输出描述: 在一行内输出str中里连续最长的数字串. 示 ...

  5. java超长字符序列化_String 字符串最长可以有多长?

    Java技术栈 www.javastack.cn 打开网站看更多文章 String 类可以说是在 Java 中使用最频繁的类了,就算是刚刚接触 Java 的初学者也不会陌生,因为对于 Java 程序来 ...

  6. 【字符串问题】求一个字符串中重复出现的最长的子串

    2013-09-14 15:34:16 用后缀数组求一个字符串中重复出现的最长的子串. 用C++中的string类可以很方便地进行操作,需将后缀数组保存在vector<string>,如下 ...

  7. 华为机试HJ65:查找两个字符串a,b中的最长公共子串

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 查找两个字符串a,b中的最长公共子串.若有多个,输出在较短串中最先出现的那个. 注: ...

  8. Error,java对常量池来说字符串xxx的UTF8表示过长

    客户端这里自己模拟json数据时,一时没忍住搞得json字符串太长了(idea上大概有600多行吧),这个问题就蹦出来了.老方法直接google.百度然后看到一堆有关String 字符串常量池字符最大 ...

  9. HJ65 查找两个字符串a,b中的最长公共子串

    描述 查找两个字符串a,b中的最长公共子串.若有多个,输出在较短串中最先出现的那个. 注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串.请和"子序列"的概念分开 ...

最新文章

  1. HDU 6015 Skip the Class
  2. python标准库导入语句有哪些_如何将python标准库缺失的进行导入?
  3. 计算机二级web题目(5)--js(Javascript)基础
  4. java学习(58):私有内部类后访问
  5. android 模仿uc标签页,模仿UCweb菜单 - 白羽雕弓 - 博客园
  6. 将ini文件内容读出
  7. Tomcat文件配置
  8. iOS边练边学--(Quartz2D)图片裁剪,带圆环的裁剪
  9. 群晖3617可以有几个网卡_【群晖系统】黑群晖洗白13问~经典QA
  10. 解决速达软件提示将numeric转换为数据类型numeric时发生算术溢出错误问题
  11. 约瑟夫环(Data structure and algorithm -C language)—— #YU
  12. 论文中的MS流程01
  13. 众妙之门玄之又玄,游戏系统中的伪随机(Pseudo-Randomization)和真随机(True-Randomization)算法实现Python3
  14. 在线运行Java代码获取APNIC中国区的ip段,用作绕过国内ip
  15. 论文《Dialogue State Tracking with a Language Model using Schema-Driven Prompting》学习笔记
  16. CMDN创新应用:果库 - 帮助你发现喜欢的商品
  17. 2021年工业软件行业研究报告
  18. 低频RFID 底层编码
  19. 学物理赶不上计算机,高二上学期物理为何这么难?
  20. 初学python数字猜游戏_python初学者的猜数字游戏

热门文章

  1. Stanford UFLDL教程 自我学习
  2. 用GDB调试程序(四)
  3. OpenCV中BriefDescriptorExtractor
  4. 2019年10个最受欢迎的JavaScript动画库!
  5. OpenResty简介
  6. 使用ab(apachebench)进行压力测试
  7. Visual C++ 中的重大更改
  8. JS实现md5.js、md4.js、sha1.js 加密算法使用
  9. strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
  10. 两个整形变量,不用中间变量进行替换!