Java程式設計師面試—提升7倍成功拿offer
前言
程式設計師需求量大,但是公司在選人的時候對於程式設計師的選擇也有一定的考量,面試是程式設計師進入一個公司的第一道關。
一次成功的面試成為了程式設計師搞定優質職位的快速方式,總結了一些程式設計師在面試中會經常遇見的問題。

面試題
1. java基礎以及多個“比較”(一般小白都會,難的在後面)
(1)String 和 StringBuilder 的區別
(2)Vector 與 Array 的區別
( 3 )HashMap 與 Hashtable 的區別
( 4)ArrayList與 LinkedList 的區別?
( 5 )Java 中,Comparator 與Comparable 有什麼不同?
( 6 )抽象類是什麼?它與介面有什麼區別?你為什麼要使用過抽象類?
( 7 )Collection與Collections的區別是什麼?
(8)java中public,private,protected以及預設關鍵字的訪問範圍:
( 9 )poll() 方法和 remove() 方法的區別?
(10)寫一段程式碼在遍歷 ArrayList 時移除一個元素使用迭代器。
2. JVM
(1)JVM如何載入一個類的過程,雙親委派模型中有哪些方法
(2)GC演算法(什麼樣的物件算是可回收物件,可達性分析),CMS收集器
(3)JVM分為哪些區,每一個區幹嗎的?
(4)JVM新生代,老年代,持久代,都儲存哪些東西?
(5)記憶體溢位和記憶體洩漏:
(6)程序與執行緒:
(7)序列化與反序列化:
(8)64 位 JVM 中,int 的長度是多數?
(9)Java 中 WeakReference 與 SoftReference的區別?
(10)解釋 Java 堆空間及 GC?
3. 併發,鎖
(1)java每改一點都需要重新編譯打包部署,有沒有更好的方法
(2)程序間通訊有哪幾種方式?
(3)Sychronized修飾靜態方法,鎖定類本身而不是例項,非靜態方法鎖定例項。
(4)作業系統什麼情況下會死鎖?
(5)產生死鎖的四個條件:
(6)如何理解分散式鎖?
(7)執行緒同步與阻塞的關係?同步一定阻塞嗎?阻塞一定同步嗎?
(8) 同步和非同步有什麼區別?
(9)如何呼叫 wait()方法?使用 if 塊還是迴圈?為什麼?
(10)什麼是多執行緒環境下的偽共享(false sharing)?
4. 網路、資料庫
(1)TCP如何保證可靠傳輸?三次握手過程?
(2)Linux下你常用的命令有哪些?
(3) 常用的hash演算法有哪些?
(4) 什麼是一致性雜湊?
(5) 資料庫中的正規化有哪些?
(6) 資料庫中的索引的結構?什麼情況下適合建索引?
(7)concurrent包下面,都用過什麼?
(8)常用的資料庫有哪些?redis用過嗎?
(9)你知道的開源協議有哪些?
(10)表單提交中,get和post區別
5.面試題目答案以及答案解析:
(1)String 和 StringBuilder 的區別
解析 : 1,可變與不可變: String不可變,每一次執行“+”都會新生成一個新物件,所以頻繁改變字串的情況中不用String,以節省記憶體。
2,是否多執行緒安全 :StringBuilder並沒有對方法進行加同步鎖,所以是非執行緒安全的。StringBuffer和String均執行緒安全。
(2)JVM如何載入一個類的過程,雙親委派模型中有哪些方法
解析:類載入過程: 載入、驗證(驗證階段作用是保證Class檔案的位元組流包含的資訊符合JVM規範,不會給JVM造成危害)、準備(準備階段為變數分配記憶體並設定類變數的初始化)、解析(解析過程是將常量池內的符號引用替換成直接引用)、初始化。
雙親委派模型中方法: 雙親委派是指如果一個類收到了類載入的請求,不會自己先嚐試載入,先找父類載入器去完成。當頂層啟動類載入器表示無法載入這個類的時候,子類才會嘗試自己去載入。當回到最開的發起者載入器還無法載入時,並不會向下找,而是丟擲ClassNotFound異常。
方法: 啟動(Bootstrap)類載入器,標準擴充套件(Extension)類載入器,應用程式類載入器(Application ),上下文(Custom)類載入器。意義是防止記憶體中出現多份同樣的位元組碼
(3)java每改一點都需要重新編譯打包部署,有沒有更好的方法
解析: 可以使用熱載入
(4)TCP如何保證可靠傳輸?三次握手過程?
解析: 在TCP的連線中,資料流必須以正確的順序送達對方。TCP的可靠性是通過順序編號和確認(ACK)來實現的。TCP 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 TCP 視窗大小資訊。第一次是客戶端發起連線;第二次表示伺服器收到了客戶端的請求;第三次表示客戶端收到了伺服器的反饋。

面試時怎麼來引導面試官
我在某些領域非常厲害,但是面試官不問,我心裡著急呀。既然面試官不問,那我只好主動引誘了...呸,我只好主動引導了。
簡歷上一定要寫,而且要寫在醒目的位置;只有面試官看到了,才有可能問。
主動說,在自我介紹的時候、描述專案經驗的時候,都可以主動說。例如:“我做XXX專案的時候,因為這個專案的資料量非常的大,在專案初期,我們專案是單資料庫執行,我對SQL優化做了深度的研究,包括xxxx,yyyy,zzzz;後期對資料庫進行了拆分,我們用到了aaaa和bbbb”。
面試官在問到某項技術的時候,很自然地帶出來另外一個有深度的知識點。例如:面試官問,Redis你們一般用在什麼樣的場景。你回答:“主要用作快取,儲存一些訪問比較頻繁的資料”,後面可以接著說:“不過我們在一個專案使用過程中,在Redis中查詢不到,會訪問資料庫,如果一個不存在的key反覆查詢,那麼資料庫的壓力依然會很大(快取穿透),我們當時用了一個辦法去解決...(省略五十字)...”
面試及學習資料:
歡迎工作一到五年的Java工程師朋友們加入Java架構交流群:909723834
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)
合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
