螞蟻金服HR電話面

一、先自我介紹一下。程序員

二、問到項目問題。(項目介紹,用到哪些技術,如何測試的。)算法

三、一些基礎知識。安全

  a) list、map、set是繼承了collection的嗎? 性能優化

   

  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() 的定義進行排序的有序容器。

  Map:1.Map不是collection的子接口或者實現類。Map是一個接口。

    2.Map 的 每一個 Entry 都持有兩個對象,也就是一個鍵一個值,Map 可能會持有相同的值對象但鍵對象必須是惟一的。

    3. TreeMap 也經過 Comparator  或者 Comparable 維護了一個排序順序。

    4. Map 裏你能夠擁有隨意個 null 值但最多隻能有一個 null 鍵。

    5.Map 接口最流行的幾個實現類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最經常使用)

  b) 進程和線程多線程

    1)調度。線程是獨立調度的基本單位;進程是擁有資源的基本單位。同一進程中,線程的切換不會引發進程切換,不一樣進程中線程切換,會引發進程切換。併發

    2)擁有資源。進程是擁有資源的基本單位,線程能夠訪問隸屬進程的系統資源。ide

    3)併發性。進程之間可併發,線程也可,使操做系統有更好的併發性,提升系統吞吐量。post

    4)系統開銷。建立撤銷進程時系統爲之分配或回收資源,如內存空間,I/O設備。遠大於線程開銷。在進程切換時,涉及當前執行進程CPU環境的保存及新調度到進程CPU環境的設 置,線程切換時需保存和設置少許寄存器內容,開銷小。此外,同一進程內的多線程共享進程的地址空間,所以線程間同步與通訊很容易。性能

    5)地址空間和其餘資源。進程的地址空間相互獨立,同一進程的各線程間共享進程的資源,某進程內的線程對於其它進程不可見。測試

    6)通訊方面。進程間通訊(IPC)須要進程同步與互斥手段的輔助,保證數據的一致性,而線程間可直接讀/寫進程數據段(如全局變量)來進行通訊。

  

  c)overload和override

    一、方法的覆蓋是子類和父類之間的關係,是垂直關係;方法的重載是同一個類中方法之間的關係,是水平關係。

 

    二、覆蓋只能由一個方法,或只能由一對方法產生關係;方法的重載是多個方法之間的關係。

 

    三、覆蓋要求參數列表相同;重載要求參數列表不一樣。

 

    四、覆蓋關係中,調用那個方法體,是根據對象的類型來決定;重載關係,是根據調用時的實參表與形參表來選擇方法體的。

  

  d) hashmap和hashtable

    HashMap 是線程不安全的,HashMap 是一個接口,是 Map的一個子接口,是將鍵映射到值得對象,不容許鍵值重複,容許空鍵和空值;因爲非線程安全, HashMap的效率要較 HashTable 的效率高一些. 

    HashTable 是線程安全的一個集合,不容許 null 值做爲一個 key 值或者 Value 值;
    HashTable 是 sychronize(同步化),多個線程訪問時不須要本身爲它的方法實現同步,而 HashMap 在被多個線程訪問的時候須要本身爲它的方法實現同步;   

           

    主要體如今:線程安全性,同步(synchronization),以及速度。

  1. HashMap幾乎能夠等價於Hashtable,除了HashMap是非synchronized的,並能夠接受null(HashMap能夠接受爲null的鍵值(key)和值(value),而Hashtable則不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,這意味着Hashtable是線程安全的,多個線程能夠共享一個Hashtable;而若是沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
  3. 另外一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。因此當有其它線程改變了HashMap的結構(增長或者移除元素),將會拋出ConcurrentModificationException,但迭代器自己的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並非一個必定發生的行爲,要看JVM。這條一樣也是Enumeration和Iterator的區別。
  4. 因爲Hashtable是線程安全的也是synchronized,因此在單線程環境下它比HashMap要慢。若是你不須要同步,只須要單一線程,那麼使用HashMap性能要好過Hashtable。
  5. HashMap不能保證隨着時間的推移Map中的元素次序是不變的。

  

  e) sleep和wait    

    一、這兩個方法來自不一樣的類分別是,sleep來自Thread類,和wait來自Object類。sleep是Thread的靜態類方法,誰調用的誰去睡覺,即便在a線程裏調用了b的sleep方法,實際上仍是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep。

    二、最主要sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其餘線程可使用同步控制塊或者方法。sleep不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其餘線程能夠佔用CPU。通常wait不會加時間限制,由於若是wait線程的運行資源不夠,再出來也沒用,要等待其餘線程調用notify/notifyAll喚醒等待池中的全部線程,纔會進入就緒隊列等待OS分配系統資源。sleep(milliseconds)能夠用時間指定使它自動喚醒過來,若是時間不到只能調用interrupt()強行打斷。Thread.Sleep(0)的做用是「觸發操做系統馬上從新進行一次CPU競爭」。

    三、使用範圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep能夠在任何地方使用  
     synchronized(x){  
          x.notify()  
         //或者wait()  
     }

    四、sleep必須捕獲異常,而wait,notify和notifyAll不須要捕獲異常

  

  f) exception和error

  Error和Exception都繼承自Throwable;

  兩者不一樣之處:

  Exception:

  1.能夠是可被控制(checked)或者不可控制(unchecked);

  2.表示一個由程序員致使的錯誤;

  3.應該在應用程序級被處理; 

  Error:

  1.老是不可控制的(unchecked);

  2.常常用來表示系統錯誤或者底層資源錯誤;

  3.若是可能的話,應該在系統級被捕捉;

  

  g) GC

   什麼是GC?

    Garbage Collection,垃圾收集,垃圾回收,是Java與C++/C的主要區別之一,做爲Java開發者,通常不須要專門編寫內存回收和垃圾清理代 碼,對內存泄露和溢出的問題,也不須要像C程序員那樣戰戰兢兢。這是由於在Java虛擬機中,存在自動內存管理和垃圾清掃機制。歸納地說,該機制對 JVM(Java Virtual Machine)中的內存進行標記,並肯定哪些內存須要回收,根據必定的回收策略,自動的回收內存,永不停息(Nerver Stop)的保證JVM中的內存空間,放置出現內存泄露和溢出問題

  

  怎麼理解GC?

    Java GC機制主要完成3件事:肯定哪些內存須要回收,肯定何時須要執行GC,如何執行GC。

 

  GC算法

    咱們通常討論的垃圾回收主要針對Java堆內存中的新生代和老年代,也正由於新生代和老年代結構上的不一樣,因此產生了分代回收算法,即新生代的垃圾回收和老年代的垃圾回收採用的是不一樣的回收算法。針對新生代,主要採用複製算法,而針對老年代,一般採用標記-清除算法或者標記-整理算法來進行回收。

  

  h) 如何創建索引更高效

  一、較頻繁的做爲查詢條件的字段應該建立索引.

  二、惟一性太差的字段不適合單首創建索引,即便頻繁做爲查詢條件。

  三、更新很是頻繁的字段不適合建立索引。

  四、頻繁在where從句、join關聯字段中出現。

  五、不要在常被修改到字段上建索引。

  六、主鍵外鍵上創建索引。

  七、建立一個索引時,評估該索引給查詢帶來的性能優化是否比因其而引發INSERT,UPDATE,DELETE操做的性能降低以及索引佔用的空間更要值得。

  

  i) 死鎖

  死鎖是什麼?

    死鎖是指多個進程因競爭資源而形成的一種僵局(互相等待),若無外力做用,這些進程都將沒法向前推動。例如,在某一個計算機系統中只有一臺打印機和一臺輸入 設備,進程P1正佔用輸入設備,同時又提出使用打印機的請求,但此時打印機正被進程P2 所佔用,而P2在未釋放打印機以前,又提出請求使用正被P1佔用着的輸入設備。這樣兩個進程相互無休止地等待下去,均沒法繼續執行,此時兩個進程陷入死鎖狀態。

 

  死鎖產生的緣由

    1. 系統資源的競爭

    系統資源的競爭致使系統資源不足,以及資源分配不當,致使死鎖。

 

    2. 進程運行推動順序不合適

 

    進程在運行過程當中,請求和釋放資源的順序不當,會致使死鎖。

  

  死鎖的四個必要條件

    互斥條件:一個資源每次只能被一個進程使用,即在一段時間內某 資源僅爲一個進程所佔有。此時如有其餘進程請求該資源,則請求進程只能等待。

    請求與保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其餘進程佔有,此時請求進程被阻塞,但對本身已得到的資源保持不放。

    不可剝奪條件:進程所得到的資源在未使用完畢以前,不能被其餘進程強行奪走,即只能 由得到該資源的進程本身來釋放(只能是主動釋放)。

    循環等待條件: 若干進程間造成首尾相接循環等待資源的關係

    這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不知足,就不會發生死鎖。

  

  死鎖的避免與預防死鎖避免的基本思想:

    系統對進程發出的每個系統可以知足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,若是分配後系統可能發生死鎖,則不予分配,不然予以分配,這是一種保證系統不進入死鎖狀態的動態策略。 若是操做系統能保證全部進程在有限時間內獲得須要的所有資源,則系統處於安全狀態不然系統是不安全的。   

    咱們能夠經過破壞死鎖產生的4個必要條件來 預防死鎖,因爲資源互斥是資源使用的固有特性是沒法改變的。

  1. 破壞「不可剝奪」條件:一個進程不能得到所須要的所有資源時便處於等待狀態,等待期間他佔有的資源將被隱式的釋放從新加入到 系統的資源列表中,能夠被其餘的進程使用,而等待的進程只有從新得到本身原有的資源以及新申請的資源才能夠從新啓動,執行。
  2. 破壞」請求與保持條件「:第一種方法靜態分配即每一個進程在開始執行時就申請他所須要的所有資源。第二種是動態分配即每一個進程在申請所須要的資源時他自己不佔用系統資源。
  3. 破壞「循環等待」條件:採用資源有序分配其基本思想是將系統中的全部資源順序編號,將緊缺的,稀少的採用較大的編號,在申請資源時必須按照編號的順序進行,一個進程只有得到較小編號的資源才能申請較大編資源的進程。
相關文章
相關標籤/搜索