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

編程語言 Java Redis NoSQL 最前沿編程諮詢 最前沿編程諮詢 2017-09-02

面試總結

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重複啟動任務

線程池滿了如何處理額外的請求

同一個對象的連個同步方法能否被兩個線程同時調用

大家可以點擊加入群:606187239【JAVA大牛學習交流】

裡面有Java高級大牛直播講解知識點 走的就是高端路線

(如果你想跳槽換工作 但是技術又不夠 或者工作上遇到了

瓶頸 我這裡有一個JAVA的免費直播課程 講的是高端的知識點

基礎不好的誤入喲 只要你有1-5年的開發經驗

可以加群找我要課堂鏈接 注意:是免費的 沒有開發經驗誤入哦)

1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,

需要突破技術瓶頸的可以加。2、在公司待久了,過得很安逸,

但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,

常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。

但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5. 群號:高級架構群 606187239備註好信息!

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

數據結構和算法

將單項鍊表逆序排列

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

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

  2. 使用棧來逆序輸出

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

相關推薦

推薦中...