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 字符串对象是字符数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

js字符串可以循环遍历吗

Object可以转换为数组吗

Java中怎么给数组批量赋值

java怎样读取带空格的字符串数组

在javascript中将字符串转换为对象数组的最佳方法?

java中怎么判断字符数组的长度