Java面試通關要點彙總集(基礎篇之基本功,非原做者)

Java面試通關要點彙總集(部分解答)

說明

若是你有幸能看到的話,html

  • 一、本文總體框架來自@阿里.梁桂釗的博文,總結的很是不錯。值得咱們學習,它的博客部分作了解答。
  • 二、因爲本身能力有限,沒能實現心中那個想法,就是第一遍本身寫,第二遍書本查詢
  • 三、文章會放到GitHub,用Git控制。多是一場持續站。
  • 三、若有雷同,純屬意外。會放上大家的連接。若有拼寫錯誤,還請諒解。
  • 四、測試放到最後面,有興趣的能夠看下?這樣的我可以入門嗎?
  • 五、苦逼-->傻逼-->二逼-->牛逼
  • 六、本身動手,豐衣足食。看完別人的才知道本身有多大的差距。gogogo。

基礎篇

基本功

一、面向對象的特性參考前端

(1)封裝:就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的對象操做,對不可信進行信息隱藏。簡單來講,就是一個類封裝了數據以及操做這些數據的代碼邏輯實體。在一個類的內部,方法或數據能夠是私有的,不能被外界訪問。這樣作的目的是對內部數據進行了不一樣級別的保護,防止錯誤的使用了對象的私有部分。java

(2)繼承:它可使用現有類的全部功能,並在原來的基礎上對這些功能進行擴展。經過繼承建立新類被稱爲「子類」或「派生類」。被繼承的類稱爲"基類"和「父類」或「超類」。要想實現繼承能夠經過「繼承」和「組合(聚合)」:實現方式有:實現繼承和接口繼承。實現繼承是指直接使用基類的屬性和方法而無需額外的編碼的能力;接口繼承是指僅使用屬性和方法的名稱,但子類必須提供實現的能力。git

(3)多態:是指一個類實例的相同方法在不一樣情形有不一樣的表現。多態機制使具備不一樣內部的結構的對象能夠共享的外部接口。雖然針對不一樣對象的具體操做不一樣,但經過一個公共的類,他們能夠經過相同的方法予以 調用。github

最多見的多態就是將子類傳入父類參數中,運行時調用父類方法時,經過傳入的子類決定具體的內部結構或行爲。web

二、面向對象五大原則:面試

  • (1)單一職責原則(Single-Resposiblity-Principle):一個類應該僅有一個引發它變化的緣由
  • (2)開放封閉原則(Open-Closed-Principle):對擴展開放,對更改時封閉的
  • (3)里氏替換原則(Liskov-Substituion Principle):子類能夠替換父類,而且出如今父類可以出現的任何地方。GOF倡導面向接口編程
  • (4)接口隔離原則(Interface-Segregation Principle):使用多個接口比使用單個接口要好的多。
  • (5)依賴倒置原則(Dependecy-Invarsion Principle):讓高層模塊不要依賴低層模塊。

三、final, finally, finalize 的區別參考redis

一、final修飾符(關鍵字)chrome

final用於控制成員、方法、或者是一個類是否能夠被重寫或者繼承功能。數據庫

(1)、若是類被聲明爲final,意味着它不能被派生出新的子類,不能做爲父類被繼承。
(2)、將變量或方法聲明爲final,能夠保證他們在使用中不會被改變,其初始化能夠在兩個地方:

  • 在final定義時直接給賦值,
  • 在構造函數中,兩者只能選其一,在之後的引用中只能讀取,不可修改

二、finally(用於異常處理)
通常是用於異常處理中,提供finally塊來執行任何的清楚操做,try{}catch{}finally{}.finally結構使代碼塊總會執行,無論有無異常發生。使得finally能夠維護對象的內部狀態,並能夠清理非內存資源。用於關閉文件的讀寫操做或者關閉數據庫鏈接操做。

三、finalize(用於垃圾回收)

finalize這個是方法名。在Java中,容許使用finalize()方法在垃圾收集器將對象從內存中清理出去以前作必要的清理工做。這個方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的。它是Object中定義的。所以,全部類都繼承了它,finalize方法是在垃圾收集器刪除對象以前對這個對象調用的。

四、int 和 Integer 有什麼區別參考

二者最大的區別從大的方法來講就是基本類型與其包裝類的區別

int是基本類型,直接存數值,而Integer是對象,用一個引用指向這個對象。

