Java 字符串初始化默认转换为 char 数组

标签 java string

当我将代码编写为

String s = "T";

Java 在内部将值创建为 char[]。这意味着[T]

但我无法找到,如何以及何时初始化字符串,它会自动转换为字符数组。

有人可以告诉我这里发生了什么吗?

最佳答案

Java 将字符串视为常量对象。为了隐藏这一点并提高一些性能,有一个字符串值的内部表示。 (例如,如果您创建两个具有相同值的字符串,它们可能会使用相同的内存位置来存储该值。)如果您想深入挖掘,可以在 Java Language Specification, JLS $4.3.3 中找到更多详细信息。和 Java Virtual Machine Specification, e.g JVM $5.1

除非 JLS 或 JVMS 指定,否则这些详细信息是 JVM/实现特定的。看起来当前的 Oracle JVM 使用 UTF-16 字符数组来表示内存中字符串的值。 JEP 254: Compact Strings对此进行了记录(以及 Java 9 中的更改)。如果您在字节级别上查看它(我们正在讨论内部),则 char 数组与字符串非常相似,因此这种区别有些学术性,而 char 数组只是查看字符串的另一种方式。

有多个问题涉及具体的内部字符串表示( What is the Java's internal represention for String? Modified UTF-8? UTF-16?Java String internal representation )。

但是:除非您正在研究 JVM 级别(JNI、硬核性能优化等)内部表示不应该让您担心!在您的 Java 代码中,您仍然有一个 String 对象可以用来编程。你的字符串s不是一个字符数组,甚至不能分配给一个; char[] ch = s;给你一个类型不匹配错误(这就是为什么你有一个特殊的方法来进行转换 ch = s.toCharArray(); )。

看起来困惑来自 Eclipse 中的变量检查器,它也将 String 对象显示为 char 数组。 Java IDE 中的调试器可能不会向您显示对象的“真实”表示,而只是用户友好的 View 。(据我所知,您甚至可以扩展 Eclipse Inspector 以显示“更有意义”的版本)一个物体的)。对于 String 对象,Eclipse 会显示 String 文字等效的字符数组,可能是为了使分析更容易。

换句话说:String 对象的内部表示可能是一个 char 数组,但这在 Java 程序中是无效的。 字符串对象在代码中始终是字符串对象!

关于Java 字符串初始化默认转换为 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42802030/

相关文章:

java - 在Alluxio Web UI中,“服务器配置检查”已被警告

java - JFrame.setResizing(假);不工作

Java 异常大的虚拟内存,用于某些环境中的实际内存使用

java - 在java中对列表进行排序

JavaScript - RegExp - 替换字符串中无用的括号

ios - 获取不超过两个字母的日历工作日符号

ruby-on-rails - Ruby on Rails - 除非多个条件

java - 连接图像字节数组

python - 在 python 中排序字符串不起作用

c# - 允许用户在 Windows 控制台中键入任意数量的字符串,然后显示有关已键入的字符串中的字母数和行号的信息