黑马程序员技术交流社区

标题: 字符串中“==”和“equals()”的区别? [打印本页]

作者: 钱途mo路    时间: 2014-7-8 22:22
标题: 字符串中“==”和“equals()”的区别?
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);// false
System.out.println(s1.equals(s2));// true
不是说,==比较基本类型时比较的是内容,比较的是引用类型时比较的是地址值,而equals()比较的是引用类型,比较的是地址值,可为啥s1==s2的结果却是false?求高手指教!
作者: fantacyleo    时间: 2014-7-8 22:29
本帖最后由 fantacyleo 于 2014-7-8 22:31 编辑

equals()方法在根类Object中确实是比较地址值,也就是看两个引用变量是否指向同一个对象。API文档原话: this method returns true if and only if x and y refer to the same object (x == y has the value true)

但是,子类继承父类时可以重写父类的方法啊。String类作为Object的子类就重写了继承自Object的equals()方法,把相等判定条件改成两个字符串有相同的字符序列。API文档:The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object. 所以s1.equals(s2)返回true

而s1和s2本身是两个不同的对象(虽然它们保存了同样的字符序列),s1==s2当然返回false啦。


作者: 天涯无痕    时间: 2014-7-8 22:36
楼上  正解啊   受教了
作者: 霜林醉zhx    时间: 2014-7-8 22:36
进来学习一下
作者: hxwo211314    时间: 2014-7-8 22:56
s1和s2 是分别new的一个新的字符串,相当于在内存中开辟了两个空间,地址值当然不一样了,所以s1==s2的结果为false.
而equasl()方法是将父类Object的方法进行了重写,equals()方法用于比较两个字符串中的字符是否相等,所以s1.equals(s2)结果为true.
作者: hhnog    时间: 2014-7-8 23:41
楼上正解,语言也简单易懂:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2