最近兩週面試了幾家公司Java高級工程師的職位,主要有宜信、網信金融、阿里高德、口袋購物。目前有部分公司已經面試經過,兩家在等消息。今天趁熱把常見面試內容總結一下。面試
Hashtable和HashMap的區別。
抽象類與接口的區別。
final關鍵字的使用和區別。
異常分類和處理機制。
JDK版本區別。
StringBuilder內部實現機制。
反射機制的使用。
匿名內部類的使用。
泛型的概念和使用。
弱引用和虛引用的概念和使用方式。redis
SpringMVC和Struts2的區別
Spring IOC和AOP的概念以及實現方式
Spring事務的管理
Hibernate與MyBatis的比較
Hibernate延遲加載的機制算法
GC算法有哪些
垃圾回收器有哪些
如何調優JVM數據庫
緩存的使用場景
緩存命中率的計算
Memcache與Redis的比較
如何實現Redis的分片
MongoDB的特色編程
zookeeper的用途
dubbo的用途以及優勢
dubbo的實現原理設計模式
單向鏈表的逆序排列
雙向鏈表的操做
1億個整數的倒序輸出
找出給定字符串中最長迴文(迴文:abcdcba,兩端對稱)數組
Get和Post的區別
Https協議的實現
長鏈接的管理
Socket的基本方法緩存
inner join和left join的區別
複雜SQL語句
數據庫優化方式
數據庫拆分方式
如何保證不一樣數據結構的數據一致性安全
什麼是XSS攻擊,具體如何實現?
開放問題:如何保障系統安全?網絡
寫出一個設計模式的類圖
設計模式的意義是什麼
寫個單例模式的代碼
如何避免Quartz重複啓動任務
線程池滿了如何處理額外的請求
同一個對象的連個同步方法可否被兩個線程同時調用
待更
距離發佈文章已經好久,恰逢求職季,遂整理部分面試問題的答案,不甚完整,僅供參考。
HashMap是非線程安全的,Hashtable是線程安全的。
HashMap的鍵值均可覺得null,Hashtable的鍵值都不能夠爲null值。
HashMap繼承自AbstractMap類,Hashtable繼承自Dictionary類。
ps : Properties類繼承自Hashtable類。
分類:
運行時異常(Runtime Exception)
受檢查異常(Checked Exception)
運行時異常:
必須繼承RuntimeException類,
定義方法時沒必要聲明會拋出運行時異常。
調用方法時沒必要捕獲運行時異常。
受檢查異常:
不繼承自RumtimeException類
定義方法時須要拋出可能會拋出的Checked Exception
調用方法時須要捕獲Checked Exception或者繼續向上拋出。
邏輯上:
運行時異常:通常不須要或者不知道如何處理此類異常;
受檢驗異常:通常須要知道如何處理可能發生的異常狀況。
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是基於Servlet實現Controller,Struts2是基於Filter實現;
SpringMVC性能和安全性高於Struts2;
SpringMVC更加組件化和流程化,易於擴展,好比返回JSON經過設置@ResponseBody便可;
Struts2更加無耦合,比較純粹,可是須要更多的自行開發的代碼以支持更多功能。
聲明式事務:經過統一配置實現事務的統一管理,通常配置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徹底實現對象關係映射(ORM),MyBatis實現的是SQL Mapping
MyBatis能夠進行更爲細緻的SQL優化,能夠減小查詢字段。比Hibernate容易掌握,Hibernate門檻較高。
Hibernate的DAO層開發比MyBatis簡單,Mybatis須要維護SQL和結果映射。
Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。
Hibernate數據庫移植性很好,MyBatis的數據庫移植性很差,不一樣的數據庫須要寫不一樣SQL。
Hibernate有更好的二級緩存機制,可使用第三方緩存。MyBatis自己提供的緩存機制不佳。
引用計數
複製
標記-清除
標記-壓縮
分代(新生代、老年代、永久代)
串行回收器:新生代串行回收器、老年代串行回收器
並行回收器:新生代ParNew回收器、新生代ParallelGC回收器、老年代ParallelGC回收器
CMS回收器:(Concurrent Mark Sweep、併發標記清除)
G1回收器(1.7之後代替CMS回收器)
標準參數:
-client -server模式
-Xmn、-Xms、-Xmx
監控:jps、jstat、jinfo、jmap、jhat、jstack…
JVM 中堆和棧屬於不一樣的內存區域,使用目的也不一樣。
棧經常使用於保存方法幀和局部變量,而對象老是在堆上分配。
棧一般都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的全部線程共享。
命中緩存次數/(命中緩存次數+未命中緩存次數) = 命中率
memcache把數據存在內存之中,斷電後會掛掉;Redis部分數據持久化在硬盤上,斷電不會丟失。
memcache存的是key-value對,redis支持更多的數據結構和數據類型
memcache可使用一致性hash作分佈式,redis能夠作主從同步
redis單線程,只使用1個cpu
使用一致性哈希對數據進行映射
實現方式:客戶端分片(每一個客戶端對應一個分片)、代理協助分片、查詢路由分片;
使用redis集羣,如codis(豌豆莢,依賴zookeeper);
zookeeper做爲分佈式應用協調系統,已經用到不少分佈式項目中。
能夠用來完成統一命名服務、狀態同步服務、集羣管理、分佈式應用配置項等管理工做。
zookeeper的主要操做分一下幾種:
建立節點
讀取節點數據
更新節點數據
刪除節點
監控節點變化
應用場景:
統一命名服務,使用create自動建立節點編號;
配置管理,多個節點的共享配置,當配置發生變化時,可利用zookeeper讓使用這些配置的節點得到通知,進行從新加載等操做。如dubbo服務。
集羣管理:集羣選舉主節點,資源定位。
共享鎖
負載均衡
應用項目:
dubbo服務集羣、redis集羣、Hadoop集羣等
Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。
將單向鏈表逆序輸出,方法有三種:
遍歷鏈表,將每一個節點的內容存入一個數組中,而後逆序輸出數組(最簡單的作法)
使用棧來逆序輸出
直接將鏈表(指針)逆序而後輸出
單向鏈表詳細信息參考文章:http://blog.csdn.net/jianyuer...