A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String s=new String("abc");
String s1="abc";
重新equals方法后
syso(s.equals(s1))-------->true;

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


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

11 个回复

倒序浏览
equals不是比较的地址值,是比较的两个String的具体值,也就是两个都是"abc"的比较,肯定是true了;如果是比较s==s1,那肯定是false了
回复 使用道具 举报
楼上说的对, String重写了Object类中的equals方法,比较的是字符串常量
回复 使用道具 举报
因为你重写了equals,重写了就是比较内容;没重写就是比较地址值
回复 使用道具 举报

楼上说的对, String重写了Object类中的equals方法,比较的是字符串常量
回复 使用道具 举报
这么说的话,说明你对"=="与equals()方法还是了解的,
        首先,说说equals()方法,
       一个类如果没有重写Object类的equals()方法的话,比较的也是地址值,如果重写了,
       比较的就是内容,String类重写了equals()方法,所以比较的是内容。
        再说,“==”,是比较运算符,比较的是地址值;
       
        String s1 = new String("abc"):创建了两个对象,一个在堆内存中,另一个在常量池中
        String s2 = "abc";创建了一个对象,对象的地址值存放在常量池中
                s1==s2比较的是s1在对内存的地址值与s2在常量池中的地址值
       
回复 使用道具 举报
String重写了Object类中的equals方法,比较的是字符串常量
回复 使用道具 举报
如题"abc" 对象是在方法区中的常量池中的,new出的String对象实在堆内存中创建的,地址值肯定是不同的,new出的String对象是"abc"的副本
回复 使用道具 举报
String 是引用数据类型,equa比较引用数据类型的时候比较的具体值.肯定相等
回复 使用道具 举报
minhang0902 来自手机 中级黑马 2016-9-17 11:06:34
10#
因为s引用的是new出来的对象的地址值
回复 使用道具 举报
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?



回复 使用道具 举报
大家都是引用类型,地址肯定不一样,所以比较地址没有意义,比较内容才有意义,所以要重写equeals方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马