面試剛開始是英文自我介紹、英文介紹項目、英文交流幾個問題
接着是Java基礎知識、數據庫知識,面試官很好,很多問題並不會太爲難你,還會詢問你的工作意向。
面完大概3天就來了offer
面試問題和答案主要整理如下
- Java集合類
- collection 接口常用的子接口有:List 接口、Set 接口
- List 接口常用的子類有:ArrayList 類、LinkedList 類
- Set 接口常用的子類有:HashSet 類、LinkedHashSet 類
- HashTable和HashMap的區別,取哈希的方式有什麼不同。
- 繼承的父類不同
Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map接口。
- 線程安全性不同
Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情況下是非Synchronize的。在多線程併發的環境下,可以直接使用Hashtable,不需要自己爲它的方法實現同步,但使用HashMap時就必須要自己增加同步處理。
- 是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,
Hashtable則保留了contains,containsValue和containsKey三個方法,其中contains和containsValue功能相同。
- key和value是否允許null值
Hashtable中,key和value都不允許出現null值。
HashMap中,null可以作爲鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值爲null。
- 兩個遍歷方式的內部實現上不同
Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式
- Hash值不同
哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。
hashCode是jdk根據對象的地址或者字符串或者數字算出來的int類型的數值。
Hashtable計算hash值,直接用key的hashCode(),而HashMap重新計算了key的hash值,Hashtable在求hash值對應的位置索引時,用取模運算,而HashMap在求位置索引時,則用與運算。
- 內部實現使用的數組初始化和擴容方式不同
HashTable在不指定容量的情況下的默認容量爲11,而HashMap爲16,Hashtable不要求底層數組的容量一定要爲2的整數次冪,而HashMap則要求一定爲2的整數次冪。
Hashtable擴容時,將容量變爲原來的2倍加1,而HashMap擴容時,將容量變爲原來的2倍。
- 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對插入鏈表頭。
- Jdk1.7和jdk1.8中HashMap的區別
- Hashmap的負載因子爲什麼是0.75
加載因子越大,對空間的利用更充分,但是查找效率會降低(鏈表長度會越來越長);
加載因子太小,那麼表中的數據將過於稀疏(很多空間還沒用,就開始擴容了),對空間造成嚴重浪費。系統默認加載因子爲0.75.
- HashMap的初始容量是多少、怎麼自己設置、擴容方式
HashMap共有四個構造方法。構造方法中提到了兩個很重要的參數:初始容量和加載因子。這兩個參數是影響HashMap性能的重要參數,其中容量表示哈希表中槽的數量(即哈希數組的長度),初始容量是創建哈希表時的容量(從構造函數中可以看出,如果不指明,則默認爲16),加載因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度,當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行 resize 操作(即擴容)。
HashMap擴容的條件是:當size大於threshold時,對HashMap進行擴容
擴容是是新建了一個HashMap的底層數組,而後調用transfer方法,將就HashMap的全部元素添加到新的HashMap中(要重新計算元素在新的數組中的索引位置)。 很明顯,擴容是一個相當耗時的操作,因爲它需要重新計算這些元素在新的數組中的位置並進行復制處理。因此,我們在用HashMap的時,最好能提前預估下HashMap中元素的個數,這樣有助於提高HashMap的性能。
- 10萬個數據用ArrayList怎麼存
- TreeMap的底層、效率
TreeMap集合是基於紅黑樹(Red-Black tree)的 NavigableMap實現。該集合最重要的特點就是可排序,該映射根據其鍵的自然順序進行排序,或者根據創建映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。
1. 往TreeMap添加元素的時候,如果元素的鍵具備自然順序,那麼就會按照鍵的自然順序特性進行排序存儲。
2. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性, 那麼鍵所屬的類必須要實現Comparable接口,把鍵的比較規則定義在CompareTo方法上。
3. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性,而且鍵所屬的類也沒有實現Comparable接口,那麼就必須在創建TreeMap對象的時候傳入比較器。
- AVL的最大高度差、B+樹
結點的左右子樹最大高度差是1,如果大於等於2 就不平衡。
- 數據結構的應用?
使用棧實現回退、撤銷的問題
使用棧和hashmap實現括號匹配、表達式求值
使用樹實現決策樹。
使用隊列解決排隊優先級問題。等
- AVL樹和二叉樹的區別?
AVL樹是二叉樹的特殊形式,
-
- 結點有序,是特殊的二叉查找樹。
- AVL要求儘量節點的左右子樹儘量保持平衡,是左右子樹儘量保持平衡的二叉查找樹。便於查找效率。
- JDK1.8的新特性
1·特殊的接口:接口裏面的方法可以有方法體。
2·方法的調用:可以使用::調用方法。
3·lambda表達式:語法超級簡單,被python,scala逼出來的語法。
4·數據流編程:Spark特性和方法特別像。
- 接口的默認和靜態方法
Java 8 允許給接口添加一個非抽象的方法實現,只需要使用 default 關鍵字即可,這個特徵又叫做擴展方法(也稱爲默認方法或虛擬擴展方法或防護方法)。在實現該接口時,該默認擴展方法在子類上可以直接使用,它的使用方式類似於抽象類中非抽象成員方法。
- 四大函數式接口、使用方法
Supplier供給型接口、
Consumer消費型接口、
Predicate斷定型接口、
Function函數型接口
- Cloneable使用方法
Clone方法是可以創建對象的一種方式。使用clone方法複製對象。由於clone方法將最終將調用JVM中的原生方法完成複製也就是調用底層的c++代碼,所以一般使用clone方法複製對象要比新建一個對象然後逐一進行元素複製效率要高。
- 對微服務的理解
微服務關注的是服務的大小,是具體解決某一問題的一個組件,可獨立部署執行。
微服務架構是一種架構模式,它把一個單一的應用開發爲一組小型服務的方法。每個服務運行在自己的進程中,服務間通信採用輕量級通信機制(通常用 HTTP 資源API)。這些服務圍繞業務能力構建並且可通過全自動部署機制獨立部署。這些服務共用一個最小型的集中式的管理。
- UNION和UNION ALL的區別
union會自動壓縮多個結果集合中的重複結果
union all則將所有的結果全部展示出來,不管是不是重複
- Try catch finally的執行順序、各種情況
- 同步代碼塊、靜態同步代碼塊
使用static關鍵字修飾的代碼塊稱爲靜態代碼塊,一般用於初始化類的靜態屬性和對象創建前的環境。靜態代碼塊在類裝載時會自動執行,換言之,一旦觸發類,其中的靜態代碼塊便會最先得到執行,並且只執行一次,與創建的對象個數無關。 - Finally關鍵字的作用
- Arraylist和linkedlist的區別
- ArrayList的最大容量、擴容方式
與物理內存和所存儲的對象類有關,
擴容方式,初始爲16,增加1.5倍
數據庫三大範式:
第一範式:就是原子性,字段不可再分割;
第二範式:就是完全依賴,沒有部分依賴;
【表中必須有一個主鍵;沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分】
注意,符合第二範式的關係模型可能還存在數據冗餘、更新異常等問題。
第三範式:就是沒有傳遞依賴
數據庫的設計範式是數據庫設計所需要滿足的規範,數據庫的規範化是優化表的結構和優化把數據組織到表中的方式,
這樣使數據更明確,更簡潔。
**事務的四大特性(ACID):
1、原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。
2、一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。
3、隔離性(Isolation):同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。
4、持久性(Durability):事務完成後,事務對數據庫的所有更新將被保存到數據庫,不能回滾