这两个都创建不同的字符串对象吗
这里有两个方面。第一个是字符串文字的实习。在这两个陈述中:
String s1 = "Hello";
String s2 = new String("Hello");
第一个将使用"Hello"
常量池中已经存在的文字字符串。如果不存在,它将在常量池中创建一个条目"Hello"
(在这种情况下,您可以说,创建了一个对象)
在第二种情况下,您有 2 个字符串对象 - 第一个是字符串文字"Hello"
,它将从常量池中实习,然后第二个对象创建是由于使用new
关键字 -new String(...)
肯定会创建一个新对象。所以:
s1 == s2; // This will return `false`
因为,s1 和 s2 引用了 2 个不同的 String 对象。
现在是你的第二个案例:
String s1 = "Hello";
StringBuffer sb = new StringBuffer("Hello");
在第二条语句中,您正在创建一个新StringBuffer
对象。好吧,首先 aStringBuffer
不是 a String
。其次,由于StringBuffer
类不覆盖equals()
方法,所以当你调用这样equals
的方法时:
sb.equals(s1);
它将调用该Object#equals()
方法,该方法根据参考值进行比较。因此,它将返回false,因为sb
和s1
指向 2 个不同的实例。
但是,如果您像这样比较它们:
sb.toString().equals(s1);
那么你现在就会变得真实。由于String
类已经覆盖了equals()
方法,它根据内容进行比较。
也可以看看: