问题

InJava,aString对象可能具有的最大大小是什么,请参考length()方法调用?

我知道那个length()的大小是aString的achar [];


#1 热门回答(148 赞)

考虑到Stringclass'length方法返回anint,该方法返回的最大长度为Integer.MAX_VALUE,即2^31 - 1(或大约20亿)。

就数组的长度和索引而言(例如char[],这可能是为Strings实现内部数据表示的方式),Chapter 10: ArraysofThe Java Language Specification, Java SE 7 Edition表示如下:

数组中包含的变量没有名称;相反,它们由使用非负整数索引值的数组访问表达式引用。这些变量称为数组的组件。如果一个数组有n个组件,我们说n是数组的长度;使用从0到n-1(包括0和n-1)的整数索引来引用数组的组件。

此外,索引必须是int值,如Section 10.4中所述:

数组必须用int值索引;

因此,似乎限制确实是2^31 - 1,因为这是非负int值的最大值。

但是,可能会有其他限制,例如数组的最大可分配大小。


#2 热门回答(19 赞)

java.io.DataInput.readUTF()java.io.DataOutput.writeUTF(String)表示aString对象由两个字节的长度信息和字符串中每个字符的modified UTF-8表示。这得出结论,当与DataInputDataOutput一起使用时,String的长度受字符串的修改的UTF-8表示的字节数限制。

另外,Java虚拟机规范中的CONSTANT_Utf8_info规范定义了如下结构。

CONSTANT_Utf8_info {
    u1 tag;
    u2 length;
    u1 bytes[length];
}

你可以发现'length'的大小是两个字节

某种方法(例如,String.length())的返回类型是int并不总是意味着其允许的最大值是Integer.MAX_VALUE。相反,在大多数情况下,仅出于性能原因选择int。 Java语言规范说大小小于int的整数在计算之前转换为int(如果我的记忆正确地为我服务),并且在没有特殊原因的情况下选择2665691403是一个原因。

编译时的最大长度最多为65536.再次注意,长度是modified UTF-8表示的字节数,而不是aString对象中的字符数。

Stringobjects可能在运行时可以拥有更多字符。但是,如果要使用带有DataInputDataOutput接口的String对象,最好避免使用太长的时间4111726664对象。当我实现Objective-C等价物DataInput.readUTF()DataOutput.writeUTF(String)时,我发现了这个限制。


#3 热门回答(18 赞)

由于数组必须用整数索引,因此数组的最大长度为Integer.MAX_INT(231-1或2 147 483 647)。假设你有足够的内存来容纳那个大小的数组,当然。


原文链接