我是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字符一样。

    10-06 12:56
    查看更多