是Java String对象字符数组?(Are Java String Objects an Arr

2019-08-02 05:49发布

我是新来的Java,并试图理解语言的本质和基本原理。

它是准确的声明,Java字符串对象本质定义为字符的不可变的数组类?

我问这个,因为我是一个有点规范比较困惑字符数组和字符串类...

JLS 10.9

10.9字符数组不是字符串在Java编程语言中,不同于C,字符数组是不是字符串,并且既不是字符串,也不字符数组被“\ u0000的”(NUL字符)终止。 String对象是不可变的,即,其内容不能改变的,而字符数组具有可变的元件。 类的字符串的方法toCharArray返回包含相同的字符序列为字符串的字符数组。 类的StringBuffer实现上的字符的可变阵列有用的方法。

JLS 4.3.3

4.3.3类字符串的类字符串实例表示的Unicode码位序列。

Answer 1:

它是准确的声明,Java字符串对象本质定义为字符的不可变的数组类?

第一个Java String对象(目前是-这是一个实现细节,我收集可能会改变) 包含几个字段类:

  • char[]包含实际字符
  • 的起始索引到阵列
  • 长度
  • 甲缓存哈希码,懒惰地计算

的原因索引和长度是几个字符串可以包含到相同的参考char[] 这是通过一些操作,例如使用substring (在许多实施方案中,反正)。

最重要的是在API String ,虽然-这是一个数组的API有很大不同。 这是你会觉得,当你把JLS定义考虑的API:一个String表示的Unicode代码点的序列。 所以,你可以拿一个子( Substring ),找到一个给定的序列( indexOf ),将其转换为大写的序列等。

事实上,JLS将稍微更准确称之为的UTF-16编码单元的序列; 完全有可能构造一个字符串,它不是Unicode代码点的有效序列,例如,通过包括二分之一的UTF-16代码单元的“代理对”的,但不是其他。 有哪个处理API的部分String中的代码单元方面,但坦率地说大多数开发人员花费大量的时间处理字符串,就好像不存在非BMP字符。



文章来源: Are Java String Objects an Array of Chars?