当我将代码编写为
时String s = "T";
Java在内部创建的值为char[]
。这意味着[T]
。
但是我无法找到,如何以及何时初始化String,它会自动转换为char数组。
有人可以指导我,发生在这里的事情吗?
答案 0 :(得分:1)
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中的调试器可能不会向您显示对象的“真实”表示,而只是用户友好的视图。(AFAIK甚至可以扩展Eclipse Inspector以显示“更有意义”的版本一个对象)。对于String对象,Eclipse向您显示字符串文字和等效字符数组,可能会使分析更容易。
换句话说:String对象的内部表示可能是char数组,但这在Java程序中无效。 String对象在代码中保留一个String对象!
答案 1 :(得分:0)
你所说的不正确。
下面的代码证明java正在为“T”创建一个String
类的对象。
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
String s="T";
System.out.println(s.getClass().getName());//prints **java.lang.String**
}
}
您可以通过运行上述代码来验证这一点。