使用String s1="java";并String s2= new String("java");
执行这两个操作时创建不同的String对象?我知道如果我使用String s3="java"它使用s1的相同对象但在s2情况下也使用相同的对象吗?如果是这样,为什么StringBuffer sb = new StringBuffer("java");使用不同的对象.因为如果我这样做System.out.println(sb.equals( s1 ));会返回false;
我对equals方法的理解是它比较两个引用是否引用同一个对象,除非我们有重写的equals方法,如果我的理解是错误的,请告诉我.
这两个都创建了不同的String对象
这里有两个方面.第一个是String文字的实习.在这两个陈述中:
String s1 = "Hello";
String s2 = new String("Hello");
Run Code Online (Sandbox Code Playgroud)
第一个将使用"Hello"已经在常量池中的文字字符串.如果不存在,它将在常量池中创建一个条目"Hello"(在这种情况下,您可以说,创建了一个对象)
在第二种情况下,你有2个字符串对象 - 第一个是字符串文字"Hello",它将从常量池中插入,然后第二个对象创建是由于使用了new关键字 - new String(...)肯定会创建一个新对象.所以:
s1 == s2; // This will return `false`
Run Code Online (Sandbox Code Playgroud)
因为,s1和s2引用了2个不同的String对象.
现在是你的第二个案例:
String s1 = "Hello";
StringBuffer sb = new StringBuffer("Hello");
Run Code Online (Sandbox Code Playgroud)
在第二个语句中,您正在创建一个新StringBuffer对象.好吧,首先是a StringBuffer不是String.其次,由于StringBufferclass不重写equals()方法,所以当你调用这样的equals方法时:
sb.equals(s1);
Run Code Online (Sandbox Code Playgroud)
它将调用Object#equals()方法,该方法根据引用的值进行比较.因此,它将返回false,因为sb并s1指向2个不同的实例.
但是,如果你像这样比较它们:
sb.toString().equals(s1);
Run Code Online (Sandbox Code Playgroud)
那么你现在就会成真.由于String类已经覆盖了equals()方法,因此基于内容进行比较.
也可以看看: