Java 字符串对象是字符数组吗?
Posted
技术标签:
【中文标题】Java 字符串对象是字符数组吗?【英文标题】:Are Java String Objects an Array of Chars? 【发布时间】:2012-10-23 12:21:08 【问题描述】:我是 Java 新手,并试图了解该语言的基本要素和基础知识。
说 Java 字符串对象本质上是一个定义为不可变字符数组的类是否准确?
我问这个是因为与 char 数组和字符串类相比,我对规范有点困惑......
JLS 10.9
10.9 字符数组不是字符串 在 Java 编程语言中,与 C 不同,char 数组不是 String, 并且字符串和 char 数组都不会被 '\u0000' 终止(NUL 特点)。 一个 String 对象是不可变的,也就是说,它的内容永远不会改变,而一个数组 char 具有可变元素。 String 类中的 toCharArray 方法返回一个字符数组,其中包含 与字符串相同的字符序列。 StringBuffer 类实现有用 可变字符数组的方法。
JLS 4.3.3
4.3.3 类 String 类 String 的实例表示 Unicode 代码点序列。
【问题讨论】:
感谢您发布问题。我总是将字符串作为字符数组。 :) .. +1 @chaitanya10:关于您对我现在已删除的答案的问题:对象是类的实例。这不是一堂课。类和对象是两个不同的东西。 【参考方案1】:说 Java 字符串对象本质上是一个定义为不可变字符数组的类是否准确?
没有。 Java String 对象是(目前 - 它是我收集的可能正在更改的实现细节)一个类包含几个字段:
包含实际字符的char[]
数组的起始索引
长度
缓存的哈希码,延迟计算
索引和长度的原因是几个字符串可以包含对同一个char[]
的引用。这被一些操作使用,例如substring
(在许多实现中,无论如何)。
重要的是 String
的 API - 这与数组的 API 非常不同。这是您在考虑 JLS 定义时会想到的 API:String
表示一系列 Unicode 代码点。所以你可以取一个子序列(Substring
),找到一个给定的子序列(indexOf
),把它转换成大写序列等等。
事实上,将 JLS 称为 UTF-16 代码单元序列会更准确一些;完全有可能构造一个字符串,它不是 Unicode 代码点的 有效 序列,例如通过包含 UTF-16 代码单元的“代理对”的一半而不是另一半。 API 的某些部分确实在代码单元方面处理String
,但坦率地说,大多数开发人员花费大部分时间将字符串视为不存在非 BMP 字符。
【讨论】:
不错的答案。您能否对“字符串表示 Unicode 代码点序列”以及它与包含实际字符的 char[] 有何不同?可能是非英语母语人士的困惑? +1 接受 - 我认为这清楚地回答了我的问题。感谢您的简洁回答。以上是关于Java 字符串对象是字符数组吗?的主要内容,如果未能解决你的问题,请参考以下文章