在开发中,我们可能经常需要比较两个对象的内容是否一样。

1.java基本类型(int,double…)只要用 == 比较就可以了。

int a = 1; 
int b = 1;
System.out.println(a == b);//输出为true

2.String类型不是java中的基本类型,不能简单的用 == 来判断

String strA = "aaa";
 String strB = "aaa";
 String strC = new String("aaa");
 System.out.println(strA == strB);//输出为true
 System.out.println(strA.equals(strB));//输出为true
 System.out.println(strA == strC);//输出为false
 System.out.println(strA.equals(strC));//输出为true

由上面的代码可以看出来,strA和strB用 == 判断为true,但strA和strC 用==判断却是false。
这是因为 == 比较的是地址,而equals比较的是内容。
而strA和strB 用 == 比较却是相等的,很明显strA和strB都指向的是内存中的同一处地方,这就涉及到java的字符串缓冲池。首先strA和strB不是对象,只有new出来的才是对象,在把“aaa” 赋值给strA时,首先括号里的"abc"先到缓冲池里看有没"aaa"这个对象,没有则在缓冲池里创建这个对象,之后再把“aaa”赋值给strB时,这是缓冲池里已经存在了“aaa”这个对象,所以就直接将引用赋值给strB,所以strA和strB指向的是同一处。

3.java基本类型的封装类与String类似

Integer a = new Integer(1);
 Integer b = new Integer(1);
 Integer c = 1;
 int d = 1;
 System.out.println(a == b);//false
 System.out.println(a.equals(b));//输出为true
 System.out.println(a == c);//输出为false
 System.out.println(a.equals(c));//输出为true
 System.out.println(a == d);//输出为true

这里涉及到Java自动装箱和自动拆箱的功能。简单来说,装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。因此1在赋值给c时,会自动装箱,从基本数据类型int转换为Integer类型。1赋值给c时,1会自动装箱,转化为Integer类型。a与d 用==进行比较时,a会自动拆箱,转换为int类型。
a 和 b 除了用equals比较外,还可以用intValue进行比较

System.out.println(a.intValue() == b.intValue());//输出为true

4.那么我们要比较同一个类的两个对象呢?
学习String时,一些资料告诉我== 比较的是地址,而equals比较的是内容。所以当时我以为这在普通的类也一样适用,然而事实是

public class Cat {

    String name;

    int size;

    public Cat(String a,int b){
        name = a;
        size = b;
    }

    public static void main(String[] args){
        Cat catA = new Cat("aaa",12);
        Cat catB = new Cat("aaa",12);
        System.out.println(catA.equals(catB));//输出为false
        
    }

}

结果为false,明明我创建的两个cat的name和size内容都一样,怎么会判断为false呢?
后来我找到了== 和 equals 更详细的比较,原文如下
“ == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。”

所以说,String是吧Object类中的equals方法重写了。

那么我们又该如何比较两个对象。很显然,我们也要重写equals方法。

public class Cat {

    String name;

    int size;

    public Cat(String a,int b){
        name = a;
        size = b;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Cat cat = (Cat) o;

        boolean flag = true;
        if (size != cat.size){
            flag = false;
        }
        if (!name.equals(name)){
            flag = false;
        }
        return flag;
    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + size;
        return result;
    }

    public static void main(String[] args){
        Cat catA = new Cat("aaa",12);
        Cat catB = new Cat("aaa",12);
        System.out.println(catA.equals(catB));//输出为true

    }

}

注意:重写equals方法时,hashCode方法也要重写。否则在用Java集合类时会出现问题