直到今天,我的观点是像"c"
这样的文字会创建一个String
对象。今天我听说Java并不会为单个字符的字符串创建对象。这是正确的吗?它会将该文字存储为char
吗?
直到今天,我的观点是像"c"
这样的文字会创建一个String
对象。今天我听说Java并不会为单个字符的字符串创建对象。这是正确的吗?它会将该文字存储为char
吗?
不,这是错误的。即使是 ""
,也会创建一个 String
对象。
但是如果你输入 'c'
,你会得到一个字符而不是一个 String
对象。
"c"
将创建一个字符串。'c'
将创建一个字符。
即使是单个字符的字符串,Java也会创建一个字符串实例。以下代码将打印java.lang.String
:
public class Test{
public static void main(final String[] args){
System.out.println("c".getClass().getName());
}
}
""
(双引号)用于字符串,而''
(单引号)用于字符。 - Woot4Moo"c"
是一个 String
文本。它表示一个字符串,就像 "foo"
一样。
单个字符的 String
文本没有特殊处理(即使是零长度的 String
文本 ""
也不例外)。
如果有人告诉你这种文本被特别对待了,那么要么是错的,要么可能是在谈论另外一件事(比如某个库对它进行了特殊处理)。
"c"
会创建一个对象。但是,如果你在源代码的其他地方再次分配这个字面量,它不会创建一个新的对象,而是引用第一个字符串对象。
例如:
String s1 = "abc"; //creates the String object
String s2 = "abc"; //references the same object as s1
变量s1和s2都指向同一个对象,因此使用==运算符是可行的。
您可以在此处阅读更多信息:http://javatechniques.com/blog/string-equality-and-interning/
也许所指的是,在底层创建了flyweights(不清楚在Java中是如何工作的,但我推测这个概念在某种程度上被应用于字符串)。
String
存储字符作为 char[]
,所以最有可能的是 "c"
在 String
对象中表示为 new char[] { 'c' }
。
由于 String
类是 final
的,这意味着没有子类将单个字符字符串存储在 char c
字段中。
此外,对于单个字符的 String
到 char
的自动装箱/拆箱概念不存在 -- 就目前所知,因此可以安全地假设单个字符的字符串与任何其他类型的字符串存储方式相似。
在编程中,与大多数事物一样,请查看源代码 -> java.lang.String。
所有字符串都是java.lang.String的实例,没有特殊情况。每个java.lang.String都包括一个char[]和一些整数来保存开始和结束索引。请注意,char[]在Strign实例之间共享,例如当使用String.substring()时,原始char[]不会被克隆或复制,而是共享,但是开始/结束索引会被更新。
char
... - Nick