摘要:面試通關要點匯總集部分解答說明如果你有幸能看到的話,本文整體框架來自阿里梁桂釗的博文,總結的非常不錯。這樣做的目的是對內部數據進行了不同級別的保護,防止錯誤的使用了對象的私有部分。被繼承的類稱為基類和父類或超類。
Java面試通關要點匯總集(部分解答) 說明
如果你有幸能看到的話,
1、本文整體框架來自@阿里.梁桂釗的博文,總結的非常不錯。值得我們學習,它的博客部分做了解答。
2、由于自己能力有限,沒能實現心中那個想法,就是第一遍自己寫,第二遍書本查詢
3、文章會放到GitHub,用Git控制。可能是一場持續站。
3、如有雷同,純屬意外。會放上你們的鏈接。如有拼寫錯誤,還請諒解。
4、測試放到最后面,有興趣的可以看下?這樣的我能夠入門嗎?
5、苦逼-->傻逼-->二逼-->牛逼
6、自己動手,豐衣足食。看完別人的才知道自己有多大的差距。gogogo。
基礎篇 基本功1、面向對象的特性參考
(1)封裝:就是把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的對象操作,對不可信進行信息隱藏。簡單來說,就是一個類封裝了數據以及操作這些數據的代碼邏輯實體。在一個類的內部,方法或數據可以是私有的,不能被外界訪問。這樣做的目的是對內部數據進行了不同級別的保護,防止錯誤的使用了對象的私有部分。
(2)繼承:它可以使用現有類的所有功能,并在原來的基礎上對這些功能進行擴展。通過繼承創建新類被稱為“子類”或“派生類”。被繼承的類稱為"基類"和“父類”或“超類”。要想實現繼承可以通過“繼承”和“組合(聚合)”:實現方式有:實現繼承和接口繼承。實現繼承是指直接使用基類的屬性和方法而無需額外的編碼的能力;接口繼承是指僅使用屬性和方法的名稱,但子類必須提供實現的能力。
(3)多態:是指一個類實例的相同方法在不同情形有不同的表現。多態機制使具有不同內部的結構的對象可以共享的外部接口。雖然針對不同對象的具體操作不同,但通過一個公共的類,他們可以通過相同的方法予以 調用。
最常見的多態就是將子類傳入父類參數中,運行時調用父類方法時,通過傳入的子類決定具體的內部結構或行為。
2、面向對象五大原則:
(1)單一職責原則(Single-Resposiblity-Principle):一個類應該僅有一個引起它變化的原因
(2)開放封閉原則(Open-Closed-Principle):對擴展開放,對更改時封閉的
(3)里氏替換原則(Liskov-Substituion Principle):子類可以替換父類,并且出現在父類能夠出現的任何地方。GOF倡導面向接口編程
(4)接口隔離原則(Interface-Segregation Principle):使用多個接口比使用單個接口要好的多。
(5)依賴倒置原則(Dependecy-Invarsion Principle):讓高層模塊不要依賴低層模塊。
3、final, finally, finalize 的區別參考
1、final修飾符(關鍵字)
final用于控制成員、方法、或者是一個類是否可以被重寫或者繼承功能。
(1)、如果類被聲明為final,意味著它不能被派生出新的子類,不能作為父類被繼承。
(2)、將變量或方法聲明為final,可以保證他們在使用中不會被改變,其初始化可以在兩個地方:
在final定義時直接給賦值,
在構造函數中,二者只能選其一,在以后的引用中只能讀取,不可修改
2、finally(用于異常處理)
一般是用于異常處理中,提供finally塊來執行任何的清楚操作,try{}catch{}finally{}.finally結構使代碼塊總會執行,不管有無異常發生。使得finally可以維護對象的內部狀態,并可以清理非內存資源。用于關閉文件的讀寫操作或者關閉數據庫連接操作。
3、finalize(用于垃圾回收)
finalize這個是方法名。在Java中,允許使用finalize()方法在垃圾收集器將對象從內存中清理出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是Object中定義的。因此,所有類都繼承了它,finalize方法是在垃圾收集器刪除對象之前對這個對象調用的。
4、int 和 Integer 有什么區別參考
兩者最大的區別從大的方法來說就是基本類型與其包裝類的區別
int是基本類型,直接存數值,而Integer是對象,用一個引用指向這個對象。
Java中的數據類型分為基本數據類型和復雜數據類型
int是前者,而Integer是后者(是一個類),在進行初始化時,int的變量被初始化為0,而Interger的變量則被初始化null。
5、重載和重寫的區別【參考
重載(OverLoad)
(1)、方法重載是讓類以統一的方式處理同步類型數據的一種手段。在多個同名函數同時存在,具有不同的參數個數、類型。重載(Overload)是一個類中多態性的一種表現。
(2)、Java方法的重載,就是在類中可以創建多個方法,他們具有相同的名字,但是有不同的參數,以及定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用那個方法,這就是多態。
(3)、重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同,也可以不相同。無法以返回值作為重載函數的區別標準
重寫(Override)
(1)、父類和子類之間的多態性,對父類的函數進行重新定義。如果子類定義的方法和父類具有相同的方法名和參數一樣,我們就說該方法被重寫(Override).在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法,但有時子類并不想原封不動地繼承父類方法,而是想做一定的修改,這就需要方法重寫,方法重寫又被稱為方法覆蓋。
(2)、若子類中方法與父類的某個方法具有相同的名稱、返回值、和參數列表,則新方法 將覆蓋原有的方法。如需父類中的原有方法,可以使用super關鍵字,該關鍵字引用了當前類的父類。
(3)、子類函數的訪問修飾權限不能少于父類 。
兩者之間的區別在于:
重寫多態性起作用,對調用被重載過的方法可以大大減少代碼的輸入量,同一個方法名只要往里面傳遞不同的參數就可以擁有不同的功能或返回值
6、抽象類和接口有什么區別參考
抽象類是用來捕捉子類的通用特性的。它不能被實例化,只能被用作子類的超類。抽象類是被用來創建繼承層級里的子類的模板。
接口是抽象方法的集合,如果一個類實現類某個接口,那么他就繼承了這個接口的抽象方法。這就像契約模式。如果實現了這個接口,那么就必須確保使用這些方法。接口只是一種形式,接口自身不能做任何事情。
參數 | 抽象類 | 接口 | |
---|---|---|---|
默認的方法實現 | 它可以有默認的方法實現 | 接口是完全抽象的,它根本不存在方法的實現 | |
實現 | 子類使用extends關鍵字來繼承抽象類 | 子類使用implements來實現接口 | |
構造器 | 抽象類可以有構造器 | 接口不能有構造器 | |
修飾訪問符 | 抽象方法可以有public,protected,和default | 接口方法默認 修飾符是public | |
多繼承 | 抽象方法可以繼承一個類或實現多個接口 | 接口只可以繼承一個或多個其他接口 |
什么時候使用抽象類和接口
1、如果你擁有一些方法想讓他們中的一些默認實現,那么使用抽象類。
2、如果你想實現多重繼承,那么你必須使用接口。由于java不支多繼承,子類不能夠繼承多個類,但可以實現多個接口
3、如果基本功能在不斷改變,那么就需要使用抽象類。如果不斷改變基本功能并且使用接口 ,那么就需要改變所有實現了該接口的類。
JDK 8中的默認方法
向接口中引入了默認方法和靜態方法,以此來減少抽象類和接口之間的差異。現在我們可以為接口提供默認實現的方法來,并且不用強制來實現它。
7、說說反射的用途及實現推薦看
Java反射機制是一個非常強大的功能,在很多的項目比如Spring,Mybatis都都可以看到反射的身影。通過反射機制,我們可以在運行期間獲取對象的類型信息。利用這一點我們可以實現工廠模式和代理模式等設計模式,同時也可以解決java泛型擦除等令人苦惱的問題。
獲取一個對象對應的反射類,在Java中有三種方法可以獲取一個對象的反射類,
通過getClass()方法
通過Class.forName()方法;
使用類.class
通過類加載器實現,getClassLoader()
8、說說自定義注解的場景及實現推薦,播客也推薦
跟蹤代碼的依賴性,實現代替配置文件的功能。比較常見的是Spring等框架中的基于注解配置。
還可以生成文檔常見的@See@param@return等。如@override放在方法簽名,如果這個方法 并不是覆蓋了超類方法,則編譯時就能檢查出。
使用@interface自定義注解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節,在定義注解時,不能繼承其他注解或接口。
9、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 通道。
10、session 與 cookie 區別參考,不錯
cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用session。
session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。
單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中
11、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存儲到數據庫中,會對數據庫造成很大壓力,還需要增加額外的開銷維護數據庫
12、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();
13、MVC 設計思想
每當用戶在Web瀏覽器中點擊鏈接或提交表單的時候,請求就開始工作了。請求是一個十分繁忙的家伙,從離開瀏覽器開始到獲取響應返回,它會經歷很多站,在每站都會留下一些信息,同時也會帶上一些信息。
Spring工作流程描述原文在這里
用戶向服務器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;
DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI)。然后根據該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最后以HandlerExecutionChain對象的形式返回;
DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter。(附注:如果成功獲得HandlerAdapter后,此時將開始執行攔截器的preHandler(...)方法)
提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換為指定的響應信息
數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
Handler執行完成后,向DispatcherServlet 返回一個ModelAndView對象;
根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經注冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
ViewResolver 結合Model和View,來渲染視圖
將渲染結果返回給客戶端。
圖片參考這里
Spring工作流程描述
為什么Spring只使用一個Servlet(DispatcherServlet)來處理所有請求?
詳細見J2EE設計模式-前端控制模式
Spring為什么要結合使用HandlerMapping以及HandlerAdapter來處理Handler?
符合面向對象中的單一職責原則,代碼架構清晰,便于維護,最重要的是代碼可復用性高。如HandlerAdapter可能會被用于處理多種Handler。
1、請求旅程的第一站是Spring的DispatcherServlet。與大多數基于Java的Web框架一樣,Spring MVC所有的請求都會通過一個前端控制器(front contrller)Servlet.前端控制器是常用Web應用程序模式。在這里一個單實例的Servlet將請求委托給應用的其他組件來執行實際的處理。在Spring MVC中,DisPatcherServlet就是前端控制器。
2、DisPactcher的任務是將請求發送Spring MVC控制器(controller).控制器是一個用于處理請求的Spring組件。在典型的應用中可能會有多個控制器,DispatcherServlet需要知道應該將請求發送給那個哪個控制器。所以Dispactcher以會查詢一個或 多個處理器映射(Handler mapping),來確定請求的下一站在哪里。處理映射器根據請求攜帶的 URL信息來進行決策。
3、一旦選擇了合適的控制器,DispatcherServlet會將請求發送給選中的控制器。到了控制器,請求會卸下其負載(用戶提交的信息)并耐心等待控制器處理這些信息。(實際上,設計良好的控制器 本身只是處理很少,甚至不處理工作,而是將業務邏輯委托給一個或多個服務器對象進行處理)
4、控制器在完成處理邏輯后,通常會產生一些信息。這些 信息需要返回給 用戶,并在瀏覽器上顯示。這些信息被稱為模型(Model),不過僅僅給用戶返回原始的信息是不夠的----這些信息需要以用戶友好的方式進行格式化,一般會是HTML。所以,信息需要發送一個視圖(View),通常會是JSP。
5、 控制器做的最后一件事就是將模型打包,并且表示出用于渲染輸出的視圖名。它接下來會將請求連同模型和視圖發送回DispatcherServlet。
6、這樣,控制器就不會與特定的視圖相耦合*傳遞給控制器的視圖名并不直接表示某個特定的jsp。實際上,它甚至并不能確定視圖就是JSP。相反,它僅僅傳遞了一個邏輯名稱,這個名字將會用來查找產生結果的真正視圖。DispatcherServlet將會使用視圖解析器(View resolver),來將邏輯視圖名稱匹配為一個特定的視圖實現,他可能也可能不是JSP
7、雖然DispatcherServlet已經知道了哪個駛入渲染結果、那請求的任務基本上也就完成了,它的最后一站是試圖的實現。在這里它交付給模型數據。請求的任務就結束了。視圖將使用模型數據渲染輸出。這個輸出通過響應對象傳遞給客戶端(不會像聽上去那樣硬編碼)
可以看到,請求要經過很多步驟,最終才能形成返回給客戶端的響應,大多數的 步驟都是在Spirng框架內部完成的。
**14、equals 與 == 的區別參考
1、使用==比較原生類型如:boolean、int、char等等,使用equals()比較對象。
2、==返回true如果兩個引用指向相同的對象,equals()的返回結果依賴于具體業務實現
3、字符串的對比使用equals()代替==操作符
其主要的不同是一個是操作符一個是方法,==用于對比原生類型而equals()方法比較對象的相等性。
有興趣可以看下我的解答,沒有對比就沒傷害。1、說說你的亮點
之前一個人徒搭川藏線、青藏線。當凌晨站在布達拉宮的廣場時,哪種成就感無法比喻,只能經歷過的人才能體會到。經歷過底層的生活,去過邊陲云南,也去過北上杭。體驗了一回流浪漢給讓鋪位的經歷。讓我對這個世界有了全新的認識。(這里只想提示面試官我有堅毅、不怕吃苦、有善心的品質)
技術方面:目前不才,沒有解決過重大問題的經歷。有一顆持續學習的心(英語很重要,很重要,很重要)。以后會養成一個寫播客的習慣,混跡于GitHub。
2、說說你最近在看什么書
《Spring 實戰》,這本書寫的非常不錯,深入的闡述了Spring的IOC和AOP特性。講解了Spring生態系統中常用的組件。結合作者的GitHub代碼示例,學習起來效果很好。
下一本會是《Spring Boot實戰》
下下一本會是《Netty 實戰》看第一章就深深的迷上了。
3、說說你覺得最有意義的技術書籍
個人認為是 Xxx是怎么Xx的(日系)。Xxx實戰系列。Xxx權威指南,國產深入Xxx也不錯。還有一些是計算機底層的書籍。
4、工作之余做什么事情
目前沒工作,除了學習還是學習。假設有了工作,會學習英語,為自己的三年計劃做準備。時不時會跑回去看父母(飛機)。
5、說說個人發展方向方面的思考
最近"移民"關鍵字很火熱。會在國內待三年,讓自己能獨當一面。會在國外發展自己的仕途,在技術的路上一道走到黑。
6、說說你認為的服務端開發工程師應該具備哪些能力
網絡必備,高并發,JVM必會,各種分布式技術,看源碼的能力。
7、說說你認為的架構師是什么樣的,架構師主要做什么
技術大拿,在多個領域有深入的研究。協調各個技術專家可以很好的一起工作。特定領域的架構師職能不一樣,網絡,底層,數據庫。在一個點上可以獨當一面,解決各大重大問題。
8、說說你所理解的技術專家
混跡于戰場最起碼十年,而且是在特定領域有自己獨特的理解。對細節問題的掌握,遇到的問題比別人多,解決的問題也比別人多。假設是Java技術專家,JKD源碼,JVM,設計模式(不是記住,應用到項目中)。對特大項目重構。越厲害,越底層。當有一天你什么都不懂了,就成技術專家了。
1、面向對象的特征
講特征之前你得知道什么是面對對象吧,面向對象OO = 面向對象設計OOD + 面向對象分析OOA + 面向對象編程OOP。還有什么面相呢?面向過程編程、面向接口編程、面向切面編程AOP、面向資源編程。什么是對象?對象怎么產生的?new Class啊(內省反射機制,容器)。對象定義了什么?之間有什么聯系?對象是對現實世界的抽象。對象是由類實例化產生的,描述了類的一些屬性和行為。是強耦合,還是虛耦合?是繼承關系還是組合關系(is-a,has-a)?
繼承:子類(衍生類)繼承父類(超類)用來延續父類功能,子類本身也可以增強。所有類都繼承自Object。單繼承局限,為啥所有類都要繼承Object?如何實現多繼承呢?是用繼承好還是組合(聚合)好?委托?
封裝:你可能聽過給我封裝一個工具類,為什么要封裝?解耦。怎么封裝?抽取。封裝方法還是封裝類?如何隱藏自己,改變的同時不影響到別人?4個關鍵字,public,private...
多態:一種事物所呈現出不同的狀態,人會吃,會跑,會跳,會睡?根據大腦給它傳遞什么消息。這里涉及到轉型,向上轉安全嗎?向下呢?(no,yes)。這樣會丟失對象一些特性。
2、final, finally, finalize 的區別
final:最終的,修飾常量,final static。用大寫字母描述。靜態的不變的。在哪里會用到全局變量?局部呢?修飾方法,子類不能被覆蓋(重寫),修飾類(父類不能被繼承) String類被final了。為什么要這樣設計?性能,安全、池。
finally:一般在try{}catch{}finally{}中釋放資源,IO,線程。不管如何總是會執行?真的嗎,未必。還需要判斷,非空,在try一次。JDK 8可以直接放在try(...){}catch{}
finalize:是一個本地方法,由JVM full GC的時候調用清理不再存活的對象。什么時候執行?一次兩次?
3、int 和 Integer 有什么區別
前者是基本數據類型,后置是引用數據類型,之間如何轉換的?能放到集合中嗎?JDK 1.5自動裝箱、拆箱。還有一點到底是值傳遞還是引用傳遞啊?
4、重載和重寫的區別
用在多態上。方法名相同,參數列表、屬性不同的方法。根據傳參不同選擇合適的方法。構造函數也是
重寫:用在繼承。方法名相同,參數也一樣。父類的方法不能滿足需求時,加以增強補充。用的時候到底調用子類還是父類的啊?super,this。這里會涉及到類的加載過程?還有static代碼塊。
5、抽象類和接口有什么區別
抽象類:用abstract修飾的類叫抽象類,定義類的時候往上層抽象,子類繼承的時候必須全部實現,如不,那也是一個抽象類。類和接口之間的橋梁?
接口:用interface修飾定義了一些標準方法,方法默認是public abstract修飾的,沒有方法體。JDK 8可以包含默認方法,有什么作用?要么全部實現,要么都不實現。但默認方法來了。避免單繼承局限,可以實現多個接口
兩者都不能被實例化,一個用來被繼承,一個用來被實現。到底用哪個好?取決于你的類的設計。面向接口編程。中間過渡抽象類。頂層接口項目一般會有一個抽象類。在往下才是實現類。
6、說說反射的用途及實現
要是沒反射+泛型這個世界會變的怎樣?在運行時動態的創建對象,通過類的全限定名我們可以知道類的任何信息。字段,方法、構造方法、異常、注解。幾乎每個框架都幾乎反射+泛型實現的。還有動態代理。底層使用靜態代碼塊實現,。實現方法是有四種:類.class,類.getClass(),Class.forName(),還有一種是類的加載器實現,getClassloader().(啟動、擴展、系統(App)).再次強調反射+泛型+代理(JDK,CGlib)很重要。
7、說說自定義注解的場景及實現
非常非常非常的重要,在框架中可以幫我們省去很多不必要的代碼。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(); }
8、HTTP 請求的 GET 與 POST 方式的區別
用于提交獲取表單、資源。主要區別在于地址欄,緩存、大小。網絡知識也得好好了解。
GET 提交的數據地址欄一般會出現鍵值對的形式,用“&”相連.大小也有限制(64k?)。能緩存。
POSP 用于提交表單、上傳圖片。數據一般放到請求體中。大小沒限制。不能被緩存。
其他的呢?put?delete,trance? 這里又扯到TESTful風格。
9、session 與 cookie 區別
最大的區別在于存放的位置不同,前者在服務端,后者在本地。但是本例瀏覽器要是限制cookie呢?題外話:我一般會經常用Click&Clean清除cookie的。有些網站也會禁用。別問我為什么,其實并無卵用,但是cookie里保存著大量重要信息。
cookie :一般存放密碼,令牌之類的信息。大小有限制,在第一次請求的時候,服務端創建,返回給客戶端,第二次請求瀏覽器帶著cookie去找服務器。這里有個跨域問題? 可以設置過期失效。瀏覽器對cookie的限制。大量的cookie導致傳輸性能。通常會采用Gzip壓縮。
Session,存放于服務端。一般用于購物車也涉及到跨域問題,可以存放到redis中,還有一種辦法復制的每個tomcat實例中,現實嗎?Jsession什么東東?有什么作用?
這塊只是得好好補補。
10、session 分布式處理
哈哈,搶先回答了。大家面試的時候不要一問一答。讓面試官在你的問題中選擇一個解答繼續深入。直到問道你不會。也可以說些自己有把握話題,引導他繼續深入。
11、JDBC 流程
準備 private static final URL、、、 也可以用properties從文件中讀取。load()、
1、首先注冊驅動啊?怎么注冊?反射啊,Class.forName("xx.xx.xx.Driver");底層怎么實現的?靜態代碼,DriverManager.registerDriver?啟動的時候,會自動調用靜態代碼塊的內容。
2、接下來就是獲取連接啊,怎么連接?遠程連接(三次握手操作),連接放哪里?作為資源必須放池子里。這樣能提高性能。常見的連接池有DBCP,C3P0,傳說中最安全,性能最好的Druid(國產),而且還能監控。
3、你總的有SQL語句吧,之后就是Statement編譯那。這里會出現SQL注入的安全問題。在語句后面加"1=1"成立。所以我們采用預編譯的方式,PreparedStatement。可以防止這種問題的出現。
4、查完之后獲取結果集。rs.getString().
5、頭疼的來了,釋放資源。各種 if(xx != nu) {try{ xx.close();}catch{}} 不用擔心JDK8 出來一個新特性,可以放在try-withresource中。還有各種異常可以采用通道的形式 XxxException | XxxException
6、各種異常需要你放到一個try{}catch{}中,出問題你也不知道問題在哪里?
麻煩嗎?不用擔心,我們可以封裝成一個工具類,需要的時候調用工具類.getConnection();
還是麻煩啊,可以用Spring框架為我們集成提供了jdbcTemplate,HibernaterTemplate。用模板代碼消除了大量的樣板代碼。
為啥不早告訴我JDBC連接這么簡單?同志們,我們需要知其然的同時,還要知其所以然。這樣出現問題的時候才能找到更好的解決方法。
12、MVC 設計思想
什么是設計思想?前人踩過無數的坑,總結出來的真理。一般用來解決特定問題。需要好好學習設計模式,框架中大量采用.
那MVC又是什么東東?
回答之前我們先看看設計的原則。單一職責,開閉原則,面向接口編程,對象最少知道。一句話總結:“高內聚,低耦合”。六個字一個逗號。
Model(模型層) :一般存放處理邏輯,
View (視圖層):存放html,jsp,文件
Controller(控制層):主要負責調度兩者,實現解耦。
當我們像瀏覽器發送一個請求時,首先需要經過控制層(DispatcherServlet),其是它實際不做什么事情,委托給別人做。調用模型層(處理一些業務邏輯),返回數據模型給控制器,接著在委托視圖解析器解析視圖。最后定位到視圖的資源,返回給控制器,控制器在返回給客戶端。(其實需要做的還有很多)
主要的目的是解耦,各司其職。做好你份內的事。對擴展性也好。增加需求不會影響到其他模塊。
13、equals 與 == 的區別
== 比較的是地址,具體來說就是存放在棧中的引用。
equsls 比較的是內容。一般我們同時需要重寫hashcode()方法,其底層是用“==”
這里分兩種情況,基本類型和引用類型的比較。還會涉及到一個常量池(提高性能)。還有入池操作。還有四條原則,自反,傳遞,。。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68604.html
摘要:本文會以引出問題為主,后面有時間的話,筆者陸續會抽些重要的知識點進行詳細的剖析與解答。敬請關注服務端思維微信公眾號,獲取最新文章。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 這里,筆者結合自己過往的面試經驗,整理了一些核心的知識清單,幫助讀者更好地回顧與復習 Java 服務端核心技術。本文會以引出問題為主,后面有時間的話,筆者陸續會抽些重要的知識點進...
摘要:因為某些原因,不方便在這里直接發送百度鏈接,關注我的微信公眾號面試通關手冊回復資源分享第一波即可領取。然后大家還有什么問題的話,可以在我的微信公眾號后臺面試通關手冊給我說或者加我微信,我會根據自己的學習經驗給了說一下自己的看法。 這是一篇針對Java初學者,或者說在Java學習路線上出了一些問題(不知道該學什么、不知道整體的學習路線是什么樣的) 第一步:Java基礎(一個月左右) 推薦...
摘要:地址面試必備最最最常見的面試題總結第一周一中的值傳遞和引用傳遞非常重要首先要明確的是對象傳遞數組類接口是引用傳遞,原始類型數據整型浮點型字符型布爾型傳遞是值傳遞。這個哈希碼的作用是確定該對象在哈希表中的索引位置。 showImg(https://segmentfault.com/img/remote/1460000015923339?w=922&h=519); 這里會分享一些出現頻率極...
摘要:相關推薦,豆瓣評分,人評價本書介紹了在編程中條極具實用價值的經驗規則,這些經驗規則涵蓋了大多數開發人員每天所面臨的問題的解決方案。實戰高并發程序設計推薦豆瓣評分,書的質量沒的說,推薦大家好好看一下。 該文已加入開源文檔:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識)。地址:https://github.com/Snailclimb... 【強烈推薦!非廣告!】...
摘要:作者鏈接來源牛客網今天剛剛收到的電話,開心,簡單記錄一下美團的面經。當時面試官評價基礎不是很好,其他還行。的三次握手四次揮手。整體感覺美團的面試比較基礎,但是各個方面都有涉及到。 作者:icysnowgx鏈接:https://www.nowcoder.com/disc...來源:牛客網 今天剛剛收到hr的電話,開心,簡單記錄一下美團的面經。時間隔的比較久了,簡單回憶下,最后會給出我之前...
閱讀 2461·2023-04-26 02:18
閱讀 1262·2021-10-14 09:43
閱讀 3822·2021-09-26 10:00
閱讀 6945·2021-09-22 15:28
閱讀 2535·2019-08-30 15:54
閱讀 2600·2019-08-30 15:52
閱讀 474·2019-08-29 11:30
閱讀 3465·2019-08-29 11:05