最近Java高階工程師面試總結

歐陽慍斐發表於2018-06-24

面試總結

Java基礎

Hashtable和HashMap的區別。

抽象類與介面的區別。

final關鍵字的使用和區別。

異常分類和處理機制。

JDK版本區別。

StringBuilder內部實現機制。

反射機制的使用。

匿名內部類的使用。

泛型的概念和使用。

弱引用和虛引用的概念和使用方式。

開源框架

SpringMVC和Struts2的區別

Spring IOC和AOP的概念以及實現方式

Spring事務的管理

Hibernate與MyBatis的比較

Hibernate延遲載入的機制

JVM虛擬機器

GC演算法有哪些

垃圾回收器有哪些

如何調優JVM

快取和NoSQL

快取的使用場景

快取命中率的計算

Memcache與Redis的比較

如何實現Redis的分片

MongoDB的特點

分散式

zookeeper的用途

dubbo的用途以及優點

dubbo的實現原理

資料結構和演算法

單向連結串列的逆序排列

雙向連結串列的操作

1億個整數的倒序輸出

找出給定字串中最長迴文(迴文:abcdcba,兩端對稱)

網路程式設計

Get和Post的區別

Https協議的實現

長連線的管理

Socket的基本方法

資料庫

inner join和left join的區別

複雜SQL語句

資料庫優化方式

資料庫拆分方式

如何保證不同資料結構的資料一致性

安全

什麼是XSS攻擊,具體如何實現?

開放問題:如何保障系統安全?

設計模式

寫出一個設計模式的類圖

設計模式的意義是什麼

寫個單例模式的程式碼

多執行緒

如何避免Quartz重複啟動任務

執行緒池滿了如何處理額外的請求

同一個物件的連個同步方法能否被兩個執行緒同時呼叫

1、零基礎(沒有任何程式設計經驗)

2、有前端基礎(HTML+CSS+JAVASCRIPT),沒有JAVA基礎

3、有前端基礎(HTML+CSS+JAVASCRIPT),有JAVA基礎(沒有相關工作經驗)

4、有前端基礎(HTML+CSS+JAVASCRIPT),有JAVA工作經驗

5、沒有前端基礎,有JAVA基礎(沒有相關工作經驗)

6、沒有前端基礎,有JAVA工作經驗

多年工作經驗的梳理和總結,帶著大家全面、

科學地建立自己的技術體系和技術認知!

部分答案

Java基礎

HashMap和Hashtable的區別

HashMap是非執行緒安全的,Hashtable是執行緒安全的。

HashMap的鍵值都可以為null,Hashtable的鍵值都不可以為null值。

HashMap繼承自AbstractMap類,Hashtable繼承自Dictionary類。

ps : Properties類繼承自Hashtable類。

異常分類和處理機制

分類:

執行時異常(Runtime Exception)

受檢查異常(Checked Exception)

執行時異常:

必須繼承RuntimeException類,

定義方法時不必宣告會丟擲執行時異常。

呼叫方法時不必捕獲執行時異常。

受檢查異常:

不繼承自RumtimeException類

定義方法時需要丟擲可能會丟擲的Checked Exception

呼叫方法時需要捕獲Checked Exception或者繼續向上丟擲。

邏輯上:

執行時異常:一般不需要或者不知道如何處理此類異常;

受檢驗異常:一般需要知道如何處理可能發生的異常情況。

StringBuilder內部實現機制

StringBuilder內部有一個字元陣列,程式碼如下

char[] value; //字元陣列int count; //字串長度

每一次append操作都是將新的字串加入到可變長的字元陣列中,長度計算方式與ArrayList類似。呼叫toString()方法時,new一個String物件即可。

