面試題: !=!=未看
重點知識
由於我面試的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個節點構成的二叉樹個數
括號化
凸多邊形三角劃分
設計模式
Java源碼中有哪些設計模式
http://www.iteye.com/news/18725
常見的設計模式類圖
http://blog.sina.com.cn/s/blog_8cc6ff5c0101d4cp.html
常見的設計模式的示例:
http://www.jb51.net/article/27973.htm
數據庫
數據庫的crud語句的書寫
數據庫優化策略、如何優化
海量數據優化
事務
事務中鎖分類
事務特性
數據庫表鎖
行列鎖
臨時表
索引
存儲空間
視圖
Linux常用命令(最好實戰)
http://www.php100.com/html/webkaifa/Linux/2009/1106/3485.html
linux上搭建服務器
http://www.cnblogs.com/dudu/archive/2012/12/09/linux-apache-git.html
常用的網絡端口
http://www.360doc.com/content/11/1202/09/8209768_169068538.shtml
Nosql、redis等的熟悉、了解
http://www.yiibai.com/redis/redis_quick_guide.html
海量數據的處理
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內存管理和存儲機制
http://blog.csdn.net/lengyuhong/article/details/5953544
JVM垃圾回收機制,垃圾回收算法
http://jbutton.iteye.com/blog/1569746
JVM加載類過程
http://www.cnblogs.com/sunada2005/p/3577799.html
JVM內存調優
http://www.cnblogs.com/jackyrong/archive/2010/01/21/1653163.html
http://blog.csdn.net/cutesource/article/details/5907418
框架相關
對框架的熟悉: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 型,其值可以在子類中重新定義,也可以在子類中重新賦值。
面試題: !=!=未看