作为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 版权协议,转载请附上原文出处链接和本声明。