java面試準備2

Comparable接口和Comparator接口的作用?

答:

Comparable接口:

也叫做可比較接口,這個接口在java.lang包下,只要根據指定類型的排序規則實現了這個接口,就是可排序的。這個接口中只定義了一個 compareTo(Object o) 方法,該方法的返回值類型是整型,如果當前對象大於參數對象就返回正數,當前對象等於參數對象就返回0,當前對象小於參數對象就返回負值,這樣寫就是升序排列,反之則是進行降序排列。

Comparator接口:

比較器Comparator接口,是另一種對自定義類型對象的集合整體排序的方法,存在於java.util包下。這個接口中定義了一個 compare(Object o1,Object o2) 方法來比較兩個對象,這個方法的返回值定義和上面介紹的那個方法是一樣。利用這種方式,則在創建集合的時候把定義好的比較器作爲參數,構造一個集合。

一次搞定內部類?

答:

1、靜態內部類:靜態內部類定義在類中,任何方法外,用static修飾

靜態內部類只能訪問外部類的靜態成員。
在外部類的外部,要創建一個靜態內部類對象不需要外部類對象:
Outer.Inner in = new Outer.Inner();
在本類內部生成內部類對象的方式:
Inner in = new Inner();
2、成員內部類:作爲外部類的一個成員存在,與外部類的屬性、方法並列
在內部類中可以直接訪問外部類的私有屬性。
內部類和外部類的實例變量允許命名衝突。
在內部類中訪問實例變量:this.屬性
在內部類訪問外部類的實例變量:外部類名.this.屬性
在外部類的外部,要創建一個成員內部類對象,要首先建立一個外部類對象,然後再創建一個成員內部類對象。
Outer out = new Outer();
Outer.Inner in = out.new Inner();
在本類內部生成內部類對象的方式:
在靜態方法中:Inner in = new Outer().new Inner();
在非靜態方法中:Inner in = this.new Inner();
成員內部類不可以有靜態成員,這是因爲靜態屬性是在加載類的時候創建,這個時候內部類還沒有被創建。
3、局部內部類:在外部類的方法中定義的內部類
與局部變量類似,在局部內部類前不可以加修飾符public和private,其作用域爲定義它的代碼塊。
局部內部類不僅可以訪問外部類的實例變量,還可以訪問外部類的局部變量,但要求外部類的局部變量必須爲final的。
配合接口使用,來做到強制弱耦合。
在外部類的外部不可創建局部內部類對象,只能在局部內部類所在的方法中創建:
Inner in = new Inner();
4、匿名內部類:一種特殊的局部內部類
沒有名字,也沒有class、extends、implements關鍵字
用一種隱含的方式實現一個接口或繼承一個類,並且只能創建一次實例。
實現方式:在某個語句中,new 父類/父接口名字(){ 類體中實現方法 }
例如:
TreesSet ts = new TreeSet(new Comparator(){
public int compare(Object o1, Object o2){
return 0;
}
});
匿名內部類屬於局部內部類,那麼局部內部類的所有限制都對其生效。
匿名內部類是唯一一種無構造方法的類,因爲構造器的名字必須合類名相同,而匿名內部類沒有類名。

線程的生命週期?

答:

1)初始狀態:此時線程只是處於JVM進程中,只是創建了一個線程對象,並沒有真正開始運行。
2)可動行狀態:調用線程對象的start()方法,此時線程才真正的被創建,進入可運行狀態,等待CPU的調度。“萬事俱備,只欠CPU”。
3)運行狀態:正在運行的線程,此時它擁有CPU的執行權。
4)阻塞狀態:運行狀態中的線程,如果正在等待用戶輸入或調用了sleep()和join()等方法都會導致線程進入阻塞狀態,注意從阻塞狀態出來的線程不一定馬上回到運行狀態,而是重新回到可運行狀態,等待CPU的再次調度。
5)等待隊列狀態:一個線程調用一個對象的wait()會自動放棄該對象的鎖標記,進入等待隊列狀態,只有當有另外一線程調用臨界資源的notify()或notifyAll()方法,建議多使用notifyAll(),纔會將等待隊列中的線程釋放,此線程進入鎖池狀態。
6)鎖池狀態:每個對象都有互斥鎖標記,以防止對臨界資源的訪問造成數據的不一致,和數據的不完整性。一個線程擁有一個對象的鎖標記後,另一線程想訪問該對象,必須在鎖池中等待。由系統決定哪個線程拿到鎖標記並運行。注意從鎖池狀態出來的線程不是馬上回到運行狀態,而是重新回到可運行狀態,等待CPU的再次調度。
7)終止狀態:一個線程運行結束後稱爲終止狀態,一個進程中只有所有的線程退出後纔會終止。

如何得到集合的線程安全的集合?

答:

Collections類中的synchronizedXxxx(Xxxx ss)方法可以得到相應集合的線程安全的集合。

線程同步要注意的事項?

在同步語句塊中不能直接操作對象鎖正在使用的對象。
對象與鎖一一對應。
同步依賴對象鎖,鎖對象相同,同步語句串行,鎖對象不同,同步語句並行。
順序鎖,不要回調,反向打開。
能不用同步就不用同步,有數據共享衝突時才使用同步。

什麼情況下釋放鎖?
答:

同類代碼執行完畢。
異常未處理,錯誤退出。
調用wait()。
相關方法:
1) wait():交出鎖和CPU的佔用; 
2) notify():將從對象的等待池中移走一個任意的線程,並放到鎖池中,那裏的對象一直在等待,直到可以獲得對象的鎖標記。 
3) notifyAll(): 將從等待池中移走所有等待那個對象的線程並放到鎖池中,只有鎖池中的線程能獲取對象的鎖標記,鎖標記允許線程從上次因調用wait()而中斷的地方開始繼續運行。
注意: 用notifyAll()取代notify(),因爲在調用notify()方法時,是由系統決定釋放出哪個線程。

只能對加鎖的資源進行wait()和notify()。
判斷是否進行等待wait()時,用while代替if來進行判斷。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章