java重写string类_java中String类重写的equals及hashcode方法 骑猪看日落 2022-11-05 15:57 218阅读 0赞 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, 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可以高效的进行计算。
还没有评论,来说两句吧...