我是Java的新手,试图理解该语言的本质和基础。
是否正确声明Java字符串对象本质上是一个定义为chars不变数组的类?
我问这个问题是因为与char数组和字符串类相比,我对规范有点困惑...
JLS 10.9
JLS 4.3.3
最佳答案
否。JavaString对象是(当前-这是我可能正在更改的实现细节)一个包含一些字段的类:
char[]
索引和长度的原因是几个字符串可以包含对相同
char[]
的引用。某些操作(例如substring
)使用了它(无论如何,在许多实现中)。重要的是
String
的API-与数组的API完全不同。当您考虑JLS定义时,就会想到该API:String
代表一系列Unicode代码点。因此,您可以获取一个子序列(Substring
),找到一个给定的子序列(indexOf
),将其转换为大写序列等。实际上,JLS将其称为UTF-16代码单元序列会稍微准确一些;完全有可能构造一个不是Unicode代码点的有效序列的字符串,例如通过包括UTF-16代码单元的“代理对”的一半而不是另一半。 API的某些部分确实以代码单位来处理
String
,但是坦率地说,大多数开发人员都将大部分时间都花在对待字符串上,就好像不存在非BMP字符一样。