假设String类没有实现equals()方法的话 那么 String a = "abc"; String b = new String("abc");a.equals(b)将调用Object.equals()方法。 Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 所以a.equals(b)会返回false。那么很多地方比如根据用户输入的字符串去做判断,都不能直接使用equals方法了。
那么
String a = "abc";
String b = new String("abc");a.equals(b)将调用Object.equals()方法。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
所以a.equals(b)会返回false。那么很多地方比如根据用户输入的字符串去做判断,都不能直接使用equals方法了。
比如,字符串的equals只要它们的内容相同就可以equals了
而别的类可能会有其它的比较点,所以这就要各自的子类来实现了
如果不重写,那就是使用Object类的 equals方法,它就是直接比较引用了
比如网络对象,带有volatile属性的对象,或是带有多层子对象的复合对象,等等,是不能像String一类的对象进行简单比较的,所以提供了这样一个机制,就像serializable接口一样,既有默认的序列化方法,也提供了程序自己定制,覆盖默认方式的可能性。
Object仅仅提供了一个对引用的比较,如果两个引用不是同一个那就返回false,这是无法满足大多数对象比较的需要的,所以要覆盖。
我上面说的是一般类,String类是的实现源码我也看了,也知道程序员们习惯于用equals()比较对象的值
这样说吧:
当我们定义一个类时,在什么情况下,我会去考虑重写equals()方法呢
public boolean equals(Object obj) {
return (this == obj);
}这个是java中object的equals方法,它只是简单的判断2个对象是否指向
同一内存地址,如果是指向同一个内存地址,这两个对象其实就是同一个对象;而我们很多时候想要的是:
不管这两个对象是否指向同一个对象,只要他们的内容相同,就应该通过equals方法返回一个true
值来
例如:String str1 = new String("123");
String str2 = new String("123");str1和str2指向不同的物理地址,是不同的对象。这时我们只是关心它们的字面内容
是否相同,这时它们的字面内容都为"123",我们希望equals方法能返回一个true,
鉴于以上,不重写equals方法是不行的;
String str1 ;
int i;
//省略
}你希望该类的对象只要这2个属性字段分别相等,就通过equals()返回1个true,
此时你就要重写equals()方法:class A{
String str1 ;
int i;
boolean equals(A src){
return this.str1.equals(src.str1)&&this.i==src.i;
}
}