近期Java高級工程師面試總結

面試總結

最近兩週面試了幾家公司Java高級工程師的職位,主要有宜信、網信金融、阿里高德、口袋購物。目前有部分公司已經面試經過,兩家在等消息。今天趁熱把常見面試內容總結一下。面試

Java基礎

Hashtable和HashMap的區別。
抽象類與接口的區別。
final關鍵字的使用和區別。
異常分類和處理機制。
JDK版本區別。
StringBuilder內部實現機制。
反射機制的使用。
匿名內部類的使用。
泛型的概念和使用。
弱引用和虛引用的概念和使用方式。redis

開源框架

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重複啓動任務
線程池滿了如何處理額外的請求
同一個對象的連個同步方法可否被兩個線程同時調用

待更


2017年03月04日更新:

距離發佈文章已經好久,恰逢求職季,遂整理部分面試問題的答案,不甚完整,僅供參考。


部分答案

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):弱引用的對象擁有更短暫的生命週期。當垃圾回收期發現只有若引用的對象,不論內存空間足夠與否,都會回收它。

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

更多關於『強、軟、弱和虛引用』參考文章:http://zhangjunhd.blog.51cto....


開源框架

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服務治理方案。

數據結構和算法

將單項鍊表逆序排列

將單向鏈表逆序輸出,方法有三種:

  1. 遍歷鏈表,將每一個節點的內容存入一個數組中,而後逆序輸出數組(最簡單的作法)

  2. 使用棧來逆序輸出

  3. 直接將鏈表(指針)逆序而後輸出

單向鏈表詳細信息參考文章:http://blog.csdn.net/jianyuer...

海量數據操做

相關文章
相關標籤/搜索