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