Java字符串对象是否是Chars数组?

时间:2012-11-02 19:47:08

标签: java arrays string object chars

我是java的新手,并试图理解该语言的基本要素和基础知识。

是否准确地说Java字符串对象本质上是一个定义为不可变字符数组的类?

我问这个,因为我对char数组和字符串类的规范感到有点困惑......

JLS 10.9

  

10.9字符数组不是字符串   在Java编程语言中,与C不同,char数组不是String,   并且字符串和char数组都不会被'\ u0000'终止(NUL   字符)。   String对象是不可变的,也就是说,它的内容永远不会改变,而是一个数组   char有可变元素。   类String中的toCharArray方法返回包含的字符数组   与String相同的字符序列。 StringBuffer类实现有用   可变字符数组的方法。

JLS 4.3.3

  

4.3.3类String的类字符串实例表示Unicode代码点的序列。

1 个答案:

答案 0 :(得分:19)

  

是否准确地说Java字符串对象本质上是一个定义为不可变字符数组的类?

没有。 Java String对象(当前 - 它是我收集的实现细节可能正在改变)一个包含几个字段的类

  • 包含实际字符的char[]
  • 数组的起始索引
  • 长度
  • 缓存哈希码,懒惰计算

索引和长度的原因是几个字符串可以包含对同一char[]的引用。某些操作(例如substring)(在许多实现中,无论如何)都使用它。

重要的是String的API - 这与数组的API非常不同。当您考虑JLS定义时,这是您会想到的API:String表示一系列Unicode代码点。因此,您可以采用子序列(Substring),找到给定的子序列(indexOf),将其转换为大写序列等。

事实上,将JLS称为一系列UTF-16代码单元会更准确一些;完全可以构造一个不是有效 Unicode代码点序列的字符串,例如通过包括UTF-16代码单元的“替代对”的一半而不包括另一半。在代码单元方面,的API部分与String有关,但坦率地说大多数开发人员花费大多数处理字符串的时间就好像非BMP字符不存在一样。