Java中的數據類型分爲基本數據類型和複雜數據類型

int是前者,而Integer是後者(是一個類),在進行初始化時,int的變量被初始化爲0,而Interger的變量則被初始化null。

五、重載和重寫的區別參考

重載(OverLoad)

(1)、方法重載是讓類以統一的方式處理同步類型數據的一種手段。在多個同名函數同時存在,具備不一樣的參數個數、類型。重載(Overload)是一個類中多態性的一種表現。

(2)、Java方法的重載,就是在類中能夠建立多個方法,他們具備相同的名字,可是有不一樣的參數,以及定義。調用方法時經過傳遞給它們的不一樣參數個數和參數類型來決定具體使用那個方法,這就是多態。

(3)、重載的時候,方法名要同樣,可是參數類型和個數不同,返回值類型能夠相同,也能夠不相同。沒法以返回值做爲重載函數的區別標準

重寫(Override)

(1)、父類和子類之間的多態性,對父類的函數進行從新定義。若是子類定義的方法和父類具備相同的方法名和參數同樣,咱們就說該方法被重寫(Override).在Java中,子類可繼承父類中的方法,而不須要從新編寫相同的方法,但有時子類並不想原封不動地繼承父類方法,而是想作必定的修改,這就須要方法重寫,方法重寫又被稱爲方法覆蓋。

(2)、若子類中方法與父類的某個方法具備相同的名稱、返回值、和參數列表,則新方法 將覆蓋原有的方法。如需父類中的原有方法,可使用super關鍵字,該關鍵字引用了當前類的父類。

(3)、子類函數的訪問修飾權限不能少於父類 。

二者之間的區別在於:

重寫多態性起做用,對調用被重載過的方法能夠大大減小代碼的輸入量,同一個方法名只要往裏面傳遞不一樣的參數就能夠擁有不一樣的功能或返回值

六、抽象類和接口有什麼區別參考

抽象類是用來捕捉子類的通用特性的。它不能被實例化,只能被用做子類的超類。抽象類是被用來建立繼承層級裏的子類的模板。

接口是抽象方法的集合,若是一個類實現類某個接口,那麼他就繼承了這個接口的抽象方法。這就像契約模式。若是實現了這個接口,那麼就必須確保使用這些方法。接口只是一種形式,接口自身不能作任何事情。

參數 抽象類 接口
默認的方法實現 它能夠有默認的方法實現 接口是徹底抽象的,它根本不存在方法的實現
實現 子類使用extends關鍵字來繼承抽象類 子類使用implements來實現接口
構造器 抽象類能夠有構造器 接口不能有構造器
修飾訪問符 抽象方法能夠有public,protected,和default 接口方法默認 修飾符是public
多繼承 抽象方法能夠繼承一個類或實現多個接口 接口只能夠繼承一個或多個其餘接口

何時使用抽象類和接口

  • 一、若是你擁有一些方法想讓他們中的一些默認實現,那麼使用抽象類。
  • 二、若是你想實現多重繼承,那麼你必須使用接口。因爲java不支多繼承,子類不可以繼承多個類,但能夠實現多個接口
  • 三、若是基本功能在不斷改變,那麼就須要使用抽象類。若是不斷改變基本功能而且使用接口 ,那麼就須要改變全部實現了該接口的類。

JDK 8中的默認方法
向接口中引入了默認方法和靜態方法,以此來減小抽象類和接口之間的差別。如今咱們能夠爲接口提供默認實現的方法來,而且不用強制來實現它。

七、說說反射的用途及實現推薦看

Java反射機制是一個很是強大的功能,在不少的項目好比Spring,Mybatis都均可以看到反射的身影。經過反射機制,咱們能夠在運行期間獲取對象的類型信息。利用這一點咱們能夠實現工廠模式和代理模式等設計模式,同時也能夠解決java泛型擦除等使人苦惱的問題。

獲取一個對象對應的反射類,在Java中有三種方法能夠獲取一個對象的反射類,

  • 經過getClass()方法
  • 經過Class.forName()方法;
  • 使用類.class
  • 經過類加載器實現,getClassLoader()

八、說說自定義註解的場景及實現推薦,播客也推薦

跟蹤代碼的依賴性,實現代替配置文件的功能。比較常見的是Spring等框架中的基於註解配置。

