@TryLoveCatch
2021-04-07T20:39:17.000000Z
字数 2561
阅读 802
java
java基础
hashcode
如何重写hashCode算法
hashCode 方法及 equals 方法的规范
关于相应的哈希算法,一个简单的算法如下:
组合公式:result = 31 * result + c
比如,String 类的 hashCode 方法如下(JDK 1.8):
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;
}
除了遵循这三原则之外,还要遵循:
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
value是一个char类型的数组,用于存放字符串中的每个字符
判断条件:
若当前对象和比较的对象是同一个对象,即return true。也就是Object中的equals方法。
若当前传入的对象是String类型,则比较两个字符串的长度,即value.length的长度。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = length();
if (n == anotherString.length()) {
int i = 0;
while (n-- != 0) {
if (charAt(i) != anotherString.charAt(i))
return false;
i++;
}
return true;
}
}
return false;
}
对于深拷贝来说,不仅要复制对象的所有基本数据类型的成员变量值,还要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。
通过重写clone方法来实现深拷贝
每一层的每个对象都进行浅拷贝=深拷贝。最后在最顶层的类的重写的clone方法中调用所有的clone方法即可实现深拷贝
通过对象序列化实现深拷贝
将对象序列化为字节序列后,默认会将该对象的整个对象图进行序列化,再通过反序列即可完美地实现深拷贝。
要注意的是,如果某个属性被transient修饰,那么该属性就无法被拷贝了。