標籤:包含 syn name ble for ima jni 而且 amp
時間不多了,快上車。
先看Jdk8 中Java中所有對象的爸爸類Object.java。
居住地址在java.lang.
總共也沒有幾個方法,大部分還都是native方法。
順手把家底也掏了出來,
//object.c中方法static JNINativeMethod methods[] = {{"hashCode", "()I", (void *)&JVM_IHashCode},{"wait", "(J)V", (void *)&JVM_MonitorWait},{"notify", "()V", (void *)&JVM_MonitorNotify},{"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll},{"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone},};
貌似很簡單嘛。來來來,請出題。
由簡入深,請聽題
1 equals() 和 == 區別是什嗎?
沒有區別,就是對比2個引用是否相同。 obj = new Object(); Obj 引用, 暫且理解為對象的地址。
public boolean equals(Object obj) { return this==obj}
但很多時候,對使用者來說,不關心是指向了同一個對象,而是兩個內容是否長的一樣就行,比如String類。 子類繼承後要對比內容,需覆蓋override此方法。
2 equals()和hashcode()之間關係?
其實從jdk源碼上根本看不出什麼關係,沒辦法,這是面試官最愛問的問題之一。
hashcode() ,這裡討論爸爸類 Object中的。 由 JVM從對象頭裡面嘗試直接取得hashcode返回 int 類型值,通過一系列複雜運算得到,與引用不一樣。
如果hashcode不同,equals肯定不一樣,因為一個對象不能有2個不同hashcode值;反之,不成立。
equals相同,表明指向同一個對象,hashcode肯定相同;反之,不成立。
因此如果子類override equals(), 一般推薦重寫hashcode(); 原因是對象在放入容器時候,為了提升效率,利用上面的特性,優先調用hashcode,再比equals。
3 為什麼要用clone? clone 如何使用?
一般情況,通過構造方法new 一個對象。此時的對象成員變數值都是預設值,如果要複製一個長的一樣的,需要調用get/set 逐個複製。
如果而clone方法,JVM直接複製所有成員變數引用。 注意: 這是淺copy。基本類型,copy值,參考型別複製引用。
子類要實現clone,前提條件implement Cloneable, 雖然只是個空介面,JVM調用之前會做校正。
如果只是淺copy, clone(){ super.clone()}; 如果要求深層次,那必須重寫,逐個clone 裡麵包含的對象。 JAVA設計模式中prototype。
4 finalize() ?
喜歡和finally, final 關鍵字放一起。 關鍵字和方法,根本沒有關係。
這個方法主要是JVM調用,在引用回收之前調用一次。本想發揮一下的,考慮到JDK9中已經deprecated,那就算了。
5 getClass() ?
第一次遇到傳說中的 final 方法, 該方法不可以override,Class<?>返回的是帶有泛型(參數)的Class對象。
核心 : java中都是對象。 在Java中,每個class都有一個相應的Class對象. 編譯完成後,在產生的.class檔案中,就會產生一個Class對象,用於表示這個類的類型資訊。
int 應該是基本類型,不屬於(對象)參考型別,不能用new 構造, 這本身沒毛病。
基本類型卻有類類型,而且擷取類類型只有一種方式, 比如說
Class intclass = int.class;
參考型別
1 類似基本類型,靜態擷取方式
Class intclass = String.class;
2 Object.java 不是static的類方法,通過對象來調用。
Test test =new Test();test.getClass();
3 動態擷取, 運行時exception
Class.forName();
三者區別 1.類名.class 說明: JVM將使用類裝載器, 將類裝入記憶體(前提是:類還沒有裝入記憶體),不做類的初始化工作.返回Class的對象 2.Class.forName("類名字串") (註:類名字串是包名+類名) 說明:裝入類,並做類的靜態初始化,返回Class的對象 3.執行個體對象.getClass() 說明:對類進行靜態初始化、非靜態初始化;返回引用o運行時真正所指的對象(因為:子物件的引用可能會賦給父物件的引用變數中)所屬的類的Class的對象
6 線程通訊,多線程,鎖相關的 wait notify?
前提條件: 必須放在Synchronized 同步塊中使用。 產生者-消費者模式。 ReentrantLock 顯式的實現了Lock, Monitor,condition。 這些JVM隱含實現
wait notify為什麼不放入Thread類中?
不管當前哪一個線程調用執行到 obj.wait(), 當前的線程就可以進入waiting隊列,等待其他線程執行obj.notify(從頭結點取出,放入等待喚醒隊列),monitorExit (同步塊和同步方法底層公用)會調用unpark喚醒。 如果在thread類中定義,每個thread的需要相互之間知道狀態,相互notify,需要直接通訊,obj充當了共用記憶體,實現線程通訊,減少耦合。
7toString 封裝使用了class hashcode方法 略
JAVA基礎面試1 Object