源码一

来源:互联网 发布:淘宝五星好评 编辑:程序博客网 时间:2024/06/09 03:35

开始看java源码了,看了一点点。。。暂且记录下吧,总觉得,博客,还是要慢慢积累的

1.hashcode和equals的覆盖

object为了扩展,设计了些些非final方法,所以你可以覆盖,但是覆盖有他们自己的原则。

(1).equals覆盖需要满足:自反性,对称性,传递性和一致性。如果是a.equals(null):返回false不解释

(2).equals如果覆盖了,那必须覆盖hashcode,这是规定。因为你不覆盖,就没法让hashmap,hashset这些类正常的运作了。覆盖的话最好可以用:result=31*result+c。选用31是有原因的,一是素数,而是31*i==(i<<5)-i,性能好

  (3)最好也把tostring覆盖了,这样返回会更直观美好。


下面是一些源码:

(1)Integer的equals方法:比较值。hashcode方法:return 值

 public int hashCode() {
        return value;
    }

 public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

(2)String:equals方法:char v1[] = value;,然后for循环比较数组值
 * hashcode方法:先看hashcode有值没,没值就数组获取,for循环: h = 31 * h + val[i];,hash=h;
 * compareto:先比较两个数的字符,比较完了,就return len1-len2;

  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;
    }

 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;
    }

2.Integer的toString:

toString方法写的非常好,我觉得..用数组来存,先考虑值得正负来确定数组长度(负数前面要加‘-’,所以size+1).然后除以值,来获取每一位数。但这里用了移位来代替乘法,用了乘法+移位来代替除法。经我自己测验,乘法+移位来代替除法,都计算int最大值次。速度快了8.5倍。建议自己去翻看源码,因为用到了好几个其他的数组值。只贴一部分看不懂。但这个,可以分析:

 // really: r = i - (q * 100);
            r = i - ((q << 6) + (q << 5) + (q << 2));

移位=64+32+4=100...

 r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...

q = (i * 52429) >>> (16+3); //q=q/10

  public static String toString(int i) {
        if (i == Integer.MIN_VALUE)
            return "-2147483648";
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
        char[] buf = new char[size];
        getChars(i, size, buf);
        return new String(buf, true);
    }

0 0
原创粉丝点击