public class test {
public static void main(String[] args) {
//1.基本数据类型
int n1 = 1;
int n2 = 2;
int n3 = 2;
boolean result1 = (n1 == n2);
boolean result2 = (n2 == n3);
System.out.println(result1);//F
System.out.println(result2);//T
System.out.println("==============");
//2.Integer类对象
Integer i1 = new Integer(n1);
Integer i2 = new Integer(n2);
Integer i3 = new Integer(n3);
System.out.println(i1 == i2);//F
System.out.println(i2 == i3);//F
System.out.println(i1.equals(i2));//F
System.out.println(i2.equals(i3));//T
System.out.println("==============");
//3.Object类对象
Dog dog1 = new Dog("米米");
Dog dog2 = new Dog("豆豆");
Dog dog3 = new Dog("豆豆");
System.out.println(dog1 == dog2);//F
System.out.println(dog2 == dog3);//F
System.out.println(dog1.equals(dog2));//F
System.out.println(dog2.equals(dog3));//F
}
}
class Dog {
private String name;
public Dog() {}
public Dog(String name) {
this.name = name;
}
}
1. 基本数据类型比较
只能使用==进行比较
equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是 是否是同一个对象
此时的==比较的是两个变量存储的值是否相等
显然n1 != n2,n2 = n3
2.Integer类对象
封装n1,n2,n3后,形成Integer类对象i1,i2,i3
-
==比较
i1 != i2(i1 和 i2属于两个值不同的独立对象,(栈)内存中存放的(堆)内存地址不同)
i2 != i3(i2 和 i3属于仅值相同的两个独立对象,也拥有不同的地址)
因此:
==在比较对象时,比较的是(栈)内存中存放的(堆)内存地址是否一致 -
equals()比较
//Integer类的equals方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
i1 != i2
i2 == i3
由于Integer类中重写了equals方法,在传入参数后,首先判断对象是否属于Integer类
不是直接返回false
是Integer类对象,若两个对象的值相等返回true,否则false
因此:
Integer类的equals()函数在比较对象时,比较的是两个对象的值是否相等
3.Object类对象
new三个自定义Dog类对象,dog1,dog2,dog3
-
==比较
dog1 != dog2
dog2 != dog3
原因与Integer类对象比较结果相同,不同的独立对象在堆中有不同地址,因此不相等 -
equals()比较
//object类的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
dog1 != dog2
dog2 != dog3
Object类的equals()方法,比较的是引用类型的变量所指向的对象的地址
因此:
Object类的equals()方法与==的作用一致,比较的都是对象的地址,即是否是同一个对象
注意
Object类中的equals方法和==是一样的,没有区别。
而String类,Integer等类,重写了equals方法,比较方式有所改。
所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。