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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦久启 高级黑马   /  2013-4-6 20:48  /  1443 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 秦久启 于 2013-4-6 23:25 编辑

在object类中,equals()方法默认比较的是地址,然而在String类中,赋写了object类中equals()方法,比较的是字符串是否相同,而包装类,如Integer类中同样赋写了object类中equals()方法,比较的是地址呢?为什么和String类中比较的不一样呢?不是比较数字是否相同呢?

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
String类一旦实例化,其内容是不可更改的,因为其本身所指向的就是内存地址,所以在String类中,复写equals()方法比较的里面的内容其实就是在比较内存地址,其实是一样的,不是equals()方法本身的问题,而是String类和Object类本身的不同。
回复 使用道具 举报
声明格式
   public  boolean equals(Object obj)

   其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.

而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

当然,可以自定义覆盖object类的equals()方法,重新定义比较规则。比如,Person类的equals()比较规则为:只要两个对象都是Person类,并且他们的属性name都相同,则比较结果为true,否则返回false


注意,在重写equals方法时,要注意满足以下特性

1  自反性 :对任意引用值X,x.equals(x)的返回值一定为true.
2  对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3  传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4  一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5  非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
其实equals的底层用的比较就是 == (比较的地址)。String类的equals其实比较的也是地址
  1. /*String*/

  2. class StringDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 String s1 = "abc";
  7.                 String s2 = "abc";

  8.                 String str1 = new String("abc");
  9.                 String str2 = new String("abc");

  10.                 System.out.println(s1 == s2); //为true 因为两个值的地址为同一个
  11.                 System.out.println(str1 == str2); //为flase 因为创建了两个对象,对象的地址值不同
  12.                 System.out.println(s1.equals(s2)); // 为true 地址相同
  13.                 System.out.println(str1.equals(str2)); //为true 两个值(也就是"abc")的地址值相同
  14.         }
  15. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马