美文网首页
Java基础-String可以多长

Java基础-String可以多长

作者: 杨0612 | 来源:发表于2020-08-27 15:39 被阅读0次

    主要分编译期和运行期。
    1.编译期

    String data="aaa";
    

    这样定义的字符串在编译期就已经确定了,aaa字符串存放在方法区的常量池。
    代码编译成字节码以后,String的数据结构是CONSTANT_Utf8_info表示,

    CONSTANT_Utf8_info {  
       u1 tag;  
       u2 length;  
       u1 bytes[length];  
    }
    u1 bytes[length],表示存放字符的byte数组;
    u2 length,表示byte数组的长度,u2表示2个字节16位,能表示最大的值是65535(为什么不是65536?)
    ######那么是不是编译期,一个String字符串可以存放65535个字节长度的字符呢?
    实现证明,只能存放65534个字节长度的字符,不能超过65535个。
    ######为什么不是65535个呢?
    看到有的帖子说,是因为虚拟机bug,在判断长度时候,是小于65535而不是小于等于65535。
    ######英文字符可以存多少个呢?
    一个英文字符占一个字节,那么就可以存放65534个字符。
    ######中文字符可以存多少个呢?
    如果是UTF-8编码,一个中文字符占3个字节,那么则是65535/3个。
    这里为什么不是65534/3呢,是因为虚拟机在做判断的时候,如果大于65535/3则抛异常。
    ######中英字符混合可以存多少个呢?
    那就是不超过65535个字节。
    2.运行期
    

    String data=new String();

    这样定义的String是存放在堆中。
    从构造函数可以看出,String背后是用char数组实现的,数组的最大长度是Integer.MAX_VALUE,那么可以存放字符理论最大长度就是Integer.MAX_VALUE。
    

    public String(byte[] data, int high, int offset, int byteCount) {
    if ((offset | byteCount) < 0 || byteCount > data.length - offset) {
    throw failedBoundsCheck(data.length, offset, byteCount);
    }
    this.offset = 0;
    this.value = new char[byteCount];//用char数组实现的
    this.count = byteCount;
    high <<= 8;
    for (int i = 0; i < count; i++) {
    value[i] = (char) (high + (data[offset++] & 0xff));
    }
    }

    
    以上分析有不对的地方,请指出,互相学习,谢谢哦!
    

    相关文章

      网友评论

          本文标题:Java基础-String可以多长

          本文链接:https://www.haomeiwen.com/subject/xubcsktx.html