記一次面試經歷分享
筆試題目:
執行緒的實現方式?如何實現執行緒同步?
執行緒實現方式:
- 實現runnable介面,並實現該介面的run()方法。
以下是主要步驟:
- 自定義類並實現Runable介面,實現run()方法。
- 建立Thread物件,用實現Runable介面的獨享作為引數例項化該Thread物件。
- 呼叫Thread的start()方法;
class MyThread implements Runnable{ //建立執行緒類 public void run(){ System.out.println("Thread Body"); } } public class Test{ public static void main(String[] args){ MyThread thread = new MyThread(); Thread t = new Thread(thread); t.start();//啟動執行緒 } }
- 繼承Thread類,重寫run方法。
class MyThread extends Thread{
public void run(){
System.out.println("Thread Body");
}
}
public class Test{
public static void main(String[] args){
MyThread thread = new MyThread();
thread.start();
}
}
- 實現Callable介面,重寫call方法。
import java.util.concuurent.*; public class CallableAndFuture{//建立執行緒類 public static class CallableTest implements Callable<String>{ public String call() throws Exception { return "Hello World"; } } public static void main(String[] args){ ExecutorService threadPool = Executors.newSingleThreadExecutor(); //啟動執行緒 Future<String> future = threadPool.submit(new CallableTest()); try{ System.out.println("waiting thread to finish"); System.out.println(future.get()); //等待執行緒結束,並獲取返回結果 }catch(Exception e){ e.printStackTrace(); } } }
執行緒同步的實現:
在我們回答這個問題之前,我們先來想一下為什麼要使用同步呢?Java允許多執行緒併發控制,當多個執行緒同時操作一個可共享的資源變數時(如資料的增刪改查),將會導致資料不準確,相互之間產生衝突,因此加入同步鎖可以避免在該執行緒沒有完成操作之前,被其它執行緒的呼叫,從而保證了該變數的唯一性和準確性。
1.同步方法
使用synchronized關鍵字修飾的方法。由於java的每個物件都由一個內建鎖,當用此關鍵字修飾方法時,內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。
注:synchronzied關鍵字也可以修飾靜態方法,此時如果呼叫該靜態方法,將會鎖住整個類。
2.同步程式碼塊
即有synchronized關鍵字修飾打的語句塊。
被關鍵字修飾的語句塊會自動被加上內建鎖,從而實現同步。
注:同步是一種高開銷的操作,因此應該儘量減少同步的內容。通常沒有必要同步整個方法,使用synchronized程式碼同步關鍵程式碼即可。
其他的實現同步方法
使用特殊域變數(volatile)實現執行緒同步;使用重入鎖實現執行緒同步;使用區域性變數實現執行緒同步;使用阻塞佇列實現執行緒同步;
使用原子變數實現執行緒同步。
常見的檔案讀取方式?
java讀取檔案方法常見的方法:
- 按位元組讀取檔案內容
- 按字元讀取檔案內容
- 按行讀取檔案內容
- 隨機讀取檔案內容
gc機制的簡單介紹?
這個博主還是菜雞,關於垃圾回收機制沒具體瞭解過。大家可以自行google。
react的生命週期及執行順序?
簡單介紹一下工廠模式和單例模式?
博主的另外一篇部落格中有詳細的介紹。
單例模式大家可以看下《劍指offer》中,有一個對單例模式的詳細介紹。
error和Exception分別是什麼?它們有什麼區別?checked和unchecked是什麼?
Error和Exception都繼承自Throwable類。
二者的不同之處:
Exception:1.可以是可被控制(checked)或者不可控制的(unchecked)。
2.表示一個由程式設計師導致的錯誤。
3.應該在應用程式級被處理。
Error:1.總是不可控制的(unchecked);
2.經常用來用於表示系統錯誤或低層資源的錯誤。
3.如何可能的話,應該在系統級被捕捉。
Java 中定義了兩類異常:
1) Checked exception: 這類異常都是Exception的子類 。異常的向上丟擲機制進行處理,假如子類可能產生A異常,那麼在父類中也必須throws A異常。可能導致的問題:程式碼效率低,耦合度過高。
2) Unchecked exception: 這類異常都是RuntimeException的子類,雖然RuntimeException同樣也是Exception的子類,但是它們是非凡的,它們不能通過client code來試圖解決,所以稱為Unchecked exception 。
List、Set以及Map的區別是什麼?有什麼具體的實現?
List:1.可以允許重複的物件。
2.可以插入多個null元素。
3.是一個有序容器,保持了每個元素的插入順序,輸出的順序就是插入的順序。
4.常用的實現類有 ArrayList、LinkedList 和 Vector。ArrayList 最為流行,它提供了使用索引的隨意訪問,而 LinkedList 則對於經常需要從 List 中新增或刪除元素的場合更為合適。
Set:1.不允許重複物件
2. 無序容器,你無法保證每個元素的儲存順序,TreeSet通過 Comparator 或者 Comparable 維護了一個排序順序。
3. 只允許一個 null 元素
4.Set 介面最流行的幾個實現類是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基於 HashMap 實現的 HashSet;TreeSet 還實現了 SortedSet 介面,因此 TreeSet 是一個根據其 compare() 和 compareTo() 的定義進行排序的有序容器。
1.Map不是collection的子介面或者實現類。Map是一個介面。
2.Map 的 每個 Entry 都持有兩個物件,也就是一個鍵一個值,Map 可能會持有相同的值物件但鍵物件必須是唯一的。
3. TreeMap 也通過 Comparator 或者 Comparable 維護了一個排序順序。
4. Map 裡你可以擁有隨意個 null 值但最多隻能有一個 null 鍵。
5.Map 介面最流行的幾個實現類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
什麼時候用finally?什麼時候用final?
Herbinate的意義是什麼?怎麼樣實現一對一和一對多的配置?
Spring中的控制反轉?
用XML和JSON寫出下面的需求。某公司有兩個專案分別是XMA和XMB,XMA的專案經理為張三,有兩個開發員工為甲、乙,XMB的專案經理為李四,有兩個開發員工為丙、丁。
JSON格式:
{
"project1": {
"project_name": "XMLA",
"PM": "張三",
"SE": ["甲",
"乙"
]
},
"project2": {
"project_name": "XMLB",
"PM": "李四",
"SE": ["丙",
"丁"
]
}
}
XML格式
<Company>
<project_A>
<project_name>XMLA</project_name>
<PM>張三</PM>
<SE>甲</SE>
<SE>乙</SE>
</project_A>
<project_B>
<project_name>XMLB</project_name>
<PM>李四</PM>
<SE>丙</SE>
<SE>丁</SE>
</project_B>
</Company>
總體來說還行,加油吧,騷年。