黑马程序员技术交流社区
标题:
equals()方法的问题
[打印本页]
作者:
秦久启
时间:
2013-4-6 20:48
标题:
equals()方法的问题
本帖最后由 秦久启 于 2013-4-6 23:25 编辑
在object类中,equals()方法默认比较的是地址,然而在String类中,赋写了object类中equals()方法,比较的是字符串是否相同,而包装类,如Integer类中同样赋写了object类中equals()方法,比较的是地址呢?为什么和String类中比较的不一样呢?不是比较数字是否相同呢?
作者:
侯振凯
时间:
2013-4-6 21:12
String类一旦实例化,其内容是不可更改的,因为其本身所指向的就是内存地址,所以在String类中,复写equals()方法比较的里面的内容其实就是在比较内存地址,其实是一样的,不是equals()方法本身的问题,而是String类和Object类本身的不同。
作者:
王大伟
时间:
2013-4-6 21:12
声明格式
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
作者:
赵晓东
时间:
2013-4-6 21:36
其实equals的底层用的比较就是 == (比较的地址)。String类的equals其实比较的也是地址
/*String*/
class StringDemo
{
public static void main(String[] args)
{
String s1 = "abc";
String s2 = "abc";
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(s1 == s2); //为true 因为两个值的地址为同一个
System.out.println(str1 == str2); //为flase 因为创建了两个对象,对象的地址值不同
System.out.println(s1.equals(s2)); // 为true 地址相同
System.out.println(str1.equals(str2)); //为true 两个值(也就是"abc")的地址值相同
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2