花旗金融2020春招面經(offer)

面試剛開始是英文自我介紹、英文介紹項目、英文交流幾個問題

接着是Java基礎知識、數據庫知識,面試官很好,很多問題並不會太爲難你,還會詢問你的工作意向。

面完大概3天就來了offer 

面試問題和答案主要整理如下

  1. Java集合類

 

 

  • collection 接口常用的子接口有:List 接口、Set 接口
  • List 接口常用的子類有:ArrayList 類、LinkedList 類
  • Set 接口常用的子類有:HashSet 類、LinkedHashSet 類
  1. HashTable和HashMap的區別,取哈希的方式有什麼不同。
  1. 繼承的父類不同

  Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map接口。

  1. 線程安全性不同

Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情況下是非Synchronize的。在多線程併發的環境下,可以直接使用Hashtable,不需要自己爲它的方法實現同步,但使用HashMap時就必須要自己增加同步處理。

  1. 是否提供contains方法

HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,

Hashtable則保留了contains,containsValue和containsKey三個方法,其中contains和containsValue功能相同。

  1. key和value是否允許null值

   Hashtable中,key和value都不允許出現null值。

HashMap中,null可以作爲鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值爲null。

  1. 兩個遍歷方式的內部實現上不同

   Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式

  1. Hash值不同

哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。

hashCode是jdk根據對象的地址或者字符串或者數字算出來的int類型的數值。

Hashtable計算hash值,直接用key的hashCode(),而HashMap重新計算了key的hash值,Hashtable在求hash值對應的位置索引時,用取模運算,而HashMap在求位置索引時,則用與運算

  1. 內部實現使用的數組初始化和擴容方式不同

HashTable在不指定容量的情況下的默認容量爲11,而HashMap爲16,Hashtable不要求底層數組的容量一定要爲2的整數次冪,而HashMap則要求一定爲2的整數次冪。

   Hashtable擴容時,將容量變爲原來的2倍加1,而HashMap擴容時,將容量變爲原來的2倍。

  1. HashMap的底層

HashMap是基於哈希表實現的,每一個元素是一個key-value對,其內部通過單鏈表解決衝突問題,容量不足(超過了閥值)時,同樣會自動增長。

HashMap是非線程安全的,只是用於單線程環境下,多線程環境下可以採用concurrent併發包下的concurrentHashMap。

HashMap 實現了Serializable接口,因此它支持序列化,實現了Cloneable接口,能被克隆。

   HashMap內部維護了一個存儲數據的Entry數組,HashMap採用鏈表解決衝突,每一個Entry本質上是一個單向鏈表。

當準備添加一個key-value對時,首先通過hash(key)方法計算hash值,然後通過indexFor(hash,length)求該key-value對的存儲位置,計算方法是先用hash&0x7FFFFFFF後,再對length取模,這就保證每一個key-value對都能存入HashMap中,當計算出的位置相同時,由於存入位置是一個鏈表,則把這個key-value對插入鏈表頭。

  1. Jdk1.7和jdk1.8中HashMap的區別
  2. Hashmap的負載因子爲什麼是0.75

加載因子越大,對空間的利用更充分,但是查找效率會降低(鏈表長度會越來越長);

加載因子太小,那麼表中的數據將過於稀疏(很多空間還沒用,就開始擴容了),對空間造成嚴重浪費。系統默認加載因子爲0.75.

  1. HashMap的初始容量是多少、怎麼自己設置、擴容方式

HashMap共有四個構造方法。構造方法中提到了兩個很重要的參數:初始容量和加載因子。這兩個參數是影響HashMap性能的重要參數,其中容量表示哈希表中槽的數量(即哈希數組的長度),初始容量是創建哈希表時的容量(從構造函數中可以看出,如果不指明,則默認爲16),加載因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度,當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行 resize 操作(即擴容)。

HashMap擴容的條件是:當size大於threshold時,對HashMap進行擴容  

擴容是是新建了一個HashMap的底層數組,而後調用transfer方法,將就HashMap的全部元素添加到新的HashMap中(要重新計算元素在新的數組中的索引位置)。 很明顯,擴容是一個相當耗時的操作,因爲它需要重新計算這些元素在新的數組中的位置並進行復制處理。因此,我們在用HashMap的時,最好能提前預估下HashMap中元素的個數,這樣有助於提高HashMap的性能。

  1. 10萬個數據用ArrayList怎麼存
  2. TreeMap的底層、效率

