java中String类重写的equals及hashcode方法
程序员文章站
2022-03-15 20:34:53
...
equals方法:
public boolean equals(Object anObject) {
//如果为同一对象的不同引用,则返回true
if (this == anObject) {
return true;
}
//判断该对象是否是String的实例
if (anObject instanceof String) {
//强转为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;
}
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
//value为String定义的字符数组,在构造方法里初始化
private final char value[];
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;
}
String源码里选择的质数31,31有什么特殊的含义呢?
JVM里最有效的计算方式就是进行位运算。31 * i = (i << 5) - i(左边 31*2=62,右边 2*2^5-2=62), 两边相等,JVM可以高效的进行计算。
推荐阅读
-
java中hashCode方法与equals方法的用法总结
-
java中hashCode、equals的使用方法教程
-
java中hashCode方法与equals方法的用法总结
-
java中hashCode、equals的使用方法教程
-
荐 java父类-Object类-equals与==-方法的重载和重写-游离块-this关键字
-
java中重写equals()方法的时候为什么要重写hashCode()方法?
-
Java中为什么要重写hashCode方法和equals方法?
-
Java的String类中的startsWith方法和endsWith方法
-
java开发中object类中的hashcode()方法使用
-
Java:object类 中常用equals()和 toString()方法的重写