误区:equals用于“比较值是否相等”是一个错误观点
区别==和equals要从数据类型和调用方法入手
- == 都既可以比较基本数据类型,也可以比较引用数据类型
- equals只能比较引用数据类型
- == 是运算符,equals是方法
equals()方法的使用:
1,equals()由java.lang.Object定义,故所有类都可以调用,但是Object中定义的equals和==作用是相同的:都是比较地址,即两个引用是否指向同一个地址。
2,在String、Date、File、包装类 等中都重写的equals方法,此时的equals比较值。
3,通常情况下,自定义的类想调用equals()目的都是比较值,因此需要在自定义类中自定义重写equals(),eclipse IDEA可以选择自动生成。
class Circle{
int r;
public Circle(int r){
this.r=r;
}
@Override
public boolean equals(Object obj) {
//自动调用的都是默认Object作为形参
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
//保证同类
return false;
Circle other = (Circle) obj;
//强转
if (r != other.r)
return false;
return true;
}
}
public class Test {
public static void main(String[] args) {
Circle a = new Circle(22);
Circle b = new Circle(22);
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
/*==比较地址,类在堆中创建空间,所以地址不同。
equals已经重写,比较的是值*/
Integer c = 33;
Integer d = 33;
System.out.println(c==d);//true
System.out.println(c.equals(d));//true
/*Integer等8种包装类的空间在常量池,所有==也为true*/
String e = "aaa";
String f = "aaa";
System.out.println(e==f);//true
System.out.println(e.equals(f));//true
/*String和8种基本数据也都放在常量池,所以==也为true*/
}
}
eclipse的自动生成方法