java超长字符序列化_String 字符串最长可以有多长?
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 字符串最长可以有多长?相关推荐
- c语言中大写英文字母所占字节,Java中字符编码和字符串所占字节数 .
首 先,java中的一个char是2个字节.java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~12 ...
- java中字符数组和字符串的相互转换
Java中String类很强大,好好学习它,对初学者很重要. 字符串和字符数组的转换是很常见的,请看下面代码. [java] view plaincopy char[] a={ 'a ', 'b ...
- Java中字符数组转换为字符串
java可以使用两种方法直接将字符数组转为字符串 方法1:直接在构造String时转换. char[] data = {'a', 'b', 'c'}; String str = new String( ...
- Error,java对常量池来说字符串xxx的UTF8表示过长
客户端这里自己模拟json数据时,一时没忍住搞得json字符串太长了(idea上大概有600多行吧),这个问题就蹦出来了.老方法直接google.百度然后看到一堆有关String 字符串常量池字符最大 ...
- java多行字符串常量,【转】Error,java对常量池来说字符串xxx的UTF8表示过长的解决及其理解...
做项目,客户端这里自己模拟json数据时,一时没忍住搞得json字符串太长了(idea上大概有600多行吧),这个问题就蹦出来了.老方法直接google.百度然后看到一堆有关String 字符串常量池 ...
- java的字符定义_Java字符串定义及常用方法
String.StringBuffer和StringBuilder String修饰的是不可变的字符串,而StringBuffer和StringBuilder类的对象是可以被修改的. StringBu ...
- JAVA 中文字符转为拼音字符串
项目上偶尔要用到关于中文字符串转换为拼音字符串的功能,pinyin4j.jar这个包可以提供相关的功能,非常方便,首先要在maven中pom.xml添加依赖项,如果不用maven,那直接下载对应的ja ...
- java提取字符从mysql_MySQL 字符串截取SUBSTRING()函数
MySQL 字符串截取相关函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例: select left(content,200) as ab ...
- Java中字符数组与字符串的转换方法
1.字符串转字符数组 String myString = "hello123"; //创建一个字符串变量myStringchar[] myCharArray; //创建一个字符数组 ...
最新文章
- 一文了解机器学习中的交叉熵
- java jsp 脚本 声明 表达式 简介
- 【Flutter】Flutter 拍照示例 ( Flutter 插件配置 | Flutter 插件源码示例 | iOS 应用配置 | Android 应用配置 )
- vue全局组件与局部组件
- 十八、深入Java 访问修饰符和非访问修饰符
- 网上一个仿TP挂钩内核的源码
- codeforces1167 E. Range Deleting(双指针)
- mysql 替代like_mysql用instr替代like查询
- Nginx反向代理及负载均衡
- 一段话系列-正则基础
- 爬虫python入门_如何入门Python爬虫?爬虫原理及过程详解
- java内存不足错误_调试Java内存不足错误
- linux man命令原理,Linux命令之man详解
- 服务器系统无法共享打印机驱动程序,windows-server-2003 – windows服务器共享打印机,为什么本地机器需要驱动程序?...
- 转载:Oracle导入导出命令的使用
- python人工智能-图像识别
- NTSD命令用法详解
- C++Builder的基本功能
- 【VUE项目实战】40、添加商品分类功能(一)
- Centos6连接网络配置
热门文章
- 拥抱.NET Core系列:MemoryCache 缓存选项
- 使用Mono将C#编译运行至WebAssembly平台
- .NetCore之下载文件
- .NET Core项目部署到linux(Centos7)
- 开箱即用 - jwt 无状态分布式授权
- 【计算机图形学】实验:C#语言采用GDI+定义笔刷并填充图形完整实验操作流程
- TCP/IP模型的各层的作用
- Android 之View绘图原理总结
- Android之CheckBox复选框控件使用inelayout.xml Xml代码
- 【必懂C++】第一个程序当然是HelloWorld呀 01