文章目录
Object常用方法总结
1、clone()
protected native Object clone() throws CloneNotSupportedException;
方法说明:将现有对象克隆一份出来,Object.clone()默认是浅拷贝。
返回一个Object类型的对象。
浅拷贝:
当被拷贝对象中存在引用类型的属性的时候,clone()方法拷贝的是引用地址,
当改变克隆出来的对象中的引用类型的值时,被拷贝对象中对应的引用类型得值也会被改变。
深拷贝:
当被拷贝对象中存在引用类型的属性又需要深拷贝时,
需要被拷贝对象实现Cloneable接口重写clone()方法。
在clone()方法内部调用引用类型的clone()方法拷贝一份赋值给新的对象。
补充:
通过clone()方法进行深拷贝的时候,如果对象引用类型的属性非常多且层次比较深的话,
每个类都要重写clone方法太过繁琐了,可以通过序列化和反序列化实现深拷贝,(需要实现Serializable接口)
需要注意的是,如果某一个属性被transient修饰了的话,那么该属性就无法被拷贝了。
2、equals()
public boolean equals(Object obj) {
return (this == obj);
}
方法说明:检测两个对象是否相等。在Object类中,这个方法判断的是两个对象是否具有相同的引用,但是对于大多数类来说, 这种判断没有任何意义,所以说有很多方法都重写了equals()方法,自定义了对象相等的条件。
自定义equals方法应有特性:
1.自反性
对于任何非空引用x,x.equals(x)始终都应该返回true。
2.对称性
对于任何引用x和y,当且仅当x.equals(y)返回为true时,y.equals(x)才能返回true。
3.传递性
对于任意引用x,y,z ,如果x.equals(y)和y.equals(z)都为true,则x.equals(z)也应该为true。
4.一致性
如果x和y引用的对象没有发生变化反复调用x.equals(y)返回的结果应该是一样的。
String中重写的equals()方法
public boolean equals(Object anObject) {
if (this == anObject) { //如果引用地址都一样,那肯定是同一个对象,直接返回true。
return true;
}
if (anObject instanceof String) { //判断anObject对象是否属于String类。
String anotherString = (String)anObject;//属于就强转一下不属于直接返回false。
int n = value.length;
if (n == anotherString.value.length) {//判断anObject与调用者长度是否相同,相同就将两者的char数组逐个对比有一个不一样直接返回false,长度不相等直接返回false。
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;
}
3、hashCode() (散列码)
public native int hashCode();
方法说明:由于hashCode()方法在Object中有定义,所以每一个对象都有一个对应的散列码,其值为对象的存储地址。
注意:
如果重写了equals()方法,则也必须重新定义hashCode()方法,以便用户可以将对象存储到散列表中。(提高将数据存入HashSet、HashMap.......中时,判断存入对象与已存入对象是否相等的速度。参考源码有助于理解)
字符串s与t拥有相同的散列码,是因为字符串的散列码是由内容计算出的。
String中的hashCode()方法
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
4、equals()与hashCode()方法总结
1.通过equals判断两个对象相等,则两个对象的hashCode()返回的值必须相等。
2.重写equals()和hashCode()后,如果两个对象的hashCode()值相等,并不能作为这两个对象相等的条件,此时还需要调用equals()方法,判断对象是否相等。
3.如果两个对象的hashCode()值不相等,则这两个对象一定不相等。(Map中就是先判断hashCode是否相等,不相等直接返回flast,相等则再通过equals()判断,因为hashCode性能比equals好)
5、 toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
方法说明:
它用于返回表示对象值的字符串。
一般都会在自定义类中重写toString方法,方便日志记录。
6、finalize() (垃圾回收机器也叫GC)
方法说明 :
当对象不再被程序所使用时,垃圾回收机器将会将其回收。
垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize()方法。
GC主要针对堆内存。
protected void finalize() throws Throwable { }