還能夠生成文檔常見的@See@param@return等。如@override放在方法簽名,若是這個方法 並非覆蓋了超類方法,則編譯時就能檢查出。

使用@interface自定義註解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其餘細節,在定義註解時,不能繼承其餘註解或接口。

九、HTTP 請求的 GET 與 POST 方式的區別參考
在客戶機和服務器之間進行請求-響應時,兩種最常被用到的方法是:GET 和 POST。

  • GET - 從指定的資源請求數據。
  • POST - 向指定的資源提交要被處理的數據

GET方法

請注意,查詢字符串(名稱/值對)是在 GET 請求的 URL 中發送的:

/test/demo_form.asp?name1=value1&name2=value2
  • 請求可被緩存
  • 請求保留在瀏覽器歷史記錄中
  • 請求可被收藏爲書籤
  • 請求不該在處理敏感數據時使用
  • 請求有長度限制
  • 請求只應當用於取回數據

POST方法

請注意,查詢字符串(名稱/值對)是在 POST 請求的 HTTP 消息主體中發送的:

POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

比較 GET 與 POST

方法 GET POST
緩存 能被緩存 不能緩存
編碼類型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。爲二進制數據使用多重編碼。
對數據長度的限制 是的。當發送數據時,GET 方法向 URL 添加數據;URL 的長度是受限制的(URL 的最大長度是 2048 個字符) 無限制。
對數據類型的限制 只容許 ASCII 字符 沒有限制。也容許二進制數據。
安全性 與 POST 相比,GET 的安全性較差,由於所發送的數據是 URL 的一部分。在發送密碼或其餘敏感信息時毫不要使用 GET POST 比 GET 更安全,由於參數不會被保存在瀏覽器歷史或 web 服務器日誌中。
可見性 數據在 URL 中對全部人都是可見的。 數據不會顯示在 URL 中。

其餘 HTTP 請求方法

  • HEAD 與 GET 相同,但只返回 HTTP 報頭,不返回文檔主體。
  • PUT 上傳指定的 URI 表示。
  • DELETE 刪除指定資源。
  • OPTIONS 返回服務器支持的 HTTP 方法
  • CONNECT 把請求鏈接轉換到透明的 TCP/IP 通道。

十、session 與 cookie 區別參考,不錯

  1. cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
  2. cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。
  3. session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。
  4. 單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
  5. 因此我的建議:
    將登錄信息等重要信息存放爲SESSION
    其餘信息若是須要保留,能夠放在COOKIE中

十一、session 分佈式處理參考,不錯

第一種:粘性session

粘性Session是指將用戶鎖定到某一個服務器上,好比上面說的例子,用戶第一次請求時,負載均衡器將用戶的請求轉發到了A服務器上,若是負載均衡器設置了粘性Session的話,那麼用戶之後的每次請求都會轉發到A服務器上,至關於把用戶和A服務器粘到了一塊,這就是粘性Session機制

第二種:服務器session複製

原理:任何一個服務器上的session發生改變(增刪改),該節點會把這個 session的全部內容序列化,而後廣播給全部其它節點,無論其餘服務器需不須要session,以此來保證Session同步。

第三種:session共享機制

使用分佈式緩存方案好比memcached、Redis,可是要求Memcached或Redis必須是集羣。

原理:不一樣的 tomcat指定訪問不一樣的主memcached。多個Memcached之間信息是同步的,能主從備份和高可用。用戶訪問時首先在tomcat中建立session,而後將session複製一份放到它對應的memcahed上

第四種:session持久化到數據庫

原理:就不用多說了吧,拿出一個數據庫,專門用來存儲session信息。保證session的持久化。 優勢:服務器出現問題,session不會丟失 缺點:若是網站的訪問量很大,把session存儲到數據庫中,會對數據庫形成很大壓力,還須要增長額外的開銷維護數據庫。

第五種terracotta實現session複製

原理:就不用多說了吧,拿出一個數據庫,專門用來存儲session信息。保證session的持久化。 優勢:服務器出現問題,session不會丟失 缺點:若是網站的訪問量很大,把session存儲到數據庫中,會對數據庫形成很大壓力,還須要增長額外的開銷維護數據庫

