我是新来的Java,并试图理解语言的本质和基本原理。
它是准确的声明,Java字符串对象本质定义为字符的不可变的数组类?
我问这个,因为我是一个有点规范比较困惑字符数组和字符串类...
JLS 10.9
10.9字符数组不是字符串在Java编程语言中,不同于C,字符数组是不是字符串,并且既不是字符串,也不字符数组被“\ u0000的”(NUL字符)终止。 String对象是不可变的,即,其内容不能改变的,而字符数组具有可变的元件。 类的字符串的方法toCharArray返回包含相同的字符序列为字符串的字符数组。 类的StringBuffer实现上的字符的可变阵列有用的方法。
JLS 4.3.3
4.3.3类字符串的类字符串实例表示的Unicode码位序列。
它是准确的声明,Java字符串对象本质定义为字符的不可变的数组类?
第一个Java String对象(目前是-这是一个实现细节,我收集可能会改变) 包含几个字段类:
- 甲
char[]
包含实际字符 - 的起始索引到阵列
- 长度
- 甲缓存哈希码,懒惰地计算
的原因索引和长度是几个字符串可以包含到相同的参考char[]
这是通过一些操作,例如使用substring
(在许多实施方案中,反正)。
最重要的是在API String
,虽然-这是一个数组的API有很大不同。 这是你会觉得,当你把JLS定义考虑的API:一个String
表示的Unicode代码点的序列。 所以,你可以拿一个子( Substring
),找到一个给定的序列( indexOf
),将其转换为大写的序列等。
事实上,JLS将稍微更准确称之为的UTF-16编码单元的序列; 完全有可能构造一个字符串,它不是Unicode代码点的有效序列,例如,通过包括二分之一的UTF-16代码单元的“代理对”的,但不是其他。 有哪个做处理API的部分String
中的代码单元方面,但坦率地说大多数开发人员花费大量的时间处理字符串,就好像不存在非BMP字符。