在开发中,我们可能经常需要比较两个对象的内容是否一样。
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集合类时会出现问题