十二、JDBC 流程[](http://www.cnblogs.com/lazyco...

注意:在此以前應該先把全部用到的對象設爲null

(1)向DriverManager類註冊驅動數據庫驅動程序,

Class.forName( "com.somejdbcvendor.TheirJdbcDriver" );

(2)調用DriverManager.getConnection方法, 經過JDBC URL,用戶名,密碼取得數據庫鏈接的Connection對象。

Connection conn = DriverManager.getConnection(
      "jdbc:somejdbcvendor:other data needed by some jdbc vendor", //URL
       "myLogin", // 用戶名
      "myPassword" ); // 密碼

(3)獲取Connection後, 即可以經過createStatement建立Statement用以執行SQL語句。下面是一個插入(INSERT)的例子:

Statement stmt = conn.createStatement();
 stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );

(4)有時候會獲得查詢結果,好比select,獲得查詢結果,查詢(SELECT)的結果存放於結果集(ResultSet)中。

ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" );

(5)關閉數據庫語句,關閉數據庫鏈接。

rs.close();
stmt.close();

1三、MVC 設計思想

每當用戶在Web瀏覽器中點擊連接或提交表單的時候,請求就開始工做了。請求是一個十分繁忙的傢伙,從離開瀏覽器開始到獲取響應返回,它會經歷不少站,在每站都會留下一些信息,同時也會帶上一些信息。

Spring工做流程描述原文在這裏

    1. 用戶向服務器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;
    1. DispatcherServlet對請求URL進行解析,獲得請求資源標識符(URI)。而後根據該URI,調用HandlerMapping得到該Handler配置的全部相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;
    1. DispatcherServlet 根據得到的Handler,選擇一個合適的HandlerAdapter。(附註:若是成功得到HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)
    1. 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程當中,根據你的配置,Spring將幫你作一些額外的工做:
    • HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息
    • 數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
    • 數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
    • 數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
    1. Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;
    1. 根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
    1. ViewResolver 結合Model和View,來渲染視圖
    1. 將渲染結果返回給客戶端。

圖片參考這裏

Spring工做流程描述

  • 爲何Spring只使用一個Servlet(DispatcherServlet)來處理全部請求?
  • 詳細見J2EE設計模式-前端控制模式
  • Spring爲何要結合使用HandlerMapping以及HandlerAdapter來處理Handler?
  • 符合面向對象中的單一職責原則,代碼架構清晰,便於維護,最重要的是代碼可複用性高。如HandlerAdapter可能會被用於處理多種Handler。

一、請求旅程的第一站是Spring的DispatcherServlet。與大多數基於Java的Web框架同樣,Spring MVC全部的請求都會經過一個前端控制器(front contrller)Servlet.前端控制器是經常使用Web應用程序模式。在這裏一個單實例的Servlet將請求委託給應用的其餘組件來執行實際的處理。在Spring MVC中,DisPatcherServlet就是前端控制器。

二、DisPactcher的任務是將請求發送Spring MVC控制器(controller).控制器是一個用於處理請求的Spring組件。在典型的應用中可能會有多個控制器,DispatcherServlet須要知道應該將請求發送給那個哪一個控制器。因此Dispactcher以會查詢一個或 多個處理器映射(Handler mapping),來肯定請求的下一站在哪裏。處理映射器根據請求攜帶的 URL信息來進行決策。

三、一旦選擇了合適的控制器,DispatcherServlet會將請求發送給選中的控制器。到了控制器,請求會卸下其負載(用戶提交的信息)並耐心等待控制器處理這些信息。(實際上,設計良好的控制器 自己只是處理不多,甚至不處理工做,而是將業務邏輯委託給一個或多個服務器對象進行處理)

四、控制器在完成處理邏輯後,一般會產生一些信息。這些 信息須要返回給 用戶,並在瀏覽器上顯示。這些信息被稱爲模型(Model),不過僅僅給用戶返回原始的信息是不夠的----這些信息須要以用戶友好的方式進行格式化,通常會是HTML。因此,信息須要發送一個視圖(View),一般會是JSP。

五、 控制器作的最後一件事就是將模型打包,而且表示出用於渲染輸出的視圖名。它接下來會將請求連同模型和視圖發送回DispatcherServlet。

六、這樣,控制器就不會與特定的視圖相耦合*傳遞給控制器的視圖名並不直接表示某個特定的jsp。實際上,它甚至並不能肯定視圖就是JSP。相反,它僅僅傳遞了一個邏輯名稱,這個名字將會用來查找產生結果的真正視圖。DispatcherServlet將會使用視圖解析器(View resolver),來將邏輯視圖名稱匹配爲一個特定的視圖實現,他可能也可能不是JSP

