Java成神之路——String长度限制

字符串还有长度限制?是的没错。
先看简单的情况。

// 并不是显示的在类中new,请看后面注意
String str = new String("str");

如果通过new的方法来创建String,可以通过String的另一个构造方法得出,长度的限制是Integer.MAX_VALUE

public String(char value[], int offset, int count) 

给出偏移位置,与截取长度,通过char数组创建字符串。

开始正文

更常用的创建字符串的方式一般是这样的。

String str = "str";

本文的重点,也就是讲述这种创建方式长度限制。

java类文件结构

根据Java虚拟机规范:Class文件格式采用一种类似C语言结构体的为伪结构存储数据,这种伪结构中只有两种数据类型:无符号数,后面的解析都要以这两种数据结构为基础。

无符号数属于基本数据类型,以u1,u2,u4,u8来分别代表1个字节,2个字节,4个字节和8个字节的无符号数,无符号数可以用来描述数字,索引引用、数量值、或者按照UTF-8编码构成的字符串。

表是有多个无符号数或者其他表作为数据项结构的符合数据结构。

(摘自深入理解java虚拟机)

常量池

如果直接通过双引号的方式创建字符串,编译的时候会给常量池里放一份,常量池中有14种记录常量的数据结构,有一种用来记录字符串 CONSTANT_Utf8_info。字符串长度受CONSTANT_Utf8_info类型的限制。

CONSTANT_Utf8_info结构

类型名称数量
u1tag1
u2length1
u1byteslength

tag 用来表示常量池数据类型,u2,用来表示UTF-8编码表示的字符串长度。后面紧接着就是 length长度连续数据表示具体的字符串。

结论

u2 类型占两个字节,表示长度限制为 65536。 而实际上,字符串的长度限制为65534个而java class 文件是使用一种变体UTF-8格式来存放字符的,null值使用两个字节来表示,因此只剩下 65536- 2 = 65534个字节。

注意
// 65535个a,显示的在类中创建,""中的内容也会放到常量值
String str = new String("aaa...aaa");

运行期间,创建的字符串长度不受限制。

    public static void main(String[] args) {
        String str = "";
        for (int i = 0; i < 65535; i++) {
            str += "aa";
        }
        String name = new String(str);
        System.out.println(name.length());
    }
  咸鱼IT技术交流群:89248062,在这里有一群和你一样有爱、有追求、会生活的朋友! 大家在一起互相支持,共同陪伴,让自己每天都活在丰盛和喜乐中!同时还有庞大的小伙伴团体,在你遇到困扰时给予你及时的帮助,让你从自己的坑洞中快速爬出来,元气满满地重新投入到生活中!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值