我是java的新手,并试图理解该语言的基本要素和基础知识。
是否准确地说Java字符串对象本质上是一个定义为不可变字符数组的类?
我问这个,因为我对char数组和字符串类的规范感到有点困惑......
10.9字符数组不是字符串 在Java编程语言中,与C不同,char数组不是String, 并且字符串和char数组都不会被'\ u0000'终止(NUL 字符)。 String对象是不可变的,也就是说,它的内容永远不会改变,而是一个数组 char有可变元素。 类String中的toCharArray方法返回包含的字符数组 与String相同的字符序列。 StringBuffer类实现有用 可变字符数组的方法。
4.3.3类String的类字符串实例表示Unicode代码点的序列。
答案 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字符不存在一样。