七、雖然DispatcherServlet已經知道了哪一個駛入渲染結果、那請求的任務基本上也就完成了,它的最後一站是試圖的實現。在這裏它交付給模型數據。請求的任務就結束了。視圖將使用模型數據渲染輸出。這個輸出經過響應對象傳遞給客戶端(不會像聽上去那樣硬編碼)

能夠看到,請求要通過不少步驟,最終才能造成返回給客戶端的響應,大多數的 步驟都是在Spirng框架內部完成的。

**1四、equals 與 == 的區別參考

  • 一、使用==比較原生類型如:boolean、int、char等等,使用equals()比較對象。
  • 二、==返回true若是兩個引用指向相同的對象,equals()的返回結果依賴於具體業務實現
  • 三、字符串的對比使用equals()代替==操做符

其主要的不一樣是一個是操做符一個是方法,==用於對比原生類型而equals()方法比較對象的相等性。


有興趣能夠看下個人解答,沒有對比就沒傷害。

一、軟實力

一、說說你的亮點

以前一我的徒搭川藏線、青藏線。當凌晨站在布達拉宮的廣場時,哪一種成就感沒法比喻,只能經歷過的人才能體會到。經歷過底層的生活,去過邊陲雲南,也去過北上杭。體驗了一回流浪漢給讓鋪位的經歷。讓我對這個世界有了全新的認識。(這裏只想提示面試官我有堅毅、不怕吃苦、有善心的品質)

技術方面:目前不才,沒有解決太重大問題的經歷。有一顆持續學習的心(英語很重要,很重要,很重要)。之後會養成一個寫播客的習慣,混跡於GitHub。

二、說說你最近在看什麼書

《Spring 實戰》,這本書寫的很是不錯,深刻的闡述了Spring的IOC和AOP特性。講解了Spring生態系統中經常使用的組件。結合做者的GitHub代碼示例,學習起來效果很好。

下一本會是《Spring Boot實戰》

下下一本會是《Netty 實戰》看第一章就深深的迷上了。

三、說說你以爲最有意義的技術書籍

我的認爲是 Xxx是怎麼Xx的(日系)。Xxx實戰系列。Xxx權威指南,國產深刻Xxx也不錯。還有一些是計算機底層的書籍。

四、工做之餘作什麼事情

目前沒工做,除了學習仍是學習。假設有了工做,會學習英語,爲本身的三年計劃作準備。時不時會跑回去看父母(飛機)。

五、說說我的發展方向方面的思考

最近"移民"關鍵字很火熱。會在國內待三年,讓本身能獨當一面。會在國外發展本身的仕途,在技術的路上一道走到黑。

六、說說你認爲的服務端開發工程師應該具有哪些能力

網絡必備,高併發,JVM必會,各類分佈式技術,看源碼的能力。

七、說說你認爲的架構師是什麼樣的,架構師主要作什麼

技術大拿,在多個領域有深刻的研究。協調各個技術專家能夠很好的一塊兒工做。特定領域的架構師職能不同,網絡,底層,數據庫。在一個點上能夠獨當一面,解決各大重大問題。

八、說說你所理解的技術專家

混跡於戰場最起碼十年,並且是在特定領域有本身獨特的理解。對細節問題的掌握,遇到的問題比別人多,解決的問題也比別人多。假設是Java技術專家,JKD源碼,JVM,設計模式(不是記住,應用到項目中)。對特大項目重構。越厲害,越底層。當有一天你什麼都不懂了,就成技術專家了。

基本功

一、面向對象的特徵

