1. 程式人生 > >記一次面試經歷分享

記一次面試經歷分享

筆試題目:

執行緒的實現方式?如何實現執行緒同步?

執行緒實現方式:

  • 實現runnable介面,並實現該介面的run()方法。

以下是主要步驟:

  1. 自定義類並實現Runable介面,實現run()方法。
  2. 建立Thread物件,用實現Runable介面的獨享作為引數例項化該Thread物件。
  3. 呼叫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讀取檔案方法常見的方法:

  1. 按位元組讀取檔案內容
  2. 按字元讀取檔案內容
  3. 按行讀取檔案內容
  4. 隨機讀取檔案內容

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>

總體來說還行,加油吧,騷年。