Object 包含的 tostring 和 equals 的重载 及 == 和 equals 的区别
一、Object 类的主要方法
public final Class<?> getClass()
返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
public int hashCode()
返回该对象的哈希码值。
public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
public String toString()
返回该对象的字符串表示。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
二、getClass
public final Class<?> getClass()
返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
三、toString
public String toString()
返回该对象的字符串表示。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
四、equals
Object对象的equals方法的实现:
public boolean equals(Object obj)
{
return (this == obj);
}
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。
Java 语言里的 equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equal的。
五、== 和 equals
==:
如果操作的是基本数据类型的数据,是比较 数值是否相等
如果操作的是引用数据类型的数据,是比较 地址值是否相等
equals:
只能够比较引用数据类型的数据, 默认比较的是地址值是否相等
默认的比较方式通常来说是没有意义的。需要重写此方法,让它来比较两个对象中的内容是否一致。
equals 的重写方法的比较过程是如何的?
1: 比较两个对象的地址值
2: 比较两个对象的长度
3: 比较两个对象的内容
实际上JDK中,String、Math等封装类都对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 (i < n) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
在覆写 equals 时推荐使用 getClass 进行类型判断,而不是使用instanceof。因为对于 instanceof 运算符,当前面对象是后面类的实例 或 其子类的实例时都返回 true 。
class Student { private int id; private String name; public Student() { } public Student(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } public boolean equals(Object obj) { if (this == obj) return true; if (obj != null && obj.getClass() == Student.class) { Student newStudent = (Student) obj; // if (this.getId() == newStudent.getId() && this.getName().equals(newStudent.getName())) if (this.getId() == newStudent.getId()) return true; } return false; } } public class AboutObject { public static void main(String[] args) { int i = 98; float f = 98.0f; char c = 'b'; System.out.println((i == f) ? i + " == " + f : i + " != " + f); System.out.println((i == c) ? i + " == " + c : i + " != " + c); String st1 = new String("你好"); String st2 = new String("你好"); System.out.println((st1 == st2) ? st1 + " == " + st2 : st1 + " != " + st2); System.out.println((st1.equals(st2)) ? st1 + " equal " + st2 : st1 + " don't equal " + st2); String s1 = "你好吗?"; String s2 = "你好"; String s3 = "吗?"; String s4 = "你好" + "吗?"; String s5 = "你" + "好" + "吗?"; String s6 = s2 + s3; String s7 = new String("你好吗?"); System.out.println((s1 == s4) ? s1 + " == " + s4 : s1 + " != " + s4); System.out.println((s1 == s5) ? s1 + " == " + s5 : s1 + " != " + s5); System.out.println((s1 == s6) ? s1 + " == " + s6 : s1 + " != " + s6); System.out.println((s1 == s7) ? s1 + " == " + s7 : s1 + " != " + s7); Student stu1 = new Student(1, "孙悟空"); Student stu2 = new Student(2, "孙悟空"); Student stu3 = new Student(1, "孙大圣"); System.out.println((stu1.equals(stu2)) ? stu1.getName() + " equal " + stu2.getName() : stu1.getName() + " don't equal " + stu2.getName()); System.out.println((stu1.equals(stu3)) ? stu1.getName() + " equal " + stu3.getName() : stu1.getName() + " don't equal " + stu3.getName()); } }
运行结果:
98 == 98.0 98 == b 你好 != 你好 你好 equal 你好 你好吗? == 你好吗? 你好吗? == 你好吗? 你好吗? != 你好吗? 你好吗? != 你好吗? 孙悟空 don't equal 孙悟空 孙悟空 equal 孙大圣
浙公网安备 33010602011771号