问题
InJava,aString
对象可能具有的最大大小是什么,请参考length()
方法调用?
我知道那个length()
的大小是aString
的achar []
;
#1 热门回答(148 赞)
考虑到String
class'length
方法返回anint
,该方法返回的最大长度为Integer.MAX_VALUE
,即2^31 - 1
(或大约20亿)。
就数组的长度和索引而言(例如char[]
,这可能是为String
s实现内部数据表示的方式),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表示。这得出结论,当与DataInput
和DataOutput
一起使用时,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
对象中的字符数。
String
objects可能在运行时可以拥有更多字符。但是,如果要使用带有DataInput
和DataOutput
接口的String
对象,最好避免使用太长的时间4111726664对象。当我实现Objective-C等价物DataInput.readUTF()
和DataOutput.writeUTF(String)
时,我发现了这个限制。
#3 热门回答(18 赞)
由于数组必须用整数索引,因此数组的最大长度为Integer.MAX_INT
(231-1或2 147 483 647)。假设你有足够的内存来容纳那个大小的数组,当然。