Java随笔-String有多长?

  • Post author:
  • Post category:java




作为Java中最常用的数据类型之一,通常认为只要内存够用,String要多长就有多长,其实不然,String的实际长度是有限制。本文根据String的两种使用方式探究String的长度。



字面量

基本类型变量赋值的方式就叫做字面量或者字面值,也就是不需要使用new关键字创建。

     String largeString = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

直接赋值的字面量常量通常会被放入常量池中。

请添加图片描述

执行javac编译时会Gen.java检查一下String的长度。

    /** Max number of char in a string constant. */
    public static final int MAX_STRING_LENGTH = 0xFFFF;
    ...
    /** Check a constant value and report if it is a string that is
     *  too large.
     */
    private void checkStringConstant(DiagnosticPosition pos, Object constValue) {
        if (nerrs != 0 || // only complain about a long string once
            constValue == null ||
            !(constValue instanceof String) ||
            ((String)constValue).length() < PoolWriter.MAX_STRING_LENGTH)
            return;
        log.error(pos, Errors.LimitString);
        nerrs++;
    }

当String长度小于0xFFFF也就是65535时,检查通过,否则会提示“constant string too long”,也就是字符串长度大于等于65535字节时,会提示字符串太长。而且CONSTANT_Utf8_info型常量的最大长度是是65535 – 1 = 65534个字节,若是中文字符,长度为65535 / 3字节。如果运行时方法区设置的比较小,实际长度可能达不到理论字节。



new对象

使用new创建String对象。

     String largeString = new String("xxxxxxxxxxx");

字符串不属于基本数据类型,String是一个对象,默认值为null。以JDK16为例。

在这里插入图片描述

实际上使用new创建的String对象就相当于char[ ],此时存储的是字符。

The String class represents character strings. All string literals in Java programs, such as "abc",
are implemented as instances of this class.Strings are constant; their values cannot be changed after 
they are created. String buffers support mutable strings. Because String objects are immutable they 
can be shared. For example:

       String str = "abc";
       
is equivalent to:
       char data[] = {'a', 'b', 'c'};
       String str = new String(data);

使用new创建的对象会被放置在堆中,堆的内存要比栈的内存要大,垃圾回收也主要回收堆里面的内容。

在这里插入图片描述

使用数组存储,默认长度为Integer.MAX_VALUE,也就是2

31

– 1。

    /**
     * A constant holding the maximum value an {@code int} can
     * have, 2<sup>31</sup>-1.
     */
    @Native public static final int   MAX_VALUE = 0x7fffffff;

使用new创建的String,理论长度最长2

31

– 1个字符,实际长度受虚拟机和堆内存的大小限制。



版权声明:本文为qq_34202054原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。