在实际编程中,常常会须要比较两个值或两个对象是否相等(相同),这时咱们一般会使用==
或equals
。那么它们各自表明着什么含义,又有什么区别呢?今天来总结一下。html
==
有两种状况:数据是基本类型,或引用类型(即对象)java
==
比较的是值==
比较的是所引用的对象是不是同一个,即指向的内存地址
是否相同下面看测试代码:python
private static void main(String[] args) {
int a1 = 10;
int a2 = 10;
System.out.println(a1 == a2);
double d1 = 6.7;
double d2 = 6.7;
System.out.println(d1 == d2);
boolean b1 = true;
boolean b2 = true;
System.out.println(b1 == b2);
char c1 = 'x';
char c2 = 'x';
System.out.println(c1 == c2);
}
复制代码
测试结果:编程
true
true
true
true
复制代码
equals
方法首先咱们要理解,这个equals方法是咱们要比较的对象所属的类从超类Object一层一层继承过来的。那么咱们先看一下Object类中的源码:bash
public class Object {
public boolean equals(Object obj) {
return (this == obj);
}
}
复制代码
哦,原来Object类的这个equals方法用的是==啊。那为何String对象的equals方法竟然能比较两个不一样的对象相等呢?咱们看下String类的源码:测试
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;
}
复制代码
这样一看就明白了,String
类重写了Object
类的equals
方法,使用equals
比较String
对象变成了比较每个字符的值,因此值
相同的String对象才会相等
。this
所以,在使用equals
比较引用类型时,若是这个对象所属的类重写了equals
方法,就按照这个规则来断定。若是没有重写,那么就按照Object
类的equals
方法判断——也就是与==
号相同了。spa
注:基本数据类型与引用类型不一样,它不属于任何类,也就没有equals
方法了。code
下面看测试代码:htm
package com.eknown.basic;
/** * @author zfh * @version 1.0 * @since 2019/5/16 9:28 */
public class EqualsTest {
public static void main(String[] args) {
// 测试重写了equals方法的String类对象
System.out.println("测试重写了equals方法的String类对象");
String str1 = new String("abc"); // 注意:String str = "abc"和 str = new String("abc")是不一样的。
String str2 = new String("abc");
String str3 = new String("gcc");
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
// 测试未重写equals方法的User对象
System.out.println("测试未重写equals方法的User对象");
User user1 = new User(1, "java");
User user2 = new User(2, "python");
System.out.println(user1.equals(user2));
System.out.println(user1 == user2);
user2 = user1;
User user3 = user1;
System.out.println(user2.equals(user3));
}
}
复制代码
public class User {
private Integer id;
private String name;
User(Integer id, String name) {
this.id = id;
this.name = name;
}
// ... getters and setters
}
复制代码
运行结果:
测试重写了equals方法的String类对象
true
false
测试未重写equals方法的User对象
false
false
true
复制代码
参考:
- Matrix海子——浅谈Java中的equals和==