Java 中的字符串最大长度 - 调用 length() 方法

2022-08-31 07:12:50

Java中,对象可能具有的最大大小是多少,指的是方法调用?Stringlength()

我知道返回大小 a 作为一个length()Stringchar [];


答案 1

考虑到 String的长度方法返回一个,该方法返回的最大长度将是 Integer.MAX_VALUE,即(或大约 20 亿)。int2^31 - 1

关于数组的长度和索引,(例如,这可能是 s 的内部数据表示的实现方式),第 10 章:Java 语言规范的数组,Java SE 7 版说:char[]String

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

此外,索引必须按值进行,如第 10.4 节所述:int

数组必须按值编制索引;int

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

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


答案 2

java.io.DataInput.readUTF()并假设一个对象由两个字节的长度信息和字符串中每个字符的修改后的 UTF-8 表示形式表示。这样的结论是,当与 和 一起使用时,String 的长度受字符串的修改后的 UTF-8 表示形式的字节数的限制。java.io.DataOutput.writeUTF(String)StringDataInputDataOutput

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

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

您可以发现“长度”的大小是两个字节

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

编译时的最大长度最多为 65536。再次注意,长度是修改后的 UTF-8 表示形式的字节数,而不是对象中的字符数。String

String对象在运行时可能具有更多的字符。但是,如果要将对象与 和 接口一起使用,最好避免使用太长的对象。当我实现 和 的 Objective-C 等效项时,我发现了这个限制。StringDataInputDataOutputStringDataInput.readUTF()DataOutput.writeUTF(String)