在编程众多种条件判断中,相信最常用的就是判相等了,大一学习c语言的我,在刚刚接触java就因为这个问题很头疼。因为有一次我在写java的一段小程序时,用到了字符串的判相等,当时没有反应过来,直接用的“==”,导致程序一直不能正确运行。当发现是判相等出错时,我才想起,c语言是有专门的字符串判断函数的,那在java中该怎么办呢?
首先我们需要了解一点基础知识,java中的数据类型分两种,基本数据类型(int,char,boolean,double…)和引用数据类型(String…)。
***对于基本类型,采用双等号判断,只要数值相等就返回true,而对于引用类型,即常用的String啊还有自己定义的类,只有二者指向同一个对象时才会返回true。***这也就解释了为什么明明两个字符串相等,却返回false的问题。
那你可能会问,equals如何?让你失望的是,equals的内部其实也是个双等号。equals是专门为引用类型设置的,是object类里的一个方法,所有类都继承object,自然所有类都有equals方法,它的目的也是为了判断二者是否指向同一个对象。也就是说,如果你定义了一个类,即使你让equals判断两个属性完全相同的对象,它的返回依旧是false。
听起来equals好像挺没用的,但是这个方法也有特例,*对于File,Date,String还有包装类(wrapper class)来说,equals是比较内容而不比较引用的。*为什么呢?
因为这些类里重写了equals方法!
这或许也给了你启发,我是否也可以通过重写equals方法来改变判相等的方法呢?答案是肯定的。但是要达到这个目的,我们不仅要重写equals,还有重写hashcode。
hashCode的写法其实很多样,你只需要保证相同对象的hashCode相同即可,这才可以保证equals正常运行。
举个栗子,我定义了一个Person类,这个类只有一个姓名属性,我希望只要姓名相等那两个对象就相等,那我就可以这样写:
public String getname() {
return name;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Person))
return false;
Person person = (Person) obj;
return getname().equals(person.getname());
}
@Override
public int hashCode() {
return getname().hashCode();
}