概述
年中或者年底績效出來後,總是幾家歡樂幾家愁。績效好的機會多的老闆信任的,會更加有幹勁。績效不好的,老闆不看好的,可能就會有離職的衝動。
如果你有離職的想法,那麼還是需要花一些時間準備一下,畢竟現在外面好的網際網路公司對程式設計師的要求還是蠻高的,需要你有各種能耐。
這篇文章主要是介紹一下我自己從畢業到現在碰到的一些面試題。部分題目給出了答案,部分試題則沒有。
JAVA 基礎
int 佔用幾個位元組
答案:
4個不用第三個變數,如何交換兩個變數的值
public class TestSwitchVar { public static void main(String[] args) { int a = 1; int b = 2; a = a + b; b = a - b; a = a - b; System.out.println(a); System.out.println(b); } }複製程式碼
JAVA動態代理使用什麼技術實現的
答案:
反射JAVA類載入器的原理
答案:
學習JAVA類載入器
集合類
HashSet的add方法是如何實現的,如何去重的;
答案:
HashSet的底層是使用HashMap來實現的,呼叫add方法的時候,底層也是用HashMap的put方法來實現的。HashSet之所以具備去重的能力,也是因為HashMap的put方法中,如果發現key已經存在了,會覆蓋key對應的值,但是對於HashSet來說,還是原來那個key。也就是說Key set並沒有任何變動。HashMap的實現原理;
答案:
看我之前寫的HashMap的put和get方法原理和 HashMap擴容以及HashMap多執行緒下發生死迴圈的原因 這幾篇博文即可。JDK 1.7 ConcurrentHashMap的實現原理
- ConcurrentHashMap在JDK 1.8的實現跟JDK7有什麼不同;
ArrayList是執行緒安全的嗎
CopyOnWriteArrayList是如何實現執行緒安全的;
NIO
描述JAVA NIO的工作原理,相比JAVA IO有什麼優勢
答案:
學習NIO
執行緒和併發
sleep方法和wait方法有什麼區別
答案:
1、wait方法釋放鎖,sleep方法不釋放鎖
2、wait方法必須在同步程式碼塊裡,比如synchronize關鍵裡,但是sleep方法沒有這限制wait()方法呼叫後,到底發生了什麼事情
除了使用synchronized關鍵字之外,還有其他同步的做法嗎
答案:
volatile關鍵字
lock()和unlock()
- 什麼是daemon 執行緒
- 如果有多個執行緒要併發操作一個檔案,如何做到執行緒安全,請寫出虛擬碼
- 什麼是執行緒安全
volatile關鍵字有什麼用
悲觀鎖和樂觀鎖的區別
- 有哪些併發模型,用過哪些併發模型,選擇這些模型有什麼依據(比如說Master-Worker模式)
- 用過ThreadLocal嗎?什麼場景下用過
- 執行緒有哪幾種狀態
- CAS的原理
答案:
學習一下CAS
- 寫一個發生死鎖的JAVA程式碼,並描述一下如何避免死鎖?
- 執行緒要進入阻塞狀態,作業系統是如何操作的(涉及到使用者態和核心態)
- 談談如何進行"鎖"的優化
- 什麼叫可重入鎖
JVM
垃圾回收演算法有哪幾種?各種有什麼特點
答案:
JVM專欄什麼時候觸發young gc,什麼時候觸發full gc
答案:
新生代中的Eden滿了就就行young gc,老年代滿了,就進行full gc。
如果JAVA程式突然掛掉了,怎麼檢視掛掉的原因
答案:
java程式掛掉後,會產生core dump 檔案,可以使用jstack 命令輸出執行緒堆疊資訊。JVM是怎麼調優的
- JVM監控工具有哪些,各有什麼用途,簡單介紹一下用法
- 描述一下JVM的記憶體模型
- 怎麼知道是哪行程式碼導致系統CPU高
mysql
- 使用什麼關鍵字來分析SQL的效能
- 建立索引有什麼注意點
答案:
Mysql 索引知識點
什麼是覆蓋索引
答案:
Mysql 索引知識點
什麼情況下,需要建立複合索引
答案:
Mysql 索引知識點索引原理是什麼,底層用什麼資料結構
答案:
Mysql B+樹學習應用的資料庫是如何做容災的
- 如何做到動態增加業務欄位,而程式碼無需改動
- 行鎖和表鎖的區別,innodb引擎用的是哪種鎖
innodb myisam的區別
答案:
Mysql 索引知識點mysql批量插入資料的時候,怎麼優化
- 你參與的專案,有做分庫處理嗎,路由到分庫的規則是什麼?
nosql
用過哪些NoSQL資料庫,簡單介紹一下
快取
- memcache的原理
- memcache和redis的區別
- 系統有用本地快取嗎?是如何做命中率的統計的
- 選擇堆外快取和堆內快取的依據是什麼
- 從堆外快取獲取資料需要反序列化,有辦法避免嗎?說一下思路即可
演算法
- 一致性hash演算法的原理
- 使用JAVA實現快速排序
- 使用JAVA實現二分查詢
- 使用JAVA進行二叉樹的遍歷(前序/中序/後序,寫一種即可)
- 紅黑樹的原理
HTTP
如何用JAVA程式碼解析一個HTTP請求,描述一下實現的思路
HTTP 1.0 HTTP1.1 HTTP 2.0的區別
架構設計
- 系統是如何容災的
- 系統的快取設計是怎麼做的
- 如何做防雪崩
- 描述一下限流的具體方案或者演算法
linux
- shell用什麼命令檢視硬碟和記憶體的使用情況
- shell指令碼用什麼變數來接收引數
Spring
- Spring IOC 的原理
Spring 載入bean生命週期
答案:
Spring中的bean的生命週期,如果從細節上來講,是非常複雜的,從粗粒度上來講就是:
1、呼叫構造方法建立物件;
2、呼叫物件的set方法設定屬性值;
3、可以使用Spring提供的一些介面,可以在bean set方法呼叫完後,做些處理工作或者注入一些自定義的程式碼實現;
4、整個bean初始完後,所有的依賴物件注入後,如果想做一些初始化工作,可以利用@PostConstruct等一些註解
5、銷燬bean之前做一些處理工作
6、銷燬beanSpring AOP的實現原理
- Spring使用了哪些設計模式
- cglib和動態代理有什麼區別
- cglib和動態代理哪個效率高
- spring bean 的scope有哪幾種
設計模式
請寫出一個高效能執行緒安全的單例出來
public class Singleton
{
private static Singleton singleton = null;
private Singleton() { }
public static Singleton getInstance() {
if (singleton != null) {
return singleton;
}
synchronized (Singleton.class) {
if (singleton== null) {
singleton= new Singleton();
}
}
}
}複製程式碼
描述一下模板設計模式
微服務
- 什麼是微服務
- 描述一下你用過的微服務框架的原理
- 微服務使用什麼技術進行資料序列化和反序列化的
- 瞭解thift嗎?請解釋一下thift的原理
- 微服務的服務治理是怎麼做的
- 微服務有什麼優缺點
MQ
- rabbitMQ和kafka的區別
- rabbitMQ的實現機制
- 如何保證訊息有序
- 如何防止訊息丟失
網路
- TCP/IP 三次握手的過程
- Netty(關於netty,請參看Netty專欄)
其他
- 系統遇到過什麼難題,怎麼解決的
- 最有成就感的一件事情是什麼
原文連結