先抛个问题
int i = 0; double d = 0d; Integer integer = 0; Double dDouble = 0d; String str = "test"; StringBuilder sb = new StringBuilder("test"); Student student1 = new Student(); Student student2 = new Student(); // 以下打印的是false还是true System.out.print(i == d); System.out.print(dDouble.equals(integer)); System.out.print(str == sb.toString()); System.out.print(str.equals(sb.toString())); System.out.print(student1 == student2);
看完下面的解析,我想以上问题能轻松回答上来。。。
1、“==”
“==”在我们的意识中,它代表着相等,等价于。在Java中,它有两种含义,在比较基本类型时,比较的就是值;而在比较引用类型时,比较的是引用的地址。
所以
int i = 0; double d = 0; // 输出结果为true System.out.print(i == d);
Student student1 = new Student(); Student student2 = new Student(); // 输出结果为false System.out.print(student1 == student2);
2、equals
首先,先看Object中定义的equals方法,源码如下:
public boolean equals(Object obj) { return (this == obj); }
从上面可以看出,Object的equals方法比较的是两个对象的引用地址是否一致,但很多时候我们的需求是比较两个对象的值是不是一样,于是String重写了equals方法
public boolean equals(Object anObject) { // 若对象的引用地址一样,这两个对象相等 if (this == anObject) { return true; } // 若是字符串类型,比较每个字符的值 if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { 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; }
其实,基本类型的包装类型,如Integer、Double等都重写了equals方法,下面可以看下Integer重写equals方法的源码
public boolean equals(Object obj) { if (obj instanceof Integer) { // 若为Integer类型,比较两者的值 return value == ((Integer)obj).intValue(); } return false; }
所以
String str = "test"; StringBuilder sb = new StringBuilder("test"); // 结果是false,StringBuilder的toString()会新生成一个String System.out.print(str == sb.toString()); // 结果是true,每个字符的值是一样的 System.out.print(str.equals(sb.toString()));
Integer integer = 0; Double dDouble = 0d; // d的类型是Double,结合Integer的equals方法的源码,马上知道结果是false System.out.print(integer.equals(dDouble));
看完了以上内容,是不是对==和equals有了不一样的理解呢?
1、对于基本类型,“==”比较值是不是相等;
2、对于Object,比较的是对象的引用地址是不是一样;
3、对于基本类型的包装类型,重写了Object中的equals,比较的是类型和值是不是都一样;
4、对于字符串,重写了Object中的equals,比较每个字符的值是不是一样。
希望能帮到大家。。。
愿你悄悄的努力,遇见更好的自己~