主要包括如下幾個部分:前端
面試,是你們從學校走向社會的第一步。java
互聯網公司的校園招聘,從形式上說,面試通常分爲 2-3 輪技術面試 +1 輪 HR 面試。可是一些公司確實是沒有 HR 面試的,直接就是三輪技術面。git
技術面試中,面試官通常會先就你所應聘的崗位進行相關知識的考察,也叫基礎知識和業務邏輯面試。只要你回答的不是特別差,面試官一般會說:「我們寫個代碼吧」,這個時候就開始了算法面試。程序員
也就是說,一輪技術面試 = 基礎知識和業務邏輯面試 + 算法面試。github
在本篇文章中,咱們主要從技術面試聊起。技術面試包括:業務邏輯和基礎知識面試。面試
首先是業務邏輯面試 ,也就是講項目。算法
面試官會對你簡歷上寫的若干個項目其中之一拿出來和你聊聊。在期間,會針對你所作的東西進行深度挖掘。sql
包括:爲何要這麼作?優缺點分析,假如從新讓你作一次,你打算怎麼作? 等等。這個環節主要考察咱們對本身作過的項目(實習項目或者校內項目)是否有一個清晰的認識。數據庫
關於業務邏輯面試的準備,建議在平時多多思考總結,對項目的數據來源、總體運行框架都應該熟悉掌握。編程
好比說你在某公司實習過程當中,就能夠進行總結,而沒必要等到快離職的時候慌慌張張的去總結該項目。
接下來是基礎知識面試。
Java 開發屬於後臺開發方向,有人說後臺開發很坑,由於須要學習的東西太多了。沒錯,這個崗位就是須要學習好多東西。包括:本語言(Java/C++/PHP)基礎、數據庫、網絡協議、Linux 系統、計算機原理甚至前端相關知識均可以考察你,並且,並不超綱 。
有時候,你報的是後臺開發崗,而且熟悉的是 Java 語言,可是面試官倒是 C++ 開發方向的,就是這麼無奈~
好了,閒話少說,讓咱們開始分類講解常見面試知識點。
1)面向對象的特性有哪些?
答:封裝、繼承和多態。
2)Java 中覆蓋和重載是什麼意思?
解析:覆蓋和重載是比較重要的基礎知識點,而且容易混淆,因此面試中常見。
答:覆蓋(Override)是指子類對父類方法的一種重寫,只能比父類拋出更少的異常,訪問權限不能比父類的小。
被覆蓋的方法不能是 private 的,不然只是在子類中從新定義了一個方法;重載(Overload)表示同一個類中能夠有多個名稱相同的方法,但這些方法的參數列表各不相同。
面試官: 那麼構成重載的條件有哪些?
答:參數類型不一樣、參數個數不一樣、參數順序不一樣。
面試官: 函數的返回值不一樣能夠構成重載嗎?爲何?
答:不能夠,由於 Java 中調用函數並不須要強制賦值。舉例以下:
以下兩個方法:
1
2
|
void f(){}
int f(){ return 1 ;}
|
只要編譯器能夠根據語境明確判斷出語義,好比在 int x = f();中,那麼的確能夠據此區分重載方法。不過, 有時你並不關心方法的返回值,你想要的是方法調用的其餘效果 (這常被稱爲 「爲了反作用而調用」),這時你可能會調用方法而忽略其返回值,因此若是像下面的調用:
1
|
fun();
|
此時 Java 如何才能判斷調用的是哪個 f() 呢?別人如何理解這種代碼呢?因此,根據方法返回值來區分重載方法是行不通的。
3)抽象類和接口的區別有哪些?
答:
面試官:抽象類和接口如何選擇?
答:
4)Java 和 C++ 的區別:
解析:雖然咱們不太懂 C++,可是就是會這麼問,尤爲是三面(總監級別)面試中。
答:
5)Java 中的值傳遞和引用傳遞
解析:這類題目,面試官會手寫一個例子,讓你說出函數執行結果,詳細舉例請查閱個人博客:Java 值傳遞和引用傳遞基礎分析。
答:值傳遞是指對象被值傳遞,意味着傳遞了對象的一個副本,即便副本被改變,也不會影響源對象。引用傳遞是指對象被引用傳遞,意味着傳遞的並非實際的對象,而是對象的引用。
所以,外部對引用對象的改變會反映到全部的對象上。
6)JDK 中經常使用的包有哪些?
答:java.lang、java.util、http://java.io、http://java.net、java.sql。
7)JDK,JRE 和 JVM 的聯繫和區別:
答:JDK 是 java 開發工具包,是 java 開發環境的核心組件,並提供編譯、調試和運行一個 java 程序所須要的全部工具,可執行文件和二進制文件,是一個平臺特定的軟件。
JRE 是 java 運行時環境,是 JVM 的實施實現,提供了運行 java 程序的平臺。JRE 包含了 JVM,可是不包含 java 編譯器 / 調試器之類的開發工具。
JVM 是 java 虛擬機,當咱們運行一個程序時,JVM 負責將字節碼轉換爲特定機器代碼,JVM 提供了內存管理 / 垃圾回收和安全機制等。
這種獨立於硬件和操做系統,正是 java 程序能夠一次編寫多處執行的緣由。
區別:
Others:限於篇幅,面試中 Java 基礎知識點還有:反射、泛型、註解等。
小結:本節主要闡述了 Java 基礎知識點,這些問題主要是一面面試官在考察,難度不大,適當複習下,應該沒什麼問題。
集合這方面的考察至關多,這部分是面試中必考的知識點。
1)說說常見的集合有哪些吧?
答:Map 接口和 Collection 接口是全部集合框架的父接口:
(2)HashMap 和 Hashtable 的區別有哪些?(必問)
答:
3)HashMap 的底層實現你知道嗎?
答:在 Java8 以前,其底層實現是數組 + 鏈表實現,Java8 使用了數組 + 鏈表 + 紅黑樹實現。此時你能夠簡單的在紙上畫圖分析:
4)ConcurrentHashMap 和 Hashtable 的區別? (必問)
答:ConcurrentHashMap 結合了 HashMap 和 HashTable 兩者的優點。HashMap 沒有考慮同步,hashtable 考慮了同步的問題。可是 hashtable 在每次同步執行時都要鎖住整個結構。 ConcurrentHashMap 鎖的方式是稍微細粒度的。 ConcurrentHashMap 將 hash 表分爲 16 個桶(默認值),諸如 get,put,remove 等經常使用操做只鎖當前須要用到的桶。
面試官:ConcurrentHashMap 的具體實現知道嗎?
答:
5)HashMap 的長度爲何是 2 的冪次方?
答:
更糟的是這種狀況中,數組可使用的位置比數組長度小了不少,這意味着進一步增長了碰撞的概率,減慢了查詢的效率!這樣就會形成空間的浪費。
6)List 和 Set 的區別是啥?
答:List 元素是有序的,能夠重複;Set 元素是無序的,不能夠重複。
7)List、Set 和 Map 的初始容量和加載因子
答:
1. List
2. Set
HashSet,初始容量爲 16,加載因子爲 0.75; 擴容增量:原容量的 1 倍; 如 HashSet 的容量爲 16,一次擴容後容量爲 32
3. Map
HashMap,初始容量 16,加載因子爲 0.75; 擴容增量:原容量的 1 倍; 如 HashMap 的容量爲 16,一次擴容後容量爲 32
8)Comparable 接口和 Comparator 接口有什麼區別?
答:
9)Java 集合的快速失敗機制 「fail-fast」
答:它是 java 集合的一種錯誤檢測機制,當多個線程對集合進行結構上的改變的操做時,有可能會產生 fail-fast 機制。
例如 :假設存在兩個線程(線程 一、線程 2),線程 1 經過 Iterator 在遍歷集合 A 中的元素,在某個時候線程 2 修改了集合 A 的結構(是結構上面的修改,而不是簡單的修改集合元素的內容),那麼這個時候程序就會拋出 ConcurrentModificationException 異常,從而產生 fail-fast 機制。
緣由: 迭代器在遍歷時直接訪問集合中的內容,而且在遍歷過程當中使用一個 modCount 變量。集合在被遍歷期間若是內容發生變化,就會改變 modCount 的值。
每當迭代器使用 hashNext()/next() 遍歷下一個元素以前,都會檢測 modCount 變量是否爲 expectedmodCount 值,是的話就返回遍歷;不然拋出異常,終止遍歷。
解決辦法:
小結:本小節是 Java 中關於集合的考察,是 Java 崗位面試中必考的知識點,除了應該掌握以上的問題,包括各個集合的底層實現也建議各位同窗閱讀,加深理解。
在 Java 5.0 提供了 java.util.concurrent(簡稱 JUC )包,在此包中增長了在併發編程中很經常使用的實用工具類,用於定義相似於線程的自定義子系統,包括線程池、異步 IO 和輕量級任務框架。
1)多線程和單線程的區別和聯繫:
答:
結論:即採用多線程不會提升程序的執行速度,反而會下降速度,可是對於用戶來講,能夠減小用戶的響應時間。
2)如何指定多個線程的執行順序?
解析:面試官會給你舉個例子,如何讓 10 個線程按照順序打印 0123456789?(寫代碼實現)
答:
3)線程和進程的區別:(必考)
答:
4)多線程產生死鎖的 4 個必要條件?
答:
面試官:如何避免死鎖?(常常接着問這個問題哦~)
答:指定獲取鎖的順序,舉例以下:
5)sleep( ) 和 wait( n)、wait( ) 的區別:
答:
6)synchronized 關鍵字:
答:底層實現:
含義:(monitor 機制)
Synchronized 是在加鎖,加對象鎖。對象鎖是一種重量鎖(monitor),synchronized 的鎖機制會根據線程競爭狀況在運行時會有偏向鎖(單一線程)、輕量鎖(多個線程訪問 synchronized 區域)、對象鎖(重量鎖,多個線程存在競爭的狀況)、自旋鎖等。
該關鍵字是一個幾種鎖的封裝。
7)volatile 關鍵字
答:該關鍵字能夠保證可見性不保證原子性。
功能:
解析:關於指令重排序的問題,能夠查閱 DCL 雙檢鎖失效相關資料。
8)ThreadLocal(線程局部變量)關鍵字:
答:當使用 ThreadLocal 維護變量時,其爲每一個使用該變量的線程提供獨立的變量副本,因此每個線程均可以獨立的改變本身的副本,而不會影響其餘線程對應的副本。
ThreadLocal 內部實現機制:
9)Atomic 關鍵字:
答:可使基本數據類型以原子的方式實現自增自減等操做。參考個人博客:concurrent.atomic 包下的類 AtomicInteger 的使用。
10)線程池有了解嗎?(必考)
答:java.util.concurrent.ThreadPoolExecutor 類就是一個線程池。客戶端調用 ThreadPoolExecutor.submit(Runnable task) 提交任務,線程池內部維護的工做者線程的數量就是該線程池的線程池大小,有 3 種形態:
小結:本小節內容涉及到 Java 中多線程編程,線程安全等知識,是面試中的重點和難點。
既然是 Java 開發面試,那麼對 JVM 的考察固然也是必須的,面試官通常會問你對 JVM 有了解嗎?
我一般都會把我所瞭解的都說一遍,包括:JVM 內存劃分、JVM 垃圾回收的含義,有哪些 GC 算法,年輕代和老年代各自的特色通通闡述一遍。
1)JVM 內存劃分:
2)相似-Xms、-Xmn 這些參數的含義:
答:
堆內存分配:
非堆內存分配:
3)垃圾回收算法有哪些?
答:
此算法須要暫停整個應用,同時,會產生內存碎片;
此算法每次只處理正在使用中的對象,所以複製成本比較小,同時複製過去之後還能進行相應的內存整理,不會出現 「碎片」 問題。固然,此算法的缺點也是很明顯的,就是須要兩倍內存空間;
此算法避免了 「標記-清除」 的碎片問題,同時也避免了 「複製」 算法的空間問題。
4)root 搜索算法中,哪些能夠做爲 root?
答:
5)GC 何時開始?
答:GC 常常發生的區域是堆區,堆區還能夠細分爲新生代、老年代,新生代還分爲一個 Eden 區和兩個 Survivor 區。
大對象直接進入老年代,如很長的字符串數組,虛擬機提供一個;XX:PretenureSizeThreadhold 參數,令大於這個參數值的對象直接在老年代中分配,避免在 Eden 區和兩個 Survivor 區發生大量的內存拷貝;
6)內存泄漏和內存溢出
答:
概念:
內存泄漏的緣由分析:
小結:本小節涉及到 JVM 虛擬機,包括對內存的管理等知識,相對較深。除了以上問題,面試官會繼續問你一些比較深的問題,可能也是爲了看看你的極限在哪裏吧。
好比:內存調優、內存管理,是否遇到過內存泄漏的實際案例、是否真正關心過內存等。因爲本人實際項目經驗不足,這些深層次問題並無接觸過,各位有須要能夠上網查閱。
關於 Java8 中新知識點,面試官會讓你說說 Java8 你瞭解多少,下邊主要闡述我所瞭解,而且在面試中回答的 Java8 新增知識點。
1)HashMap 的底層實現有變化:HashMap 是數組 + 鏈表 + 紅黑樹(JDK1.8 增長了紅黑樹部分)實現。
2)JVM 內存管理方面,由元空間代替了永久代。
區別:
3)Lambda 表達式(也稱爲閉包),容許咱們將函數當成參數傳遞給某個方法,或者把代碼自己當作數據處理。
4)函數式接口:指的是隻有一個函數的接口,java.lang.Runnable 和 java.util.concurrent.Callable 就是函數式接口的例子;java8 提供了一個特殊的註解 @Functionallnterface 來標明該接口是一個函數式接口。
5)引入重複註解:Java 8 中使用 @Repeatable 註解定義重複註解。
6)接口中能夠實現方法 default 方法。
7) 註解的使用場景拓寬: 註解幾乎可使用在任何元素上:局部變量、接口類型、超類和接口實現類,甚至能夠用在函數的異常定義上。
8) 新的包 java.time 包
小結:Java8 的一些新特性,面試官通常狀況下不要求你有多麼精通,主要是看看你有沒有一些瞭解。
網絡協議方面,考察最多的包括服務器和客戶端在三次握手、四次揮手過程當中的狀態變化;還有網絡擁塞控制,及其解決辦法等。
1)三次握手、四次揮手示意圖:
總共有四種狀態:主動創建鏈接、主動斷開鏈接、被動創建連和被動斷開鏈接
兩兩組合仍是 4 種組合:
2)滑動窗口機制
由發送方和接收方在三次握手階段,互相將本身的最大可接收的數據量告訴對方。也就是本身的數據接收緩衝池的大小。這樣對方能夠根據已發送的數據量來計算是否能夠接着發送。
在處理過程當中,當接收緩衝池的大小發生變化時,要給對方發送更新窗口大小的通知。
3)擁塞避免機制
擁塞:對資源的需求超過了可用的資源。若網絡中許多資源同時供應不足,網絡的性能就要明顯變壞,整個網絡的吞吐量隨之負荷的增大而降低。
擁塞控制:防止過多的數據注入到網絡中,使得網絡中的路由器或鏈路不致過載。
擁塞控制方法:
4)瀏覽器中輸入:「www.xxx.com」 以後都發生了什麼?請詳細闡述。
解析:經典的網絡協議問題。
答:
5)常見 HTTP 狀態碼
6)TCP 和 UDP 的區別:
答:
限於篇幅,更多網絡協議相關知識,請參閱個人博客:TCP/IP 協議面試常問知識點,傾心總結
小結:必須熟練掌握 TCP 和 UDP 的區別、三次握手和四次揮手的狀態切換,必考。
既然是後端開發,那麼與數據庫相關的知識點也是必不可少的。
1)MySQL 和 MongoDB 的區別有哪些?如何選擇?
2)MongoDB 的優缺點有哪些?
(ps 本人對這一塊不是很熟悉,就不附上參考答案了,請各位小夥伴自行學習哈~)
3)據說過事務嗎?(必考)
答:做爲單個邏輯工做單元執行的一系列操做,知足四大特性:
4)事務的併發問題有哪幾種?
答:丟失更新、髒讀、不可重複讀以及幻讀。
5)數據庫中的鎖有哪幾種?
答:獨佔鎖、排他鎖以及更新鎖。
6)事務的隔離級別有哪幾種?
答:讀未提交、讀已提交、可重複讀和序列化。
擴展問題:MySQL 事務默認隔離級別是哪一個?
答:可重複讀。
解析:關於問題(4)(5)(6)的詳細解答,請參閱個人博客:數據庫併發機制和事務的隔離級別詳解
(ps,關於數據庫事務方面的深層次考察還有分佈式事務即兩段提交和三段提交等,限於本人水平,請各位自行學習)
7)數據庫的索引有什麼做用?(必考) 底層數據結構是什麼,爲何使用這種數據結構?
答:
擴展問題:聚簇索引和非聚簇索引的區別?
8)MyISAM 和 InnoDB 的區別有哪些?
答:
最主要的區別是:MyISAM 表不支持事務、不支持行級鎖、不支持外鍵。 InnoDB 表支持事務、支持行級鎖、支持外鍵。(可直接回答這個)
9)數據庫中 Where、group by、having 關鍵字:
答: 關鍵字做用:
having 和 where 的區別:
當同時含有 where 子句、group by 子句 、having 子句及彙集函數時,執行順序以下:
10)還有一些問題,如 MySQL 和 SQL Server 用法上的區別、limit 關鍵字的使用等問題。
小結:數據庫方面仍是事務機制、隔離級別比較重要,固然了數據庫索引是必考的問題。偶爾也會給你幾個表,讓你現場寫 SQL 語句,主要考察 group by 和 having 等關鍵字。
我在項目中使用的框架有 Spring MVC 和 MyBatis,因此在簡歷上只寫了這兩種框架,面試官主要針對這兩種框架進行提問。如下問題供小夥伴們參考。
JavaWeb 開發經典的 3 層框架:Web 層、Service 層(業務邏輯層)和 Dao 層(數據訪問層)
Spring 知識點
1)Spring 的 IOC 和 AOP 有了解嗎?
答:
2)AOP 的實現方式有哪幾種?如何選擇?(必考)
答:JDK 動態代理實現和 cglib 實現。
選擇:
擴展:JDK 動態代理如何實現?(加分點)
答:JDK 動態代理,只能對實現了接口的類生成代理,而不是針對類,該目標類型實現的接口都將被代理。原理是經過在運行期間建立一個接口的實現類來完成對目標對象的代理。
解析:關於 IOC 和 AOP 的詳細闡述,請各位參閱個人博客:Spring 核心 AOP(面向切面編程)總結,Spring 框架學習—控制反轉(IOC)
3)Spring MVC 的核心控制器是什麼?消息處理流程有哪些?
答:核心控制器爲 DispatcherServlet。消息流程以下:
4)其餘問題包括:重定向和轉發的區別、動態代理和靜態代理的區別等。
Mybatis 知識點
關於 MyBatis 主要考察佔位符#和 $ 的區別,區別以下:
小結:限於做者水平,MVC 框架方面瞭解不是太多,實戰能力欠缺。面試官偶爾問框架底層實現原理等都知之甚少,有能力的小夥伴能夠多加學習。
大數據相關是由於個人簡歷上寫了 KafKa 相關項目,因此面試官會進行提問 KafKa 相關知識點,我也進行了一些簡單概念總結,深層次的實現原理由於並無特別多的實戰經驗,因此並不瞭解。
如下概念總結供小夥伴參考。
1)KafKa 基本特性:
答:快速持久化、支持批量讀寫消息、支持消息分區,提升了併發能力、支持在線增長分區、支持爲每一個分區建立多個副本。
擴展:爲何能夠實現快速持久化?
答:KafKa 將消息保存在磁盤中,而且讀寫磁盤的方式是順序讀寫,避免了隨機讀寫磁盤(尋道時間過長)致使的性能瓶頸;磁盤的順序讀寫速度超過內存隨機讀寫。
2)核心概念:
答:
副本(replica):
消費者組(Consumer Group): 每一個 consumer 都屬於一個 consumer group,每條消息只能被 consumer group 中的一個 Consumer 消費,但能夠被多個 consumer group 消費。
Broker:
Cluster&Controller:
保留策略和日誌壓縮:
關於副本機制:(加分點)
ISR 集合 :表示當前 「可用」 且消息量與 Leader 相差很少的副本集合。知足條件以下:
HW&LEO:
ISR、HW 和 LEO 的工做配合:
KafKa 的容災機制: 經過分區的副本 Leader 副本和 Follower 副原本提升容災能力。
小結:請小夥伴根據本身的簡歷自行準備學習大數據相關知識點。
做者對這一方面不是很精通,知識點來源於網絡總結以及面試官的提問,僅供小夥伴參考。
1)grep、sed 以及 awk 命令
解析:awk 命令若是能夠掌握,是面試中的一個 加分點。
2)文件和目錄:
pwd 顯示當前目錄
ls 顯示當前目錄下的文件和目錄:
3)處理文件方面的命令有:touch、cp、 In、mv、rm、
4)處理目錄方面的命令:mkdir
5)查看文件內容:file、cat、more、less、tail、head
6)監測程序命令:ps、top
eg. 找出進程名中包括 java 的全部進程:ps -ef | grep java
top 命令 實時監測進程
top 命令輸出的第一部分:顯示系統的歸納。
7)ps 和 top 命令的區別:
8) 壓縮數據
9)結束進程:kill PID 或者 kill all
至此,從十個不一樣的方面闡述了 Java 開發面試崗位中所涉及到的重要知識點。加上我上次發佈的 關於算法面試的 chat,我大概將最近一年的時間內的面試筆試經驗給你們作了總結分享。
接下來,爲了給你們提供更多的幫助,我想針對簡歷方面和你們聊聊,主要包括: 製做簡歷和投遞簡歷兩方面。
首先,我想先介紹下個人簡歷都包括哪些部分:
簡歷應該突出表現本身優秀的地方,因此我將我的技術博客和 github 地址放到了相對靠前的位置,使面試官或者 HR 能夠一眼看到。
各位小夥伴若是在校期間參加過什麼大型競賽而且獲獎,也能夠寫在明顯的位置。
給你們一個小提示,那就是必須對簡歷上所寫的知識點有必定了解,不懂的就不要寫上去了,由於你會被問的很慘(即便一面面試官不問,三面面試官也會問的)。
好比說你在簡歷上寫了一個技術 A,說本身在項目中使用過技術 A,那麼面試官就會問該技術 A 的底層實現、原理等等。
若是你回答出來,確實,這是加分項,可是不少時候咱們是回答不出來的。
投遞簡歷一樣很重要,對於並非出身名校的小夥伴來講,在投遞一些互聯網公司的時候,可能會面臨着簡歷被刷的可能。這時候內推的重要性就體現出來了。
內推是內部推薦的意思, 內推的好處通常有兩種:
內推時間點:
如何內推?
內推,意味着你要找到公司內部人員進行推薦,內推渠道主要是找本身的師兄師姐。另外能夠時常關注號稱 「全國最大的高校論壇」- 北郵人論壇 。
北郵人論壇資源至關豐富,每一年招聘季的內推帖子數不勝數,各位若是有須要,能夠關注一下。在牛客網以及賽碼網的討論區內也存在着大量的內推消息,你們能夠關注。