面試題: !=!=未看

重點知識

   因爲我面試的JAVA開發工程師,針對於JAVA,須要理解的重點內容有:php

       JVM內存管理機制和垃圾回收機制(基本每次面試都會問,必定要搞得透徹)html

1.JVM內存管理的機制

  內存空間劃分爲:Sun JDK在實現時遵守JVM規範,將內存空間劃分爲堆、JVM方法棧、方法區、本地方法棧、PC寄存器。java

  • 堆: 堆用於存儲對象實例及數組值,能夠認爲Java中全部經過new建立的對象的內存都在此分配,Heap中對象所佔用的內存由GC進行回收,在32位操做系統上最大爲2GB,在64位操做系統上則沒有限制,其大小可經過-Xms和-Xmx來控制,-Xms爲JVM啓動時申請的最小Heap內存,默認爲物理內存的1/64但小於1GB;-Xmx爲JVM可申請的最大Heap內存,默認爲物理內存的1/4但小於1GB,默認當空餘堆內存小於40%時,JVM會增大Heap到-Xmx指定的大小,可經過-XX:MinHeapFreeRatio=來指定這個比例;當空餘堆內存大於70%時,JVM會減少Heap的大小到-Xms指定的大小,可經過-XX:MaxHeapFreeRatio=來指定這個比例,對於運行系統而言,爲避免在運行時頻繁調整Heap 的大小,一般將-Xms和-Xmx的值設成同樣。
  • JVM方法棧: 爲線程私有,其在內存分配上很是高效。當方法運行完畢時,其對應的棧幀所佔用的內存也會自動釋放。當JVM方法棧空間不足時,會拋出StackOverflowError的錯誤,在Sun JDK中能夠經過-Xss來指定其大小
  • 方法區: 要加載的類的信息(名稱、修飾符等)、類中的靜態變量、類中定義爲final類型的常量、類中的Field信息、類中的方法信息。方法區域也是全局共享的,在必定條件下它也會被GC,當方法區域要使用的內存超過其容許的大小時,會拋出OutOfMemory的錯誤信息。在Sun JDK中這塊區域對應Permanet Generation,又稱爲持久代,默認最小值爲16MB,最大值爲64MB,可經過-XX:PermSize及-XX:MaxPermSize來指定最小值和最大值。
  • 本地方法棧: 用於支持native方法的執行,存儲了每一個native方法調用的狀態。在Sun JDK的實現中,和JVM方法棧是同一個。
  • PC寄存器: 佔用的可能爲CPU寄存器或操做系統內存

2.Java堆和棧的區別

  Java把內存劃分紅兩種:一種是棧內存,一種是堆內存。linux

  在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。當在一段代碼塊定義一個變量時,Java就在棧中爲這個變量分配內存空間,當超過變量的做用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間能夠當即被另做他用。git

  堆內存用來存放由new建立的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或對象後,還能夠在棧中定義一個特殊的變量,讓棧中這個變量的取值等於數組或對象在堆內存中的首地址,在棧中的這個特殊的變量就變成了數組或者對象的引用變量,之後就能夠在程序中使用棧內存中的引用變量來訪問堆中的數組或者對象,引用變量至關於爲數組或者對象起的一個別名,或者代號。web

  引用變量是普通變量,定義時在棧中分配內存,引用變量在程序運行到做用域外釋放。而數組&對象自己在堆中分配,即便程序運行到使用new產生數組和對象的語句所在地代碼塊以外,數組和對象自己佔用的堆內存也不會被釋放,數組和對象在沒有引用變量指向它的時候,才變成垃圾,不能再被使用,可是仍然佔着內存,在隨後的一個不肯定的時間被垃圾回收器釋放掉。這個也是java比較佔內存的主要緣由。可是在寫程序的時候,能夠人爲的控制。面試

3.Java內存泄露和內存溢出

  內存泄漏:分配出去的內存回收不了redis

  內存溢出:指系統內存不夠用了算法

4.Java類加載機制

  JVM將類加載過程劃分爲三個步驟:裝載、連接和初始化。sql

  1. 裝載(Load):裝載過程負責找到二進制字節碼並加載至JVM中,JVM經過類的全限定名(com.bluedavy. HelloWorld)及類加載器(ClassLoaderA實例)完成類的加載;
  2. 連接(Link):連接過程負責對二進制字節碼的格式進行校驗、初始化裝載類中的靜態變量及解析類中調用的接口、類;
  3. 初始化(Initialize):執行類中的靜態初始化代碼、構造器代碼及靜態屬性的初始化。

5.內存回收

  收集器:引用計數收集器、跟蹤收集器

  • 引用計數收集器:對於Java這種面向對象的會造成複雜引用關係(如ObjectB和ObjectC互相引用)的語言而言,引用計數收集器不是很是適合,Sun JDK在實現GC時也未採用這種方式。
  • 跟蹤收集器實現算法:複製(Copying)、標記-清除(Mark-Sweep)和標記-壓縮(Mark-Compact)

  複製:當要回收的空間中存活對象較少時,複製算法會比較高效,其帶來的成本是要增長一塊空的內存空間及進行對象的移動。

  標記-清除:在空間中存活對象較多的狀況下較爲高效,但因爲標記-清除採用的爲直接回收不存活對象所佔用的內存,所以會形成內存碎片。

  標記-壓縮:在標記-清除的基礎上還須進行對象的移動,成本相對更高,好處則是不產生內存碎片。

 
分類:  面試相關

       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 型,其值能夠在子類中從新定義,也能夠在子類中從新賦值。

相關文章
相關標籤/搜索