重點知識
由于我面試的JAVA開發工程師,針對于JAVA,需要了解的重點内容有:
JVM記憶體管理機制和垃圾回收機制(基本每次面試都會問,一定要搞得透徹)
JVM記憶體調優(了解是怎麼回事,一般做項目過程中使用較多)
設計模式(熟悉常見設計模式的應用場景,會畫類圖,實在不行背幾個也是有用的)
多線程(每次都會問,包括線程和程序、線程狀态、線程并發的操作等,需要深入複習)
JAVA集合類架構(了解架構圖、HashMap、ArrayList、HashSet等的關系和差別,其中HashMap的存儲機制幾乎每次都有問)
JAVA的異常處理機制(異常的分類、常見的異常有哪些、Try catch finally的使用)
JVM運作機制(了解JVM是如何運作的)
Linux基礎(面試筆試中對linux也有一定的要求,建議最好搭建一個linux虛拟機,并練習常用的指令)
資料結構和算法
常見的排序算法就不說了,需要了解其原理和會寫代碼,還有時間空間複雜度也要知道
隊列、棧:需要了解其存取結構,并能在某些場景下使用
二叉樹:樹的周遊、樹的深度、按層次輸出、平衡二叉樹、逆序列印樹等
連結清單:逆序、合并兩有序的連結清單、判斷連結清單是否又環、連結清單倒數第K個元素等
字元串:KMP算法、動态規劃(這個是重點,需要好好了解動态規劃,常見的題有:求解最長回文子串、求解最長公共子串等)
海量資料處理:現在好多大公司都會問海量資料的處理,是以需要掌握常見的處理方法,比如Bit-map、分而治之、hash映射等,可以百度看看相關的文章,加深了解
資料庫相關(資料庫是重點,每家公司都會問)
最基本的資料庫CRUD操作要熟悉,能夠根據表寫出需要的SQL語句
事務、零時表、索引、表鎖、行列鎖、視圖、存儲過程等都要深入了解
網際網路公司處理的資料量都很大,是以有必要對資料庫優化和大資料的處理進行了解和熟悉
建議看看Nosql和redis等非關系資料庫相關的書籍和資料
開源架構
像SSH等的開源架構在面試過程中問的很少,但是也是有必要了解SSH的運作原理和使用。面試主要考察的是基礎,是以更加偏向于考察資料結構、算法、資料庫、JAVA基礎知識等。是以,如果你時間有限,可以把精力放在基礎知識的學習和複習上,如果你時間充裕,可以學習和複習開源架構相關知識。對于開源架構:最好還是看看源碼,對自己的好處是很大的。
個人建議
上面比較詳細地列出和分析了最近面試過程中的問題,由于時間長久,不可能全部都回憶起來,但是大體上相差不大。對于面試,個人的一些建議:
(1)心态要放好,不能着急。不要看到被人拿到offer,自己沒有就抱有心裡壓力,其實工作誰都可以找到,就看滿意不滿意,是以着急也是沒有用。
(2)身體很重要。不要熬通宵複習、學習,把身體搞垮了得不償失。保持良好的睡眠。
(3)善于總結面試中的問題。每一次筆試、面試完後,需要進行總結,将自己不會的知識點一定要搞清楚,如果不搞清楚,下次還有可能會問的。其實找工作的過程就是積累知識的過 程,是以善于總結很重要。
(4)不要盲目投遞履歷。不要看見大公司就投遞,也不要投遞自己不想去的城市,那樣就是在瞎折騰,公司就算要你了,你也不去,還不如把時間放在自己想去的地方呢。
(5)複習需要持續。由于記憶過後會遺忘,是以複習過程中,需要反複進行,一邊了解一邊記憶,達到閉上眼就能看見知識的體系結構。
最後,希望找工作的朋友都能找到一份滿意的工作。下面具體列出了面試常見的知識點,供大家參考,希望對你有所幫助。
主要詳細知識點
常用算法考察
冒泡排序
快速排序
插入排序
希爾排序
歸并排序
堆排序
桶排序
動态規劃
最長公共子串
最長回文子串
數組的最大k個值
數字的最大連續子數組之和
左旋轉字元串
字元串比對算法:KMP算法
二分查找
連結清單
單連結清單逆序
兩個有序單連結清單合并
兩個單連結清單是否相交
相交處的節點
單連結清單倒數第K個數
單連結清單排序
棧和隊列
設計包含min函數的棧
兩個隊列實作棧
兩個棧實作隊列
一個數組實作棧和隊列
樹
前序、中序、後續周遊
求二叉樹的深度
按層次周遊二叉樹
判斷二叉樹是否為完全二叉樹
判斷二叉樹是否鏡面對稱
判斷兩顆樹是否相等
卡特蘭數
出棧順序
n個節點構成的二叉樹個數
括号化
凸多邊形三角劃分
資料庫
資料庫的crud語句的書寫
資料庫優化政策、如何優化
海量資料優化
事務
事務中鎖分類
事務特性
資料庫表鎖
行列鎖
臨時表
索引
存儲空間
視圖
Nosql、redis等的熟悉、了解
海量資料的處理
Bit-map、分而治之、hash映射、分布式處理(Hadoop)、Trie樹、雙層桶排序等
Java基礎
HashMap的存儲機制(很重要,必看)
Set、map差別
Set、list差別
Arraylist、LinkedList差別
String、Stringbufer、StringBuilder差別
HashSet、LinkedHashSet差別
HashMap、TreeMap、LinkedHashMap
熟悉Java集合類的架構圖
HashMap、ArrayList、StringBuffer、String等源碼的熟悉
線程和程序
線程的特性
線程的狀态
多線程并發的實作
線程的建立方式
線程池的使用
Java作用域
final、static、native、等特殊關鍵字的使用
Java按值傳遞的過程
重構和重載
抽象類和接口
内部類的使用:匿名内部類、靜态内部類等
Java多線程并發、生産者消費者的實作
Java連接配接資料庫的過程
JVM記憶體管理和存儲機制
JVM垃圾回收機制,垃圾回收算法
JVM加載類過程
JVM記憶體調優
架構相關
對架構的熟悉:SSH (面試過程中問的很少,像jsp、servlet基本不問)
Spring架構組成、AOP、IOC 、用到的設計模式
Hibernate運作機制、緩存的使用、最好看看源碼
熟悉和了解JavaScript和jQuery
java中IO、NIO
Java NIO和IO之間第一個最大的差別是,IO是面向流的,NIO是面向緩沖區的。 Java IO面向流意味着每次從流中讀一個或多個位元組,直至讀取所有位元組,它們沒有被緩存在任何地方。此外,它不能前後移動流中的資料。如果需要前後移動從流中讀取的資料,需要先将它緩存到一個緩沖區。 Java NIO的緩沖導向方法略有不同。資料讀取到一個它稍後處理的緩沖區,需要時可在緩沖區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有您需要處理的資料。而且,需確定當更多的資料讀入緩沖區時,不要覆寫緩沖區裡尚未處理的資料。
IO流包括位元組流和字元流:
位元組流:對應抽象類為InputStream(輸入流)和 OutputStream(輸出流)。 FileInputStream、FileOutputStream
字元流:對應抽象類為Reader(輸入流)和Writer(輸出流)。BufferedReader、InputStreamReader、 StringReader
java中異常的分類及結構
Java中的異常類,包括内置的異常類以及自定義的異常類,都直接或者間接地繼承至java.lang.Throwable類。在java.lang包中,Throwable類有兩個直接子類:Error類和Exception類,Error類及其子類描述了java運作時系統的内部錯誤和資源耗盡錯誤。出現這樣的錯誤的,除了通知使用者,并接盡力使程式安全地終止之外,沒有更好的辦法。Exception類的層次結構又分為兩個分支:一個分支由RuntimeException派生,另外一個分支包含除RuntimeException類之外的異常類。
運作時異常、非運作時異常
運作時異常:RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException、classCastException等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度盡可能避免這類異常的發生。
非運作時異常:RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程式文法角度講是必須進行處理的異常,不處理程式不能編譯通過。如IOException、SQLException等以及使用者自定義的Exception異常。
動态代理機制
動态代理可以提供對另一個對象的通路,同時隐藏實際對象的具體事實。代理一般會實作它所表示的實際對象的接口。代理可以通路實際對象,但是延遲實作實際對象的部分功能,實際對象實作系統的實際功能,代理對象對客戶隐藏了實際對象。客戶不知道它是與代理打交道還是與實際對象打交道。動态代理主要包含以下角色:動态代理類(以下簡稱為代理類)是一個實作在建立類時在運作時指定的接口清單的類,該類具有下面描述的行為。代理接口 是代理類實作的一個接口。代理執行個體 是代理類的一個執行個體。每個代理執行個體都有一個關聯的調用處理程式 對象,它可以實作接口 InvocationHandler。通過其中一個代理接口的代理執行個體上的方法調用将被指派到執行個體的調用處理程式的 Invoke 方法,并傳遞代理執行個體、識别調用方法的java.lang.reflect.Method 對象以及包含參數的 Object 類型的數組。調用處理程式以适當的方式處理編碼的方法調用,并且它傳回的結果将作為代理執行個體上方法調用的結果傳回。
try catch finally的使用
1. finally 裡 始終會被執行到, System.exit(0); 除這種被執行外。
2. 即使try中有return ,也是先執行 return 後面的語句完了之後,不立馬return,而是去執行finally中的語句。
3. 當try中與finally裡,同時出現return , 則隻會傳回 finally 中的return 結果。
4. finally中的值不能影響try中 即将傳回的結果值。
注意: 若finally中沒有return在try或catch中有return,那麼在執行return跟着語句之後,會把語句的結果新開辟一記憶體空間,直接把結果的存放此記憶體空間中。是以,finally中的值不能影響try或catch中即将return的結果。
靜态成員、非靜态成員
(1)類的靜态成員(變量和方法)屬于類本身,在類加載的時候就會配置設定記憶體,可以通過類名直接去通路;非靜态成員(變量和方法)屬于類的對象,是以隻有在類的對象産生(建立類的執行個體)時才會配置設定記憶體,然後通過類的對象(執行個體)去通路。
(2)在一個類的靜态成員中去通路其非靜态成員之是以會出錯是因為在類的非靜态成員不存在的時候類的靜态成員就已經存在了,通路一個記憶體中不存在的東西當然會出錯
抽象類遵循的原則:
(1)abstract關鍵字隻能修飾類和方法,不能修飾字段。
(2)抽象類不能被執行個體化(無法使用new關鍵字建立對象執行個體),隻能被繼承。
(3)抽象類可以包含屬性,方法,構造方法,初始化塊,内部類,枚舉類,和普通類一樣,普通方法一定要實作,變量可以初始化、不初始化但不能初始化後在抽象類中重新指派或操作該變量(隻能在子類中改變該變量)。
(4)抽象類中的抽象方法(加了abstract關鍵字的方法)不能實作。
(5)含有抽象方法的類必須定義成抽象類。
擴充:抽象類和接口的差別:
(1)接口是公開的,裡面不能有私有的方法或變量,是用于讓别人使用的,而抽象類是可以有私有方法或私有變量的。
(2)abstractclass 在Java 語言中表示的是一種繼承關系,一個類隻能使用一次繼承關系。但是,一個類卻可以實作多個interface,實作多重繼承。接口還有辨別(裡面沒有任何方法,如Remote接口)和資料共享(裡面的變量全是常量)的作用。
(3)在abstractclass 中可以有自己的資料成員,也可以有非abstarct的成員方法,而在interface中,隻能夠有靜态的不能被修改的資料成員(也就是必須是static final的,不過在interface中一般不定義資料成員),所有的成員方法預設都是 public abstract 類型的。
(4)abstractclass和interface所反映出的設計理念不同。其實abstractclass表示的是"is-a"關系,interface表示的是"has-a"關系。
(5)實作接口的一定要實作接口裡定義的所有方法,而實作抽象類可以有選擇地重寫需要用到的方法,一般的應用裡,最頂級的是接口,然後是抽象類實作接口,最後才到具體類實作。抽象類中可以有非抽象方法。接口中則不能有實作方法。
(6)接口中定義的變量預設是publicstatic final 型,且必須給其初值,是以實作類中不能重新定義,也不能改變其值。抽象類中的變量預設是friendly 型,其值可以在子類中重新定義,也可以在子類中重新指派。
二、參考資料
1.
一個月的面試總結(java)