equals()方法
作用:返回两个对象是否相等
引入问题:
equals() 与 == 的区别
== 的使用:
- == 是运算符,可以使用在基本数据类型和引用数据类型变量中。
- 用在基本数据类型时,比较两个变量保存的数据是否相等
(二者类型不一定相同,boolean型不能够参与==运算)。 - 用在引用数据类型变量,比较的是两个变量的地址值是否相同,
即两个引用是否指向同一个对象实体。
equals()方法的使用:
- equals()是Object对象的方法,只适用于引用数据类型,若要调用必先创建对象。
- Object中的equals()方法: 与 == 是相同的,都是比较两个对象的地址值是否相同。
public boolean equals(Object obj)
{
return (this == obj);
}
所以下面的代码会返回false
Man m1 = new Man("John", 21);
Man m2 = new Man("John", 21);
System.out.println(m1.equals(m2)); // false
// 其实等价于 m1 == m2
但是!下面的代码中:会返回true
String s1 = new String("yes");
String s2 = new String("yes");
System.out.println(s1.equals(s2)); //true
这是因为String中重写了Object的equals方法,不再是比较两个变量的地址了。
- 像String,File,Data,包装类等,重写了equals()方法,为比较对象的实体内容是否相同。
重写equals方法
通常情况下自定义类中的equals方法需要返回两个对象的实体内容是否相同,
也就是说需要重写equals方法。
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
// 若两个对象地址一样,内容一定一样
if(obj instanceof Person)
{
Person p = (Person)obj;
// 判断该对象能否转型成Person
// 若不能,连实体内容都无法访问,更别说比较大小
return p.name == this.name && p.age == this.age;
}
return false;
}
自动生成equals重写方法
Alt+Insert
选择参数即可自动生成。
总结: == 与equals() 的区别
- == 是运算符,可以比较基本数据类型和引用数据类型的变量。前者比较的是变量中保存的数据是否相等(两个数据可以不同类型,布尔类型不能参与这种运算),后者比较两个变量地址值是否相同。
- equals() 是Object类中的方法之一,只能用于引用数据类型。它本身的作用(和==在引用数据类型中作用一样)是比较两个对象的地址值是否相同,但是该方法可以被重写(如String类,Date类等)为比较实体属性的值。
toString() 方法
- 当输出对象的引用值时,其实就是调用了对象的toString方法。
Person p1 = new Person("at",11);
System.out.println(p1);
System.out.println(p1.toString());
// 后两行其实是一样的。
// 输出格式为:com.java.oop.demo01.Person@17df9
- Object类中toString的定义为:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
// 调用该方法的类的类名 @ 对象在堆空间的地址转为16进制
- 同理,一些类也重写了该方法,使其能输出实体内容的值。
- 再次同理,可以用Alt+Insert自动生成toString方法。