介绍:
equals和==都是用于比较是否相同,
注意:两者对于基本数据类型(byte,short,int,long,bool,char,float,double)的比较,仅仅是比较数值的大小,相等则返回true。
对于引用数据类型(类,接口,数组)的比较,比较的是地址是否相同,而不是数值的比较,地址相同则返回true。这里String除外,具体解释下文。
equals是Object类中的一个方法,
在Objec类中是这么定义的
public boolean equals(Object obj) { //返回值为布尔类型,参数为引用类型
return (this == obj); // //this是当前类对象,anObject是出入的形参,比较两个引用类型的地址是否相等
}
如上面Object类中的equals()方法,当传入的参数是引用类型的时候,就会使用Object的equals的方法,比较地址值是否相同
注意:String 也是属于引用数据类型,但是比较两个String类型的对象时,是比较的相应的字符串是否相等,而不是比较地址是否相同,
当传入的参数类型是String类型的使用,使用的String的equals的方法。
【Object类是所有java类的父类,其他类都是继承的该类,String也是继承Object类,String类重写了equals类的equals的方法,以此判断两个字符串是都相等】
在String中重写的equals的方法是:
public boolean equals(Object anObject) {
if (this == anObject) { //复写了equals方法,是对Object类equals方法的补充,如果地址相同,那么肯定是同一字符串,返回true
return true;
}
if (anObject instanceof String) { //如果不是同一字符串,即地址不同,执行这条,instanceof是判断该参数是否是String类中,是则返回true,进行判断字符串是否相等
String anotherString = (String) anObject; //是String类型,则先将传入的参数进行转换,用String类型的对象接收
int n = value.length; //取当前对象字符串的长度
if (n == anotherString.value.length) { //判断当前长度与传入参数的字符串长度是否相等,不等,就返回false
char v1[] = value; //判断每位上的字符是否相等
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
问:如果想仅仅两个引用类型的数据内容是否相同而忽略地址该如何处理?
== 重写类的equals方法
example 一个Dog类,继承Animal类,实例化两个dog类对象,判断两个对象的属性值是否相同
public class TestEquals {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a.equals(b));
}
}
class Animal {
private String type;//种类
//构造器
public Animal(){
//System.out.println(“这是父类无参构造器”);
}
public Animal(String type){
this.type=type;
}
//设定器
public void setType(String type) {
this.type = type;
}
//访问器
public String getType() {
return type;
}
//功能方法
@Override
public String toString() {
return “类型是:”+type;
}
}
class Dog extends Animal{
private String furColor;
//构造器
public Dog() {
}
public Dog(String type,String furColor){
super(type);
this.furColor=furColor;
}
public String getFurColor() {
return furColor;
}
public void setFurColor(String furColor) {
this.furColor = furColor;
}
//功能方法
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString()+",颜色是:"+furColor;
}
@Override
public boolean equals(Object obj) {
Dog d = (Dog)(obj); //将引用类型强制转换成Dog类型
return this.furColor.equals(d.furColor); //this是指代当前对象,即所在类实例化的对象,然后调用Object类的
//equals比较,这里是属性的比较,属于基本数据类型,在基本数据类型比较,
//只比较数据的值,而引用类型比较是比较地址,
}
关键代码(在子类中)
public boolean equals(Object obj) {
Dog d = (Dog)(obj); //将引用类型强制转换成Dog类型
return this.furColor.equals(d.furColor); //this是指代当前对象,即所在类实例化的对象,然后调用Object类的
//equals比较,这里是属性的比较,属于基本数据类型,在基本数据类型比较,
//只比较数据的值,而引用类型比较是比较地址,
}
如有问题,欢迎指出,共同进步。