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();