2012-11-02 78 views
8

我是java的新手,并试图理解语言的基本要素。Java字符串对象是一个字符数组吗?

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

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

JLS 10.9

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

JLS 4.3.3

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

+0

感谢您发布该问题。我总是这样,String作为一个字符数组。 :) .. +1 – PermGenError

+0

@ chaitanya10:关于你我现在删除的答案的问题:一个对象是一个类的实例*。这不是一堂课。一个类和一个对象是两个不同的东西。 –

+0

@ chaitanya10 TY :-) –

回答

17

是否准确地指出的Java String对象是本质定义为字符的不可变的数组类?

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

  • 一个char[]包含的实际字符
  • 进入阵列的起始索引
  • 长度
  • 缓存的哈希码,懒散地计算出来

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

尽管重要的是String的API - 这与数组的API非常不同。这是您在考虑JLS定义时可以考虑的API:String表示一系列Unicode代码点。所以你可以采取一个子序列(Substring),找到给定的子序列(indexOf),将其转换为大写字母序列等。

实际上,JLS将其称为UTF-16代码单元序列会稍微精确一些;完全有可能构建不是有效的Unicode码点序列的字符串,例如,通过包含UTF-16代码单元的“代理对”的一半而不是另一半。有API的部分,其成交与String中的代码单元方面,但坦率地说开发商花的时间处理字符串,就好像不存在非BMP字符。

+0

很好的答案。你能否介绍一下“字符串表示Unicode码点序列”以及它与包含实际字符的char []有什么不同?可能是非英语母语人士的混淆? – kosa

+0

@Nambari:将编辑,但它似乎合理清晰​​... –

+0

+1接受 - 我认为这清楚地回答了我的问题。感谢您的简洁回答。 –

相关问题