我的观点是,直到今天,像"c"
这样的文字创建了一个String
对象。今天我听说Java没有为单个字符串创建对象。这是正确的吗?它是否将该文字存储为char
?
答案 0 :(得分:13)
不,这是错的。即使""
,也会创建一个String
对象。
但是,如果键入'c'
,则会得到一个char而不是String
对象。
答案 1 :(得分:8)
"c"
将创建一个字符串。 'c'
将创建一个char
答案 2 :(得分:6)
Java确实为单个字符串创建了一个字符串实例。以下打印java.lang.String
:
public class Test{
public static void main(final String[] args){
System.out.println("c".getClass().getName());
}
}
答案 3 :(得分:5)
"c"
是String
字面值。它代表String
,"foo"
代表String
。
没有对单字符String
文字进行特殊处理(甚至不是0字母String
文字""
)。
无论谁告诉你,它的处理方式不同,要么是错误的,要么是b。)谈论不同的事情(例如,有特殊待遇的图书馆)。
答案 4 :(得分:1)
"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/
答案 5 :(得分:1)
也许是什么意思是引擎盖下flyweights被创建(不知道它如何与Java一起工作,但我认为这个概念在某种程度上适用于字符串)
答案 6 :(得分:0)
String
将字符存储为char[]
,因此很可能"c"
将在new char[] { 'c' }
对象中表示为String
。
由于String
类是final
,这意味着在char c
字段中没有存储单字符字符串的子类。
此外,对于单个字符String
到char
,没有自动装箱/取消装箱的概念 - 只要记录在案,因此可以安全地假设单字符字符串存储类似于任何其他类型的String。
答案 7 :(得分:0)
与编程中的大多数事情一样,请查看源代码 - > java.lang.String中。
所有字符串都是java.lang.String的实例,没有特殊情况。每个java.lang.String都包含一个char []和一些用于保存开始和结束索引的整数。请注意,char []在Strign实例之间共享,例如,当一个人执行String.substring()时,原始的char []没有被克隆或复制,它被共享但是开始/结束索引被更新。