String 字符串最长可以有多长?
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 字符串最长可以有多长?相关推荐
- Java的socket连接以及string字符串长度过长解决
一.socket连接服务: 1.客户端:Java package cn.lw;import java.io.BufferedReader; import java.io.BufferedWriter; ...
- 查找两个字符串a,b中的最长公共子串
查找两个字符串a,b中的最长公共子串 文章目录 查找两个字符串a,b中的最长公共子串 一.题目描述 二.代码 一.题目描述 题目描述: 查找两个字符串a,b中的最长公共子串.若有多个,输出在较短串中最 ...
- 数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划
最长公共子序列 /*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 o ...
- 《好未来编程题》字符串中找出连续最长的数字串
题目:读入一个字符串str,输出字符串str中的连续最长的数字串 输入描述: 个测试输入包含1个测试用例,一个字符串str,长度不超过255. 输出描述: 在一行内输出str中里连续最长的数字串. 示 ...
- java超长字符序列化_String 字符串最长可以有多长?
Java技术栈 www.javastack.cn 打开网站看更多文章 String 类可以说是在 Java 中使用最频繁的类了,就算是刚刚接触 Java 的初学者也不会陌生,因为对于 Java 程序来 ...
- 【字符串问题】求一个字符串中重复出现的最长的子串
2013-09-14 15:34:16 用后缀数组求一个字符串中重复出现的最长的子串. 用C++中的string类可以很方便地进行操作,需将后缀数组保存在vector<string>,如下 ...
- 华为机试HJ65:查找两个字符串a,b中的最长公共子串
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 查找两个字符串a,b中的最长公共子串.若有多个,输出在较短串中最先出现的那个. 注: ...
- Error,java对常量池来说字符串xxx的UTF8表示过长
客户端这里自己模拟json数据时,一时没忍住搞得json字符串太长了(idea上大概有600多行吧),这个问题就蹦出来了.老方法直接google.百度然后看到一堆有关String 字符串常量池字符最大 ...
- HJ65 查找两个字符串a,b中的最长公共子串
描述 查找两个字符串a,b中的最长公共子串.若有多个,输出在较短串中最先出现的那个. 注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串.请和"子序列"的概念分开 ...
最新文章
- HDU 6015 Skip the Class
- python标准库导入语句有哪些_如何将python标准库缺失的进行导入?
- 计算机二级web题目(5)--js(Javascript)基础
- java学习(58):私有内部类后访问
- android 模仿uc标签页,模仿UCweb菜单 - 白羽雕弓 - 博客园
- 将ini文件内容读出
- Tomcat文件配置
- iOS边练边学--(Quartz2D)图片裁剪,带圆环的裁剪
- 群晖3617可以有几个网卡_【群晖系统】黑群晖洗白13问~经典QA
- 解决速达软件提示将numeric转换为数据类型numeric时发生算术溢出错误问题
- 约瑟夫环(Data structure and algorithm -C language)—— #YU
- 论文中的MS流程01
- 众妙之门玄之又玄,游戏系统中的伪随机(Pseudo-Randomization)和真随机(True-Randomization)算法实现Python3
- 在线运行Java代码获取APNIC中国区的ip段,用作绕过国内ip
- 论文《Dialogue State Tracking with a Language Model using Schema-Driven Prompting》学习笔记
- CMDN创新应用:果库 - 帮助你发现喜欢的商品
- 2021年工业软件行业研究报告
- 低频RFID 底层编码
- 学物理赶不上计算机,高二上学期物理为何这么难?
- 初学python数字猜游戏_python初学者的猜数字游戏