equals方法
源代码:
public boolean equals(Object obj) {
return (this == obj);
}
SUN公司设计equals方法目的?
equals方法的设计初衷是判断两个对象是否相等,但是源代码中通过“ == ” 来判断是明显不行的,通过 “ = = ”来判断的仅仅是二者的内存地址。
例如以下代码:
public class Test {
public static void main(String[] args) {
MyTime s1 = new MyTime(2001,1,1);
MyTime s2 = new MyTime(2001,1,1);
System.out.println(s1.equals(s2));
}
}
class MyTime{
int year;
int month;
int day;
public MyTime(int year,int month,int day)
{
this.day = day;
this.year = year;
this.month = month;
}
};
编译结果是false,仅管两个对象中存的东西是一样的,但是二者的内存地址不同。
如何使用equals方法?
在大多数情况下equals都是需要程序员自己重写的,在重写时,程序员根据自己的需求,认为对象中什么相等时,两个对象就相等。
继续使用上例,如果想认为当year相等时,两个对象就相等,那么可以这样写:
class MyTime{
int year;
int month;
int day;
public MyTime(int year,int month,int day)
{
this.day = day;
this.year = year;
this.month = month;
}
public boolean equals(Object obj){
//内存地址一样,说明两个引用指向同一个对象
if(obj == this){
return true;
}
//访问子类特有属性时,需要向下转型
if(obj instanceof MyTime) {
MyTime obj2 = (MyTime) obj;
return this.year == obj2.year;
}
return false;
}
};
String类中对equals的重写
SUN公司在设计equals方法时希望使用者对它进行重写,因此在他们自己写的String类中已经对equals方法进行重写了。
在jdk-11.0.2中对equals进行了如下重写:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
当想要比较两个字符串是否相等时,就可以直接调用equals方法,如下:
public class Test {
public static void main(String[] args) {
String s1 = "1234";
String s2 = "1234";
System.out.println(s1.equals(s2));
}
}
编译结果:true
hashCode()方法
源码:
public native int hashCode();
该方法不是抽象方法,带有native关键字修饰,底层调用的是c++程序。
用法:
该方法可以通过哈希算法将对象的内存地址转换成一个数字,可以等同看做内存地址。