Java技术栈

www.javastack.cn

打开网站看更多文章

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,大家可以在自己的电脑上测试下。

最近热文:

扫码关注

Java技术栈

公众号干货。

点击「阅读原文」带你飞~

java超长字符序列化_String 字符串最长可以有多长?相关推荐

  1. c语言中大写英文字母所占字节,Java中字符编码和字符串所占字节数 .

    首 先,java中的一个char是2个字节.java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~12 ...

  2. java中字符数组和字符串的相互转换

    Java中String类很强大,好好学习它,对初学者很重要. 字符串和字符数组的转换是很常见的,请看下面代码. [java] view plaincopy char[]   a={ 'a ', 'b  ...

  3. Java中字符数组转换为字符串

    java可以使用两种方法直接将字符数组转为字符串 方法1:直接在构造String时转换. char[] data = {'a', 'b', 'c'}; String str = new String( ...

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

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

  5. java多行字符串常量,【转】Error,java对常量池来说字符串xxx的UTF8表示过长的解决及其理解...

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

  6. java的字符定义_Java字符串定义及常用方法

    String.StringBuffer和StringBuilder String修饰的是不可变的字符串,而StringBuffer和StringBuilder类的对象是可以被修改的. StringBu ...

  7. JAVA 中文字符转为拼音字符串

    项目上偶尔要用到关于中文字符串转换为拼音字符串的功能,pinyin4j.jar这个包可以提供相关的功能,非常方便,首先要在maven中pom.xml添加依赖项,如果不用maven,那直接下载对应的ja ...

  8. java提取字符从mysql_MySQL 字符串截取SUBSTRING()函数

    MySQL 字符串截取相关函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例: select left(content,200) as ab ...

  9. Java中字符数组与字符串的转换方法

    1.字符串转字符数组 String myString = "hello123"; //创建一个字符串变量myStringchar[] myCharArray; //创建一个字符数组 ...

最新文章

  1. 一文了解机器学习中的交叉熵
  2. java jsp 脚本 声明 表达式 简介
  3. 【Flutter】Flutter 拍照示例 ( Flutter 插件配置 | Flutter 插件源码示例 | iOS 应用配置 | Android 应用配置 )
  4. vue全局组件与局部组件
  5. 十八、深入Java 访问修饰符和非访问修饰符
  6. 网上一个仿TP挂钩内核的源码
  7. codeforces1167 E. Range Deleting(双指针)
  8. mysql 替代like_mysql用instr替代like查询
  9. Nginx反向代理及负载均衡
  10. 一段话系列-正则基础
  11. 爬虫python入门_如何入门Python爬虫?爬虫原理及过程详解
  12. java内存不足错误_调试Java内存不足错误
  13. linux man命令原理,Linux命令之man详解
  14. 服务器系统无法共享打印机驱动程序,windows-server-2003 – windows服务器共享打印机,为什么本地机器需要驱动程序?...
  15. 转载:Oracle导入导出命令的使用
  16. python人工智能-图像识别
  17. NTSD命令用法详解
  18. C++Builder的基本功能
  19. 【VUE项目实战】40、添加商品分类功能(一)
  20. Centos6连接网络配置

热门文章

  1. 拥抱.NET Core系列:MemoryCache 缓存选项
  2. 使用Mono将C#编译运行至WebAssembly平台
  3. .NetCore之下载文件
  4. .NET Core项目部署到linux(Centos7)
  5. 开箱即用 - jwt 无状态分布式授权
  6. 【计算机图形学】实验:C#语言采用GDI+定义笔刷并填充图形完整实验操作流程
  7. TCP/IP模型的各层的作用
  8. Android 之View绘图原理总结
  9. Android之CheckBox复选框控件使用inelayout.xml Xml代码
  10. 【必懂C++】第一个程序当然是HelloWorld呀 01