String 最大长度 及 String Pool


我们可以使用串接操作符得到一个长度更长的字符串,那么,String 对象最多能容纳多少字符呢?查看String的源代码我们可以得知类String中是使用域 count 来记录对象字符的数量,而count 的类型为 int,因此,我们 可以推测最长的长度为 2^32,也就是4G。

不过,我们在编写源代码的时候,如果使用 Sting str = "aaaa";的形式定义一个字符串,那么双引号里面的ASCII 字符最多只能有 65534 个。为什么呢?因为在class文件的规范中, CONSTANT_Utf8_info 表中使用一个16 位的无符号整数来记录字符串的长度的,最多能表示 65536 个字节,而java class 文件是使用一种变体UTF-8格式来存放字符的,null 值使用两个字节来表示,因此只剩下 65536- 2 = 65534个字节。也正是变体UTF-8 的原因,如果字符串中含有中文等非ASCII 字符,那么双引号中字符的数量会更少(一个中文字符占用三个字节)。如果超出这个数量,在编译的时候编译器会报错。


严格来说,String确实有长度限制。
String内部使用一个char[]数组来存放字符串的内容,数组下标是整型(也可以参考String的构造方法String(char value[], int offset, int count) ,可以知道字符数量是用整型表示),整型(Java规定32位)表示范围是2G,也就是说,Java数组最大的长度是2G,即字符串不能超过2G个字符。
Java的数组大小还有没有别的限制?事实上数组大小不能超过Java堆的大小,而Java堆的最大尺寸可以通过启动参数指定,如果Java堆开得足够大,数组的最大长度是可以不断增大的。
所以,理论上,字符串不能超过2G个字符,少于2G个字符都有可能。
但编码时有需要注意的地方,采用明文的方式,如果超过65534个字节,可能报编译错误


32768  某人测过的

-------------------------------------------------------------------------------------

1.String pool位于JVM Runtime area中Method Area下得constant pool中。

2.所有的字符串(指的是双引号的string literal ,非new 的String Object)都置于String pool中,包括编译时的,和运行时生成的。

     编译时的,比如: String x = "abc";  String y = new String("xyz"); ,则涉及的“abc” "xyz"都将置于CLASS文件的constant pool,待JVM 加载CLASS后,则置于string pool.

   运行时期的。比如:Random random = new Random();

                                 String y = random.nextInt()+""; 则y指向的一个字符串最终位于String pool中,而不是堆中。

3.String 的intern方法说,会查看String pool中,有没有内容相同的,有就返回String pool中得对象,没有则将该String 对象加入到String pool中,疑问是,什么情况下,某个String 对象会在String pool中没有呢?因为上述2中的两种情况,都会在String pool中有一个字符串常量。真相是什么呢?

本人通过JAVAP命令发现,如果你使用了

         char data[] = {'a', 'b', 'c'};
         String str = new String(data);

构建了一个String 对象,则在Strint pool中是没有的对应的字符串的。


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值