Java - 所有类的父类Object类
Java中所有的方法都是object类提供的。
在object类中有三个方法比较重要,分别是:toString(); equals(); hasdCode();
1)toString()方法
toString()方法在Java中的原码为:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
原码中可见当对象调用toString方法时,后面输出的是hashCode值。
2)equals()方法
equals() 方法在Java中的原码:
public boolean equals(Object obj) {
return (this == obj);
}
之后在创建类时,对象之间调用equals方法进行比较时,如果不重写则调用的是Object类中的方法,比较的是地址。但是如果要比较的是内容,则必须重写equals方法。
当创建String类型的对象,并且两个对象进行比较时,用String类型的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;
}
在String类中Java本身对equals方法已经进行了重写,所以当使用String创建对象并进行对象的内容比较时,直接使用的是Java对String中的equals方法已经重写的方法,直接调用就行。而当自己创建的类对象进行比较内容时,必须自己重写equals方法。当然在后期中,Java框架就对equals方法进行了重写,就不必自己亲自写。
3)hashCode()方法
hashCode() 方法在Java中的原码
public native int hashCode();
hashCode() 看不懂,对,就是。Java不想让咱们看。
我们对hashCode() 方法的理解:
hash算法是一种不可逆的过程,将数字按照某种特定的过程(自己定义或已有的算法),将数字排列成某种代替它不可逆的值。在equals方法中判断hashCode值,是因为当hashCode值不相等时,类的对象肯定不同,后面的代码则不需判断。而值相等时,有可能存在按照某种算法,使得不同的对象hashCode值相等,则需判断后面的代码。hashCode值是对象特征值的编码。hashCode值也是做判断的过程。
4)equals方法与hashCode方法的使用
class ObservObject {
private int age;
private String name;
public ObservObject() {}
public ObservObject(int age, String name) {
this.age = age;
this.name = name;
}
public boolean equals(Object o) {
if(this == o) {
return true;
}
if(o instanceof ObservObject) {
ObservObject that = (ObservObject)o;
if(o == null || this.hashCode() != that.hashCode()) {
return false;
}
if(this.age != that.age) {
return false;
}
if(!this.name.equals(that.name)) {
return false;
}
return true;
} else {
return false;
}
}
//随便写,写的过程符合两个特点:代替,不可逆
public int hashCode() {
int code = 0;
code = code + this.age*31 + 31;
return code;
}
}
public class instanceofDemo {
public static void main(String[] args) {
ObservObject oo1 = new ObservObject(23,"李四");
ObservObject oo2 = new ObservObject(23,"李四");
System.out.println(oo1.equals(oo2));
}
}
"C:\Program Files\Java\jdk1.8.0_172\bin\java.exe" ...
true
Process finished with exit code 0
在Object中,就只有这三个方法才会被使用到。也就只有这三个方法重要!
欢迎大家评论,留言。谢谢