講特徵以前你得知道什麼是面對對象吧,面向對象OO = 面向對象設計OOD + 面向對象分析OOA + 面向對象編程OOP。還有什麼面相呢?面向過程編程、面向接口編程、面向切面編程AOP、面向資源編程。什麼是對象?對象怎麼產生的?new Class啊(內省反射機制,容器)。對象定義了什麼?之間有什麼聯繫?對象是對現實世界的抽象。對象是由類實例化產生的,描述了類的一些屬性和行爲。是強耦合,仍是虛耦合?是繼承關係仍是組合關係(is-a,has-a)?

  • 繼承:子類(衍生類)繼承父類(超類)用來延續父類功能,子類自己也能夠加強。全部類都繼承自Object。單繼承侷限,爲啥全部類都要繼承Object?如何實現多繼承呢?是用繼承好仍是組合(聚合)好?委託?
  • 封裝:你可能聽過給我封裝一個工具類,爲何要封裝?解耦。怎麼封裝?抽取。封裝方法仍是封裝類?如何隱藏本身,改變的同時不影響到別人?4個關鍵字,public,private...
  • 多態:一種事物所呈現出不一樣的狀態,人會吃,會跑,會跳,會睡?根據大腦給它傳遞什麼消息。這裏涉及到轉型,向上轉安全嗎?向下呢?(no,yes)。這樣會丟失對象一些特性。

二、final, finally, finalize 的區別

  • final:最終的,修飾常量,final static。用大寫字母描述。靜態的不變的。在哪裏會用到全局變量?局部呢?修飾方法,子類不能被覆蓋(重寫),修飾類(父類不能被繼承) String類被final了。爲何要這樣設計?性能,安全、池。
  • finally:通常在try{}catch{}finally{}中釋放資源,IO,線程。無論如何老是會執行?真的嗎,未必。還須要判斷,非空,在try一次。JDK 8能夠直接放在try(...){}catch{}

finalize:是一個本地方法,由JVM full GC的時候調用清理再也不存活的對象。何時執行?一次兩次?

三、int 和 Integer 有什麼區別
前者是基本數據類型,後置是引用數據類型,之間如何轉換的?能放到集合中嗎?JDK 1.5自動裝箱、拆箱。還有一點究竟是值傳遞仍是引用傳遞啊?

四、重載和重寫的區別

  • 用在多態上。方法名相同,參數列表、屬性不一樣的方法。根據傳參不一樣選擇合適的方法。構造函數也是
  • 重寫:用在繼承。方法名相同,參數也同樣。父類的方法不能知足需求時,加以加強補充。用的時候到底調用子類仍是父類的啊?super,this。這裏會涉及到類的加載過程?還有static代碼塊。

五、抽象類和接口有什麼區別

  • 抽象類:用abstract修飾的類叫抽象類,定義類的時候往上層抽象,子類繼承的時候必須所有實現,如不,那也是一個抽象類。類和接口之間的橋樑?
  • 接口:用interface修飾定義了一些標準方法,方法默認是public abstract修飾的,沒有方法體。JDK 8能夠包含默認方法,有什麼做用?要麼所有實現,要麼都不實現。但默認方法來了。避免單繼承侷限,能夠實現多個接口

二者都不能被實例化,一個用來被繼承,一個用來被實現。到底用哪一個好?取決於你的類的設計。面向接口編程。中間過渡抽象類。頂層接口項目通常會有一個抽象類。在往下才是實現類。

六、說說反射的用途及實現
要是沒反射+泛型這個世界會變的怎樣?在運行時動態的建立對象,經過類的全限定名咱們能夠知道類的任何信息。字段,方法、構造方法、異常、註解。幾乎每一個框架都幾乎反射+泛型實現的。還有動態代理。底層使用靜態代碼塊實現,。實現方法是有四種:類.class,類.getClass(),Class.forName(),還有一種是類的加載器實現,getClassloader().(啓動、擴展、系統(App)).再次強調反射+泛型+代理(JDK,CGlib)很重要。

七、說說自定義註解的場景及實現

很是很是很是的重要,在框架中能夠幫咱們省去不少沒必要要的代碼。Java規定一個類上不能出現同樣的註解,那麼咱們就能夠自定義。

public interface Annotation {
    boolean equals(Object obj);
    int hashCode();
    String toString();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface RunWith {
    Class<? extends Runner> value();
}

八、HTTP 請求的 GET 與 POST 方式的區別
用於提交獲取表單、資源。主要區別在於地址欄,緩存、大小。網絡知識也得好好了解。

  • GET 提交的數據地址欄通常會出現鍵值對的形式,用「&」相連.大小也有限制(64k?)。能緩存。
  • POSP 用於提交表單、上傳圖片。數據通常放到請求體中。大小沒限制。不能被緩存。

其餘的呢?put?delete,trance? 這裏又扯到TESTful風格。

九、session 與 cookie 區別

最大的區別在於存放的位置不一樣,前者在服務端,後者在本地。可是本例瀏覽器要是限制cookie呢?題外話:我通常會常常用Click&Clean清除cookie的。有些網站也會禁用。別問我爲何,其實並沒有卵用,可是cookie裏保存着大量重要信息。