public String toString() { return new String(value, 0, count);// Create a copy, don`t share the array}

ps: StringBuffer是執行緒安全的,StringBuilder是非執行緒安全的。

匿名內部類的使用

匿名內部類是沒有名字的類,只在某一處被使用,不會被多處呼叫,一般是某個父類或介面的特定實現。

強引用、軟引用、弱引用和虛引用

強引用: 一般的引用都是強引用,即使OutOfMemory也不會回收這部分被把持的引用記憶體。

軟引用(SoftReference): 如果記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體空間不足了,就會回收這些物件的記憶體。只要垃圾回收器沒有回收它,該物件就可以被使用。++軟引用可以用來實現記憶體敏感的快取記憶體。++

弱引用(WeakReference):弱引用的物件擁有更短暫的生命週期。當垃圾回收期發現只有若引用的物件,不論記憶體空間足夠與否,都會回收它。

虛引用():虛引用不會決定物件的生命週期,如果一個物件僅持有一個虛引用,那麼它隨時可能被回收。++虛引用主要用來跟蹤物件被垃圾回收器回收的活動。++

開源框架

SpringMVC和Struts2的區別

SpringMVC的方法級別的攔截,Struts2是類級別的攔截;

SpringMVC是基於Servlet實現Controller,Struts2是基於Filter實現;

SpringMVC效能和安全性高於Struts2;

SpringMVC更加元件化和流程化,易於擴充套件,比如返回JSON通過設定@ResponseBody即可;

Struts2更加無耦合,比較純粹,但是需要更多的自行開發的程式碼以支援更多功能。

Spring事務的管理

分類:宣告式事務、程式設計式事務

宣告式事務:通過統一配置實現事務的統一管理,一般配置TransactionMananger以及相關屬性即可。

程式設計式事務(註解方式):在需要事務的方法上配置相關的註解(包括事務型別、回滾策略等)

事務型別:

PROPAGATION_REQUIRED

PROPAGATION_SUPPORTS

PROPAGATION_MANDATORY

PROPAGATION_REQUIRES_NEW

PROPAGATION_NOT_SUPPORTED

PROPAGATION_NEVER

PROPAGATION_NESTED

事務隔離級別

ISOLATION_DEFAULT

ISOLATION_READ_UNCOMMITTED

ISOLATION_READ_COMMITTED

ISOLATION_REPEATABLE_READ

ISOLATION_SERIALIZABLE

Hibernate與MyBatis的比較

Hibernate完全實現物件關係對映(ORM),MyBatis實現的是SQL Mapping

MyBatis可以進行更為細緻的SQL優化,可以減少查詢欄位。比Hibernate容易掌握,Hibernate門檻較高。

Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果對映。

Hibernate對物件的維護和快取要比MyBatis好,對增刪改查的物件的維護要方便。

Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不同SQL。

Hibernate有更好的二級快取機制,可以使用第三方快取。MyBatis本身提供的快取機制不佳。

JVM虛擬機器

GC演算法有哪些

引用計數

複製

標記-清除

標記-壓縮

分代(新生代、老年代、永久代)

垃圾回收器有哪些

序列回收器:新生代序列回收器、老年代序列回收器

並行回收器:新生代ParNew回收器、新生代ParallelGC回收器、老年代ParallelGC回收器

CMS回收器:(Concurrent Mark Sweep、併發標記清除)

G1回收器(1.7以後代替CMS回收器)

如何調優JVM

標準引數:

-client -server模式

-Xmn、-Xms、-Xmx

監控:jps、jstat、jinfo、jmap、jhat、jstack…

Java 中堆和棧有什麼區別?

JVM 中堆和棧屬於不同的記憶體區域,使用目的也不同。

棧常用於儲存方法幀和區域性變數,而物件總是在堆上分配。

棧通常都比堆小,也不會在多個執行緒之間共享,而堆被整個 JVM 的所有執行緒共享。

快取和NoSQL

快取命中率的計算

命中快取次數/(命中快取次數+未命中快取次數) = 命中率

Memcache與Redis的區別

memcache把資料存在記憶體之中,斷電後會掛掉;Redis部分資料持久化在硬碟上,斷電不會丟失。

memcache存的是key-value對,redis支援更多的資料結構和資料型別

memcache可以使用一致性hash做分散式,redis可以做主從同步

redis單執行緒,只使用1個cpu

如何實現Redis的分片

使用一致性雜湊對資料進行對映

實現方式:客戶端分片(每個客戶端對應一個分片)、代理協助分片、查詢路由分片;

使用redis叢集,如codis(豌豆莢,依賴zookeeper);

分散式

zookeeper的用途

zookeeper作為分散式應用協調系統,已經用到很多分散式專案中。

可以用來完成統一命名服務、狀態同步服務、叢集管理、分散式應用配置項等管理工作。

zookeeper的主要操作分一下幾種:

建立節點

讀取節點資料

更新節點資料

刪除節點

監控節點變化

應用場景:

統一命名服務,使用create自動建立節點編號;

配置管理,多個節點的共享配置,當配置發生變化時,可利用zookeeper讓使用這些配置的節點獲得通知,進行重新載入等操作。如dubbo服務。

叢集管理:叢集選舉主節點,資源定位。

共享鎖

負載均衡

應用專案:

dubbo服務叢集、redis叢集、Hadoop叢集等

dubbo的用途以及優點

Dubbo是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。

資料結構和演算法

將單項鍊表逆序排列

將單向連結串列逆序輸出,方法有三種:

遍歷連結串列,將每個節點的內容存入一個陣列中,然後逆序輸出陣列(最簡單的做法)

使用棧來逆序輸出

直接將連結串列(指標)逆序然後輸出

如果對自己未來有想法,想提升自己,你現在在JAVA這條路上掙扎,也想在IT行業拿高薪,可以參加我們免費的公開課試聽學習 乾貨滿滿的,選擇最適合自己的課程學習,技術大牛親授,課程內容有:Java工程化、高效能及分散式、高效能、深入淺出。高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點。如果你想拿高薪的,想學習的,想就業前景好的,想跟別人競爭能取得優勢的,想進阿里面試但擔心面試不過的,你都可以來。

群號:468947140

進群修改群備註:開發年限-地區-經驗
點選連結加入群聊【Java-BATJ企業級資深架構】:https://jq.qq.com/?_wv=1027&k=52j2FVO


相關文章