当我们做的时候
String a=new String("mac");
String b=new String("mac");
if(b == a)
{
System.out.println("condition 1 is true");
}
if(b.equals(a))
{
System.out.println("condition 2 is true");
}
条件1失败,条件2为真,因为b和a是两个不同的对象
但是当我们做的时候
String a="mac";
String b="mac";
if(b == a)
{
System.out.println("condition 1 is true");
}
if(b.equals(a))
{
System.out.println("condition 2 is true");
}
这两个条件都是真的。为什么没有java为第二种情况创建一个新对象。如果java只在我们使用new()
时才创建一个新对象,那么如果我们给两个字符串赋予不同的值,那么java内部会发生什么?
答案 0 :(得分:2)
当您在下面声明时,Java在String常量池中创建String文字,并且引用a
和b
都将引用池中的String对象"mac"
String a="mac";
String b="mac";
因此,==
和.equals()
都返回true。
但是,当你使用new
运算符创建String对象时,String对象就像在java中的其他常规对象一样在堆中创建。
因此==
运算符将返回false,因为两个引用都引用堆中的两个不同对象。