TreeMap集合是基於紅黑樹(Red-Black tree)的 NavigableMap實現。該集合最重要的特點就是可排序,該映射根據其鍵的自然順序進行排序,或者根據創建映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。

1.  往TreeMap添加元素的時候,如果元素的鍵具備自然順序,那麼就會按照鍵的自然順序特性進行排序存儲。

 2.  往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性, 那麼鍵所屬的類必須要實現Comparable接口,把鍵的比較規則定義在CompareTo方法上。

3. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性,而且鍵所屬的類也沒有實現Comparable接口,那麼就必須在創建TreeMap對象的時候傳入比較器。

  1. AVL的最大高度差、B+樹

結點的左右子樹最大高度差是1,如果大於等於2 就不平衡。

  1. 數據結構的應用?

使用棧實現回退、撤銷的問題

使用棧和hashmap實現括號匹配、表達式求值

使用樹實現決策樹。

使用隊列解決排隊優先級問題。等

  1. AVL樹和二叉樹的區別?

AVL樹是二叉樹的特殊形式,

    1. 結點有序,是特殊的二叉查找樹。
    2. AVL要求儘量節點的左右子樹儘量保持平衡,是左右子樹儘量保持平衡的二叉查找樹。便於查找效率。
  1. JDK1.8的新特性

1·特殊的接口:接口裏面的方法可以有方法體。

2·方法的調用:可以使用::調用方法。

3·lambda表達式:語法超級簡單,被python,scala逼出來的語法。

4·數據流編程:Spark特性和方法特別像。

  1. 接口的默認和靜態方法

Java 8 允許給接口添加一個非抽象的方法實現,只需要使用 default 關鍵字即可,這個特徵又叫做擴展方法(也稱爲默認方法或虛擬擴展方法或防護方法)。在實現該接口時,該默認擴展方法在子類上可以直接使用,它的使用方式類似於抽象類中非抽象成員方法。

  1. 四大函數式接口、使用方法

Supplier供給型接口、

Consumer消費型接口、

Predicate斷定型接口、

Function函數型接口

  1. Cloneable使用方法

Clone方法是可以創建對象的一種方式。使用clone方法複製對象。由於clone方法將最終將調用JVM中的原生方法完成複製也就是調用底層的c++代碼,所以一般使用clone方法複製對象要比新建一個對象然後逐一進行元素複製效率要高。

  1. 對微服務的理解

微服務關注的是服務的大小,是具體解決某一問題的一個組件,可獨立部署執行。

微服務架構是一種架構模式,它把一個單一的應用開發爲一組小型服務的方法。每個服務運行在自己的進程中,服務間通信採用輕量級通信機制(通常用 HTTP 資源API)。這些服務圍繞業務能力構建並且可通過全自動部署機制獨立部署。這些服務共用一個最小型的集中式的管理。

  1. UNIONUNION ALL的區別

union會自動壓縮多個結果集合中的重複結果

union all則將所有的結果全部展示出來,不管是不是重複

  1. Try catch finally的執行順序、各種情況
  2. 同步代碼塊、靜態同步代碼塊
    使用static關鍵字修飾的代碼塊稱爲靜態代碼塊,一般用於初始化類的靜態屬性和對象創建前的環境。靜態代碼塊在類裝載時會自動執行,換言之,一旦觸發類,其中的靜態代碼塊便會最先得到執行,並且只執行一次,與創建的對象個數無關。
  3. Finally關鍵字的作用
  4. Arraylist和linkedlist的區別
  5. ArrayList的最大容量、擴容方式

與物理內存和所存儲的對象類有關,

擴容方式,初始爲16,增加1.5倍

 

數據庫三大範式:

第一範式:就是原子性,字段不可再分割

第二範式:就是完全依賴,沒有部分依賴;
【表中必須有一個主鍵;沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分】
注意,符合第二範式的關係模型可能還存在數據冗餘、更新異常等問題。

第三範式:就是沒有傳遞依賴

數據庫的設計範式是數據庫設計所需要滿足的規範,數據庫的規範化是優化表的結構和優化把數據組織到表中的方式,
這樣使數據更明確,更簡潔。

 

**事務的四大特性(ACID):

  1、原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。

  2、一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

  3、隔離性(Isolation):同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

  4、持久性(Durability):事務完成後,事務對數據庫的所有更新將被保存到數據庫,不能回滾

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