黑马程序员技术交流社区

标题: String s=new String("abc")和 String s="abc"; [打印本页]

作者: 奋斗41280    时间: 2016-9-16 21:48
标题: String s=new String("abc")和 String s="abc";
String s=new String("abc");
String s1="abc";
重新equals方法后
syso(s.equals(s1))-------->true;

按说new的有两个地址值,       ==时 比较地址值为什么不拿new里面的那个abc的地址值和s1的比较?


这块理解的不透彻,求大神解惑.......


作者: yigezhifu    时间: 2016-9-16 21:54
equals不是比较的地址值,是比较的两个String的具体值,也就是两个都是"abc"的比较,肯定是true了;如果是比较s==s1,那肯定是false了
作者: java程序猿    时间: 2016-9-16 21:56
楼上说的对, String重写了Object类中的equals方法,比较的是字符串常量
作者: kangnam    时间: 2016-9-16 21:57
因为你重写了equals,重写了就是比较内容;没重写就是比较地址值
作者: EdwardWuang    时间: 2016-9-16 21:57

楼上说的对, String重写了Object类中的equals方法,比较的是字符串常量
作者: NewsmallWhite    时间: 2016-9-16 22:00
这么说的话,说明你对"=="与equals()方法还是了解的,
        首先,说说equals()方法,
       一个类如果没有重写Object类的equals()方法的话,比较的也是地址值,如果重写了,
       比较的就是内容,String类重写了equals()方法,所以比较的是内容。
        再说,“==”,是比较运算符,比较的是地址值;
       
        String s1 = new String("abc"):创建了两个对象,一个在堆内存中,另一个在常量池中
        String s2 = "abc";创建了一个对象,对象的地址值存放在常量池中
                s1==s2比较的是s1在对内存的地址值与s2在常量池中的地址值
       
作者: Fate_stay    时间: 2016-9-16 22:17
String重写了Object类中的equals方法,比较的是字符串常量
作者: YSL450125    时间: 2016-9-16 22:27
如题"abc" 对象是在方法区中的常量池中的,new出的String对象实在堆内存中创建的,地址值肯定是不同的,new出的String对象是"abc"的副本
作者: chenyihan    时间: 2016-9-17 10:26
String 是引用数据类型,equa比较引用数据类型的时候比较的具体值.肯定相等
作者: minhang0902    时间: 2016-9-17 11:06
因为s引用的是new出来的对象的地址值
作者: 奋斗41280    时间: 2016-9-17 20:57
NewsmallWhite 发表于 2016-9-16 22:00
这么说的话,说明你对"=="与equals()方法还是了解的,
        首先,说说equals()方法,
       一个类如果没有重 ...

==的情况下,
  String s1 = new String("abc"):创建了两个对象,一个在堆内存中,另一个在常量池中----->按说有两个地址值 值1(new)和值2(abc)
        String s2 = "abc";创建了一个对象,对象的地址值存放在常量池中----->有一个地址值(abc)值3;

那么值2和值3不是一样的指向abc吗?  为什么不比较2和3?




作者: Fate_stay    时间: 2016-9-17 21:49
大家都是引用类型,地址肯定不一样,所以比较地址没有意义,比较内容才有意义,所以要重写equeals方法




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