我想知道是否在这里创建了一个新对象:
String obj;
if(obj == "") {
}
在这里:
if(obj.equals("")){}
我的意思是像新String(“”)这样的对象实例化这两种情况吗?
答案 0 :(得分:6)
种类。
你是对的,程序实际上会引用一个包含值String
的完整""
对象。但是,这并不是在调用方法时严格创建的。当类加载到VM中时,字符串(编译时常量)字符串文字在JVM范围的常量池中创建,并且相同的常量共享相同的字符串。
由于JVM本身几乎肯定有一个类引用空字符串文字,因此字符串池已经包含与""
对应的对象,因此您的类实际上不会导致创建新对象
答案 1 :(得分:1)
不,obj
只是在这些情况下无处引用。您将收到一条错误消息,指出obj
在任何一种情况下均未初始化。
答案 2 :(得分:1)
这取决于。如果字符串池已包含字符串“”,则不会构造任何新对象。否则,当然会构造一个新的String对象并将其放入字符串池。
答案 3 :(得分:1)
没有。将不会为obj
创建任何对象。您是否正在混淆C ++,其中默认构造函数将被调用?
在
String obj;
if(obj == "") {
}
支票obj == ""
将失败(因为obj
将等于null
而""
则不会。)
在
if(obj.equals("")){}
您将获得NullPointerException
,因为obj
为null
,无法发送。
如果问题是是否为了比较而创建了一个空字符串,答案是:不是在运行时,而是在编译时。将其与问题“i == 5
在此处创建值为5
的整数?”进行比较好吧,不是真的。
答案 4 :(得分:1)
该代码甚至没有构建。编译器告诉你原因:
"The local variable obj may not have been initialized"