JDK 原始碼分析(1) Object類

weixin_34128411發表於2018-09-05

Object類是頂級父類,java中所有的類都是Object的子類

public final native Class<?> getClass();

getClass()是一個final方法,不能被子類重寫,並且呼叫了本地方法

@Test
    public void test1(){
        String s = "123";
        System.out.println("1233".getClass() == String.class); //true
        Class<? extends String> aClass = s.getClass();
        Number i = 1;
        Class<? extends Number> aClass1 = i.getClass();
        System.out.println(aClass); // java.lang.String
        System.out.println(aClass1); // java.lang.Integer
    }

Returns the runtime class of this {@code Object}.
返回當前執行時期的Class物件而1被預設了Integer型別

public native int hashCode();
相同物件的hash值一定相同

  1. 相同的物件在同一個程式中hashCode()方法一定返回相同的值,前提下是這個物件沒有發生改變
  2. 如果兩個物件equals方法相同,那麼他們的hashCode值一定相同
  3. 兩個不同的物件(equalsn不相同),hashCode()沒有必要不相同,但是對於hashtable的效能來說,hashCode不同,會提高效能

Integer中覆寫的hashCode() 直接返回數值;

 public static int hashCode(int value) {
            return value;
    }

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

計算標準是
s[0]31^(n-1) + s[1]31^(n-2) + … + s[n-1]
s[0]是第一個字串,s[n-1]是最後一個字串
通常一個物件我們要重寫hashcode和equals方法

public boolean equals(Object obj) {
return (this == obj);
}

兩個非空物件的引用是否相同 物件的引用
物件的引用相同,那麼這兩個物件相同

protected native Object clone() throws CloneNotSupportedException;

clone()幾乎沒用過todo

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

toString()方輸出類的名字加上hashcode的16進位制


剩下的TODO
執行緒方面一直沒有研究列入週末學習的計劃補上

相關文章