  • cookie :通常存放密碼,令牌之類的信息。大小有限制,在第一次請求的時候,服務端建立,返回給客戶端,第二次請求瀏覽器帶着cookie去找服務器。這裏有個跨域問題? 能夠設置過時失效。瀏覽器對cookie的限制。大量的cookie致使傳輸性能。一般會採用Gzip壓縮。
  • Session,存放於服務端。通常用於購物車也涉及到跨域問題,能夠存放到redis中,還有一種辦法複製的每一個tomcat實例中,現實嗎?Jsession什麼東東?有什麼做用?

這塊只是得好好補補。

十、session 分佈式處理
哈哈,搶先回答了。你們面試的時候不要一問一答。讓面試官在你的問題中選擇一個解答繼續深刻。直到問道你不會。也能夠說些本身有把握話題,引導他繼續深刻。

十一、JDBC 流程
準備 private static final URL、、、 也能夠用properties從文件中讀取。load()、

一、首先註冊驅動啊?怎麼註冊?反射啊,Class.forName("xx.xx.xx.Driver");底層怎麼實現的?靜態代碼,DriverManager.registerDriver?啓動的時候,會自動調用靜態代碼塊的內容。

二、接下來就是獲取鏈接啊,怎麼鏈接?遠程鏈接(三次握手操做),鏈接放哪裏?做爲資源必須放池子裏。這樣能提升性能。常見的鏈接池有DBCP,C3P0,傳說中最安全,性能最好的Druid(國產),並且還能監控。

三、你總的有SQL語句吧,以後就是Statement編譯那。這裏會出現SQL注入的安全問題。在語句後面加"1=1"成立。因此咱們採用預編譯的方式,PreparedStatement。能夠防止這種問題的出現。

四、查完以後獲取結果集。rs.getString().

五、頭疼的來了,釋放資源。各類 if(xx != nu) {try{ xx.close();}catch{}} 不用擔憂JDK8 出來一個新特性,能夠放在try-withresource中。還有各類異常能夠採用通道的形式 XxxException | XxxException

六、各類異常須要你放到一個try{}catch{}中,出問題你也不知道問題在哪裏?

麻煩嗎?不用擔憂,咱們能夠封裝成一個工具類,須要的時候調用工具類.getConnection();

仍是麻煩啊,能夠用Spring框架爲咱們集成提供了jdbcTemplate,HibernaterTemplate。用模板代碼消除了大量的樣板代碼。

爲啥不早告訴我JDBC鏈接這麼簡單?同志們,咱們須要知其然的同時,還要知其因此然。這樣出現問題的時候才能找到更好的解決方法。

十二、MVC 設計思想

什麼是設計思想?前人踩過無數的坑,總結出來的真理。通常用來解決特定問題。須要好好學習設計模式,框架中大量採用.

那MVC又是什麼東東?

回答以前咱們先看看設計的原則。單一職責,開閉原則,面向接口編程,對象最少知道。一句話總結:「高內聚,低耦合」。六個字一個逗號。

  • Model(模型層) :通常存放處理邏輯,
  • View (視圖層):存放html,jsp,文件
  • Controller(控制層):主要負責調度二者,實現解耦。

當咱們像瀏覽器發送一個請求時,首先須要通過控制層(DispatcherServlet),其是它實際不作什麼事情,委託給別人作。調用模型層(處理一些業務邏輯),返回數據模型給控制器,接着在委託視圖解析器解析視圖。最後定位到視圖的資源,返回給控制器,控制器在返回給客戶端。(其實須要作的還有不少)

主要的目的是解耦,各司其職。作好你分內的事。對擴展性也好。增長需求不會影響到其餘模塊。

1三、equals 與 == 的區別

  • == 比較的是地址,具體來講就是存放在棧中的引用。
  • equsls 比較的是內容。通常咱們同時須要重寫hashcode()方法,其底層是用「==」

這裏分兩種狀況,基本類型和引用類型的比較。還會涉及到一個常量池(提升性能)。還有入池操做。還有四條原則,自反,傳遞,。。

相關文章
相關標籤/搜索