1.==:两个对象的内存地址是否相等;equals:两个对象的值是否相等
2.对象类型分为以下两种:基本数据类型和引用数据类型
基本数据类型的比较:==,没有equals方法,即==比较的是值
引用数据类型:==,equals
注意的是equals方法,下面的例子中说明:
a.使用new的对象,是一个引用,代表一个内存地址
b.没有new的对象,代表一个常量池,==和equals比较的结果是一致的
Integer x = 2;
Integer y = 2;
System.out.println("x和y内存相等"+(x==y));
System.out.println("x和y值相等"+x.equals(y));
Integer z = new Integer(2);
System.out.println("x和z内存相等"+(x==z));
System.out.println("x和z值相等"+x.equals(z));
String st1 = new String("橙色1");
String st2 = new String("橙色1");
System.out.println("st1和st2内存相等"+(st1==st2));
System.out.println("st1和st2值相等"+st1.equals(st2));
String str1 = "橙色1";
String str2 = "橙色1";
System.out.println("str1和str2内存相等"+(str1==str2));
System.out.println("str1和str2值相等"+str1.equals(str2));
执行结果:
x和y内存相等true
x和y值相等true
x和z内存相等false
x和z值相等true
st1和st2内存相等false
st1和st2值相等true
str1和str2内存相等true
str1和str2值相等true
c.引用数据类型:Integer、String都重写了equals方法(Object的equals方法)
对象 | equals |
Object | public boolean equals(Object obj) { return (this == obj); } |
Integer | public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; } |
String | public boolean equals(Object anObject) { if (this == anObject) { return true; } return (anObject instanceof String aString) && (!COMPACT_STRINGS || this.coder == aString.coder) && StringLatin1.equals(value, aString.value); } |
d.如果是自定义类,equals比较时:下面代码构造方法创建的两个对象equals比较时是false,即使值是相等的。所以要参照上面Integer、String类一样重写equals方法
public class Person {
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person("Jim",25);
Person p2 = new Person("Jim",25);
System.out.println("两个person内存相等"+(p1==p2));
System.out.println("两个person值相等"+p1.equals(p2));
}
}
执行结果:
两个person内存相等false
两个person值相等false
e.重写equals方法如下,再重新执行Test.java
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj instanceof Person) {
Person p = (Person)obj;
if(this.name.equals(p.name)) {
return true;
}
}
return false;
}
public int hashCode() {
return this.name.hashCode();
}
执行结果:
两个person内存相等false
两个person值相等true