架構(gòu)技術(shù)onenote-阿里面經(jīng)_第1頁(yè)
架構(gòu)技術(shù)onenote-阿里面經(jīng)_第2頁(yè)
架構(gòu)技術(shù)onenote-阿里面經(jīng)_第3頁(yè)
架構(gòu)技術(shù)onenote-阿里面經(jīng)_第4頁(yè)
架構(gòu)技術(shù)onenote-阿里面經(jīng)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、2017/12/19OneNote Online阿里面經(jīng)日35自我介紹 做過(guò)的項(xiàng)目(Java 基礎(chǔ))Java的四個(gè)基本特性(抽象、封裝、繼承,多態(tài)),對(duì)多態(tài)的理解(多態(tài)的實(shí)現(xiàn)方式)以及在項(xiàng)目中那些地方用到多態(tài)1.2.3.Java的四個(gè)基本特性抽象:抽象是將一類(lèi)對(duì)象的共同特征總結(jié)出來(lái)構(gòu)造類(lèi)的過(guò)程,包括數(shù)據(jù)抽象和行為抽象兩方面。抽象只關(guān)注對(duì)象有哪些屬性和行為,并不關(guān)注這些行為的細(xì)節(jié)是什么。繼承:繼承是從已有類(lèi)得到繼承信息創(chuàng)建新類(lèi)的過(guò)程。提供繼承信息的類(lèi)被稱(chēng)為父類(lèi)(超類(lèi)、基類(lèi));得到繼承信息的類(lèi)被稱(chēng)為子類(lèi)(派生類(lèi))。繼承讓變化中的系統(tǒng)有了一定的延續(xù)性,同時(shí)繼承也是封裝程序中可變的重要手 段。封裝:通

2、常認(rèn)為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來(lái),對(duì)數(shù)據(jù)的只能通過(guò)已定義的接口。面象的本質(zhì)就是將現(xiàn)實(shí)世界描繪成一系列完全自治、封閉的對(duì)象。在類(lèi)中編寫(xiě)的方法就是對(duì)實(shí)現(xiàn)細(xì)節(jié)的一種封裝;編寫(xiě)一個(gè)類(lèi)就是對(duì)數(shù)據(jù)和數(shù)據(jù)操作的封裝。可以說(shuō),封裝就是隱藏一切可隱藏的東西,只向外界提供最簡(jiǎn)單的編程接口。多態(tài)性是指允許不同子類(lèi)型的對(duì)象對(duì)同一消息作出不同的響應(yīng)。多態(tài)的理解(多態(tài)的實(shí)現(xiàn)方式)方法重載(overload)實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性(也稱(chēng)為前綁定)。方法重寫(xiě)(override)實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性(也稱(chēng)為后綁定)。運(yùn)行時(shí)的多態(tài)是面象最精髓的東西。要實(shí)現(xiàn)多態(tài)需要做兩件事:1). 方法重寫(xiě)(子類(lèi)繼承父類(lèi)并重寫(xiě)父類(lèi)中已

3、有的或抽象的方法);2). 對(duì)象造型(用父類(lèi)型子類(lèi)型對(duì)象,這樣同樣的調(diào)用同樣的方法就會(huì)根據(jù)子類(lèi)對(duì)象的不同而不同的行為)。項(xiàng)目中對(duì)多態(tài)的應(yīng)用舉一個(gè)簡(jiǎn)單的例子,在物流信息管理系統(tǒng)中,有兩種用戶(hù):訂購(gòu)客戶(hù)和賣(mài)房客戶(hù),兩個(gè)客戶(hù)都可以登錄系統(tǒng),他們有相同的方ogin,但登陸之后他們會(huì)進(jìn)入到不同的頁(yè)面,也就是在登錄的時(shí)候會(huì)有不同的操作,兩種客戶(hù)都繼承父類(lèi)的 Login方法,但對(duì)于不同的對(duì)象,擁有不同的操作。面象和面向過(guò)程的區(qū)別?用面向過(guò)程可以實(shí)現(xiàn)面面象和面向過(guò)程的區(qū)別象嗎?那是不是不能面象?4.面向過(guò)程就像是一個(gè)細(xì)心的管家,事無(wú)具細(xì)的都要考慮到。而面象就像是個(gè)家用電器,你只需要知道他的功能,不需要知道它的

4、工作原理。面向過(guò)程 是一種是事件為中心的編程。就是分析出解決問(wèn)題所需的步驟,然后用函數(shù)把這些步驟實(shí)現(xiàn),并按順序調(diào)用。面象是以 對(duì)象 為中心的編程。簡(jiǎn)單的舉個(gè)例子:汽車(chē)發(fā)動(dòng)、汽車(chē)到站這對(duì)于 面向過(guò)程 來(lái)說(shuō),是兩個(gè)事件,汽車(chē)啟動(dòng)是一個(gè)事件,汽車(chē)到站是另一個(gè)事件,面向過(guò)程編程的過(guò)程中關(guān)心的是事件,而不是汽車(chē)本身。針對(duì)上述兩個(gè)事件,形成兩個(gè)函數(shù),之 后依次調(diào)用。然而這對(duì)于面象來(lái)說(shuō),關(guān)心的是汽車(chē)這類(lèi)對(duì)象,兩個(gè)事件只是這類(lèi)對(duì)象所具有的行為。而且對(duì)于這兩個(gè)行為的順序沒(méi)有強(qiáng)制要求。用面向過(guò)程可以實(shí)現(xiàn)面象嗎那是不是不能面象重載和重寫(xiě),如何確定調(diào)用哪個(gè)函數(shù)重載:重載發(fā)生在同一個(gè)類(lèi)中,同名的方法如果有不同的參數(shù)列表

5、(參數(shù)類(lèi)型不同、參數(shù)個(gè)數(shù)不同或者二者都不同)則視為重載。重寫(xiě):重寫(xiě)發(fā)生在子類(lèi)與父類(lèi)之間,重寫(xiě)要求子類(lèi)被重寫(xiě)方法與父類(lèi)被重寫(xiě)方法有相同的返回類(lèi)型,比父類(lèi)被重寫(xiě)方法更好5.,不能比父類(lèi)被重寫(xiě)方法的異常(里氏代換原則)。根據(jù)不同的子類(lèi)對(duì)象確定調(diào)用的那個(gè)方法。面象開(kāi)發(fā)的六個(gè)基本原則(單一職責(zé)、開(kāi)放封閉、里氏替換、依賴(lài)倒置、聚合復(fù)用、接口),迪法則。在項(xiàng)目中用6.過(guò)哪些原則六個(gè)基本原則單一職責(zé):一個(gè)類(lèi)只做它該做的事情(高內(nèi)聚)。在面象中,如果只讓一個(gè)類(lèi)完成它該做的事,而不涉及與它無(wú)關(guān)的領(lǐng)域就是踐行了高內(nèi)聚的原則,這個(gè)類(lèi)就只有單一職責(zé)。開(kāi)放封閉: 實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。要做到開(kāi)閉有兩個(gè)要點(diǎn):抽象

6、是關(guān)鍵,一個(gè)系統(tǒng)中如果沒(méi)有抽象類(lèi)或接口系統(tǒng)就沒(méi)有擴(kuò)展點(diǎn);封裝可變性,將系統(tǒng)中的各種可變 封裝到一個(gè)繼承結(jié)構(gòu)中,如果多個(gè)可變 混雜在一起,系統(tǒng)將變得復(fù)雜而換亂。里氏替換:任何時(shí)候都可以用子類(lèi)型替換掉父類(lèi)型。子類(lèi)一定是增加父類(lèi)的能力而不是減少父類(lèi)的能力,因?yàn)樽宇?lèi)比父類(lèi)的能力 ,把能力多的對(duì)象當(dāng)成能力少的對(duì)象來(lái)用當(dāng)然沒(méi)有任何問(wèn)題。依賴(lài)倒置:面向接口編程。(該原則說(shuō)得直白和具體一些就是方法的參數(shù)類(lèi)型、方法的返回類(lèi)型、變量的時(shí),盡可能使用抽象類(lèi)型而不用具體類(lèi)型,因?yàn)槌橄箢?lèi)型可以被它的任何一個(gè)子類(lèi)型所替代)類(lèi)型聚和復(fù)用:優(yōu)先使用聚合或關(guān)系復(fù)用代碼。接口:接口要小而專(zhuān),絕不能大而全。臃腫的接口是對(duì)接口的污染

7、,既然接口表示能力,那么一個(gè)接口只應(yīng)該描述一種能力,接口也應(yīng)該是高度內(nèi)聚的。法則迪迪法則又叫最少知識(shí)原則,一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少的了解。項(xiàng)目中用到的原則單一職責(zé)、開(kāi)放封閉、 s ic和final的區(qū)別和用途S ic聚合復(fù)用(最簡(jiǎn)單的例子就是String類(lèi))、接口7.修飾變量:靜態(tài)變量隨著類(lèi)加載時(shí)被完成初始化,內(nèi)存中只有一個(gè),且JVM也只會(huì)為它分配一次內(nèi)存,所有類(lèi)共享靜態(tài)變量。修飾方法:在類(lèi)加載的時(shí)候就存在,不依賴(lài)任何實(shí)例;s ic方法必須實(shí)現(xiàn),不能用abstract修飾。修飾代碼塊:在類(lèi)加載完之后就會(huì)執(zhí)行代碼塊中的內(nèi)容。父類(lèi)靜態(tài)代碼塊-子類(lèi)靜態(tài)代碼塊-父類(lèi)非靜態(tài)代碼塊-父類(lèi)構(gòu)造方法-

8、子類(lèi)非靜態(tài)代碼塊-子類(lèi)構(gòu)造方法Final修飾變量:編譯期常量:類(lèi)加載的過(guò)程完成初始化,編譯后帶入到任何計(jì)算式中。只能是基本類(lèi)型。運(yùn)行時(shí)常量:基本數(shù)據(jù)類(lèi)型或數(shù)據(jù)類(lèi)型。不可變,但的對(duì)象內(nèi)容可變。1/2017/12/19OneNote Online修飾方法:不能被繼承,不能被子類(lèi)修改。修飾類(lèi):不能被繼承。修飾形參:final形參不可變Hash Map和Hash Table的區(qū)別,Hash Map中的key可以是任何對(duì)象或數(shù)據(jù)類(lèi)型嗎?HashTable是線(xiàn)程安全的么?Hash Map和Hash Table的區(qū)別Hashtable的方法是同步的,HashMap同步,所以在多線(xiàn)程場(chǎng)合要手動(dòng)同步HashMa

9、p這個(gè)區(qū)別就像Vector和ArrayList一樣。Hashtable不允許 null 值(key 和 value 都不可以),HashMap允許 null 值(key和value都可以)。兩者的遍歷方式大同小異,Hashtable僅僅比HashMap多一個(gè)elements方法。Hashtable 和HashMap 都能通過(guò)values()方法返回一個(gè) Collection ,然后進(jìn)行遍歷處理。兩者也都可以通過(guò) entrySet() 方法返回一個(gè) Set , 然后進(jìn)行遍歷處理。HashTable使用Enumeration,HashMap使用Iterator。哈希值的使用不同,Hashtable

10、直接使用對(duì)象的hashCode。而HashMap重新計(jì)算hash值,而且用于代替求模。 Hashtable中hash數(shù)組默認(rèn)大小是11,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認(rèn)大小是16,而且一定是2的指數(shù)。HashTable基于Dictionary類(lèi),而HashMap基于AbstractMap類(lèi)Hash Map中的key可以是任何對(duì)象或數(shù)據(jù)類(lèi)型嗎可以為null,但不能是可變對(duì)象,如果是可變對(duì)象的話(huà),對(duì)象中的屬性改變,則對(duì)象HashCode也進(jìn)行相應(yīng)的改變,導(dǎo)致下次無(wú)法查找到已存在Map中的數(shù)據(jù)。如果可變對(duì)象在HashMap中被用作鍵,那就要成員變量的改變能保證該對(duì)象的

11、哈希值不變即可。HashTable是線(xiàn)程安全的么在改變對(duì)象狀態(tài)的時(shí)候,不要改變它的哈希值了。只需要保證HashTable是線(xiàn)程安全的,其實(shí)現(xiàn)是在對(duì)應(yīng)的方法上添加了synchronized關(guān)鍵字進(jìn)行修飾,由于在執(zhí)行此方法的時(shí)候需要獲得對(duì)象鎖,則執(zhí)行起來(lái)比較慢。所以現(xiàn)在如果為了保證線(xiàn)程安全的話(huà),使用CurrensxhMap。9. HashMap和ConcurrenshMap區(qū)別, ConcurrenshMap 線(xiàn)程安全嗎, ConcurrenshMap如何保證線(xiàn)程安全?HashMap和ConcurrenshMap區(qū)別?HashMap是非線(xiàn)程安全的,CurrenshMap是線(xiàn)程安全的。Concurr

12、enshMap將整個(gè)Hash桶進(jìn)行了分段segment,也就是將這個(gè)大的數(shù)組分成了幾個(gè)小的片段segment,而且每個(gè)小的片段segment上面都有鎖存在,那么在元素的時(shí)候就需要先找到應(yīng)該到哪一個(gè)片段segment,然后再在這個(gè)片段上面進(jìn)行,而且這里還需要獲取segment鎖。ConcurrenshMap讓鎖的粒度更精細(xì)一些,并發(fā)性能更好。ConcurrenshMap 線(xiàn)程安全嗎, ConcurrenshMap如何保證線(xiàn)程安全?HashTable容器在競(jìng)爭(zhēng)激烈的并發(fā)環(huán)境下效率低下的原因是所有HashTable的線(xiàn)程都必須競(jìng)爭(zhēng)同一把鎖,那假如容器里有多把鎖,每一把鎖用于鎖容器其中一部分?jǐn)?shù)據(jù),那么

13、當(dāng)多線(xiàn)程容器里不同數(shù)據(jù)段的數(shù)據(jù)時(shí),線(xiàn)程間就不會(huì)存在鎖競(jìng)爭(zhēng),從而可以有效的提高并發(fā)效率,這就是ConcurrenshMap所使用的鎖分段技術(shù),首先將數(shù)據(jù)分成一段一段的,然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線(xiàn)程占用鎖其中一個(gè)段數(shù)據(jù)的時(shí)候,其他段的數(shù)據(jù)也能被其他線(xiàn)程。get操作的高效之處在于整個(gè)get過(guò)程不需要加鎖,除非讀到的值是空的才會(huì)加鎖重讀。get方法里將要使用的共享變量都定義成volatile,如用于統(tǒng)計(jì)當(dāng)前Segement大小的count字段和用于值的HashEntry的value。定義成volatile的變量,能夠程之間保持可見(jiàn)性,能夠被多線(xiàn)程同時(shí)讀,并且保證不會(huì)讀到過(guò)期的值,但是只能被單線(xiàn)

14、程寫(xiě)(有一種情況可以被多線(xiàn)程寫(xiě),就是寫(xiě)入的值不依賴(lài)于原值),在get操作里只需要讀不需要寫(xiě)共享變量count和value,所以可以不用加鎖。Put方法首先定位到Segment,然后在Segment里進(jìn)行操作。操作需要經(jīng)歷兩個(gè)步驟,第一步判斷是否需要對(duì)Segment里的HashEntry數(shù)組進(jìn)行擴(kuò)容,第二步定位添加元素的位置然后放在HashEntry數(shù)組里。10. 因?yàn)閯e人知道源碼怎么實(shí)現(xiàn)的,故意構(gòu)造相同的hash的字符串進(jìn)行,怎么處理?那jdk7怎么辦?怎么處理構(gòu)造相同hash的字符串進(jìn)行?當(dāng)客戶(hù)端提交一個(gè)請(qǐng)求并附帶參數(shù)的時(shí)候 web應(yīng)用服務(wù)器會(huì)把的參數(shù)轉(zhuǎn)化成一個(gè)HashMap,這個(gè)HashM

15、ap的邏輯結(jié)構(gòu)如下:key1-value1;但是物理結(jié)構(gòu)是不同的,key值會(huì)被轉(zhuǎn)化成Hashcode,這個(gè)hashcode有會(huì)被轉(zhuǎn)成數(shù)組的下標(biāo):0-value1;不同的string就會(huì)產(chǎn)生相同hashcode而導(dǎo)致碰撞,碰撞后的物理結(jié)構(gòu)可能如下:0-value1-value2;1、限制t和get的參數(shù)個(gè)數(shù),越少越好限制t數(shù)據(jù)包的大小WAFJdk7 如何處理hashcode字符串HashMap會(huì)動(dòng)態(tài)的使用一個(gè)專(zhuān)門(mén)的treemap實(shí)現(xiàn)來(lái)替換掉它。String、StringBuffer、StringBuilder以及對(duì)String不變性的理解String、StringBuffer、StringBui

16、lder都是 final 類(lèi), 都不允許被繼承;String 長(zhǎng)度是不可變的, StringBuffer、StringBuilder 長(zhǎng)度是可變的;StringBuffer 是線(xiàn)程安全的, StringBuilder 不是線(xiàn)程安全的,但它們兩個(gè)中的所有方法都是相同的,StringBuffer在 StringBuilder的方法之上添加了synchronized修飾,保證線(xiàn)程安全。StringBuilder比StringBuffer擁有更好的性能。如果一個(gè)String類(lèi)型的字符串,在編譯時(shí)就可以確定是一個(gè)字符串常量,則編譯完成之后,字符串會(huì)自動(dòng)拼接成一個(gè)常量。此時(shí)String的速度比String

17、Buffer和StringBuilder的性能好的多。String不變性的理解String 類(lèi)是被final進(jìn)行修飾的,不能被繼承。在用+號(hào)字符串的時(shí)候會(huì)創(chuàng)建新的字符串。String s = new String(o world ); 可能創(chuàng)建兩個(gè)對(duì)象也可能創(chuàng)建一個(gè)對(duì)象。如果靜態(tài)區(qū)中有o world 字符串常量對(duì)象的話(huà),則僅僅在堆中創(chuàng)建一個(gè)對(duì)象。如果靜態(tài)區(qū)中沒(méi)有o world 對(duì)象,則堆上和靜態(tài)區(qū)中都需要?jiǎng)?chuàng)建對(duì)象。在 java 中, 通過(guò)使用 + 符號(hào)來(lái)串聯(lián)字符串的時(shí)候, 實(shí)際上底層會(huì)轉(zhuǎn)成通過(guò) StringBuilder 實(shí)例的 append() 方法來(lái)實(shí)現(xiàn)。String有重寫(xiě)Object的h

18、ashcode和toString嗎?如果重寫(xiě)equals不重寫(xiě)hashcode會(huì)出現(xiàn)什么問(wèn)題?String有重寫(xiě)Object的hashcode和toString嗎?String重寫(xiě)了Object類(lèi)的hashcode和toString方法。2/172017/12/19當(dāng)equals方法被重寫(xiě)時(shí),通常有必要重寫(xiě)hashCode方法,以象必須有相同的hashCodeOneNote OnlinehashCode方法的常規(guī)協(xié)定,該協(xié)定相對(duì)等的兩個(gè)對(duì)object1.euqal(object2)時(shí)為true, object1.hashCode() = object2.hashCode() 為trueobje

19、ct1.hashCode() = object2.hashCode() 為false時(shí),object1.euqal(object2)必定為falseobject1.hashCode() = object2.hashCode() 為true時(shí),但object1.euqal(object2)不一定定為true重寫(xiě)equals不重寫(xiě)hashcode會(huì)出現(xiàn)什么問(wèn)題在散列集合時(shí)(如Set類(lèi)),如果原對(duì)象.equals(新對(duì)象),但沒(méi)有對(duì)hashCode重寫(xiě),即兩個(gè)對(duì)象擁有不同的hashCode,則在集合中將會(huì)兩個(gè)值相同的對(duì)象,從而導(dǎo)致。因此在重寫(xiě)equals方法時(shí),必須重寫(xiě)hashCode方法。Java

20、序列化,如何實(shí)現(xiàn)序列化和反序列化,常見(jiàn)的序列化協(xié)議有哪些Java序列化定義將那些實(shí)現(xiàn)了Serializable接口的對(duì)象轉(zhuǎn)換成一個(gè)字節(jié)序列,并能夠在以后將這個(gè)字節(jié)序列完全恢復(fù)為原來(lái)的對(duì)象,序列化可以彌補(bǔ)不同操作系統(tǒng)之間的差異。Java序列化的作用Java方法調(diào)用(RMI)對(duì)JavaBeans進(jìn)行序列化如何實(shí)現(xiàn)序列化和反序列化實(shí)現(xiàn)序列化方法實(shí)現(xiàn)Serializable接口該接口只是一個(gè)可序列化的標(biāo)志,并沒(méi)有包含實(shí)際的屬性和方法。如果不在改方法中添加readObject()和writeObject()方法,則采取默認(rèn)的序列化機(jī)制。如果添加了這兩個(gè)方法之后還想利用Java默認(rèn)的序列化機(jī)制,則在這兩個(gè)

21、方法中分別調(diào)用defaultReadObject()和 defaultWriteObject()兩個(gè)方法。為了保證安全性,可以使用transient關(guān)鍵字進(jìn)行修飾不必序列化的屬性。因?yàn)樵诜葱蛄谢瘯r(shí),private修飾的屬性也能發(fā)查看到。實(shí)現(xiàn)ExternalSerializable方法自己對(duì)要序列化的內(nèi)容進(jìn)行控制,控制那些屬性能被序列化,那些不能被序列化。反序列化實(shí)現(xiàn)Serializable接口的對(duì)象在反序列化時(shí)不需要調(diào)用對(duì)象所在類(lèi)的構(gòu)造方法,完全基于字節(jié)。實(shí)現(xiàn)externalSerializable接口的方法在反序列化時(shí)會(huì)調(diào)用構(gòu)造方法。注意事項(xiàng)被s ic修飾的屬性不會(huì)被序列化對(duì)象的類(lèi)名、屬性都

22、會(huì)被序列化,方法不會(huì)被序列化要保證序列化對(duì)象所在類(lèi)的屬性也是可以被序列化的當(dāng)通過(guò)網(wǎng)絡(luò)、文件進(jìn)行序列化時(shí),必須按照寫(xiě)入的順序?qū)ο?。反序列化時(shí)必須有序列化對(duì)象時(shí)的class文件最好顯示的serializableID,因?yàn)樵诓煌腏VM之間,默認(rèn)生成serializableID 可能不同,會(huì)造成反序列化失敗。常見(jiàn)的序列化協(xié)議有哪些COM主要用于Windows,并沒(méi)有真正實(shí)現(xiàn)跨,另外COM的序列化的原理利用了編譯器中虛表,使得其學(xué)習(xí)成本巨大。CORBA是早期比較好的實(shí)現(xiàn)了跨,跨語(yǔ)言的序列化協(xié)議。COBRA的主要問(wèn)題是參與方過(guò)多帶來(lái)的版本過(guò)多,版本之間兼容性較差,以及使用復(fù)雜晦澀。 XML&SOAPXM

23、L是一種常用的序列化和反序列化協(xié)議,具有跨機(jī)器,跨語(yǔ)言等優(yōu)點(diǎn)。SOAP(Simple Object Acs protocol) 是一種被廣泛應(yīng)用的,基于XML為序列化和反序列化協(xié)議的結(jié)構(gòu)化消息傳遞協(xié)議。SOAP具有安全、可擴(kuò)展、跨語(yǔ)言、跨并支持多種傳輸層協(xié)議。JSON(Javascript Object No ion)這種Asso tive array格式非常符合工程師對(duì)對(duì)象的理解。它保持了XML的人眼可讀(Human-readable)的優(yōu)點(diǎn)。相對(duì)于XML而言,序列化后的數(shù)據(jù)更加簡(jiǎn)潔。它具備Javascript的性支持,所以被廣泛應(yīng)用于Web browser的應(yīng)用常景中,是Ajax的事實(shí)標(biāo)準(zhǔn)

24、協(xié)議。與XML相比,其協(xié)議比較簡(jiǎn)單,速度比較快。松散的Asso tive array使得其具有良好的可擴(kuò)展性和兼容性。Thrift是開(kāi)源提供的一個(gè)高性能,輕量級(jí)RPC服務(wù)框架,其產(chǎn)生正是為了滿(mǎn)足當(dāng)前大數(shù)據(jù)量、分布式、跨語(yǔ)言、跨通訊的需求。Thrift在空間開(kāi)銷(xiāo)和性能上有了比較大的,對(duì)于對(duì)性能要求比較高的分布式系統(tǒng),它是一個(gè)優(yōu)秀的RPC解決方案;但是由于Thrift的序列化被嵌入到Thrift框架里面,Thrift框架本身并沒(méi)有透出序列化和反序列化接口,這導(dǎo)致其很難和其他傳輸層協(xié)議共同使用Protobuf具備了優(yōu)秀的序列化協(xié)議的所需的眾多典型特征標(biāo)準(zhǔn)的IDL和IDL編譯器,這使得其對(duì)工程師非常友

25、好。序列化數(shù)據(jù)非常簡(jiǎn)潔,緊湊,與XML相比,其序列化之后的數(shù)據(jù)量約為1/3到1/10。速度非常快,比對(duì)應(yīng)的XML快約20-100倍。提供了非常友好的動(dòng)態(tài)庫(kù),使用非常簡(jiǎn)介,反序列化只需要一行代碼。由于其少,非常適合應(yīng)用層對(duì)象的持久化場(chǎng)景性能高,序列化后數(shù)據(jù)量相對(duì)Avro的產(chǎn)生解決了JSON的冗長(zhǎng)和沒(méi)有IDL,Avro屬于Apache Hadoop的一個(gè)子項(xiàng)目。 Avro提供兩種序列化格式:JSON格式或者Binary格式。Binary格式在空間開(kāi)銷(xiāo)和性能方面可以和Protobuf媲美,JSON格式方便測(cè)試階段的調(diào)試。適合于高性能的序列化服務(wù)。幾種協(xié)議的對(duì)比XML序列化(Xstream)無(wú)論在性能

26、和簡(jiǎn)潔性上比較差;Thrift與Protobuf相比在時(shí)空開(kāi)銷(xiāo)方面都有一定的劣勢(shì);Protobuf和Avro在兩方面表現(xiàn)都非常優(yōu)越。Java實(shí)現(xiàn)多線(xiàn)程的方式及三種方式的區(qū)別實(shí)現(xiàn)多線(xiàn)程的方式繼承Thread類(lèi),重寫(xiě)run函數(shù)。實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)Callable接口三種方式的區(qū)別3/172017/12/19OneNote Online實(shí)現(xiàn)Runnable接口可以避免Java單繼承特性而帶來(lái)的局限;增強(qiáng)程序的健壯性,代碼能夠被多個(gè)線(xiàn)程共享,代碼與數(shù)據(jù)是獨(dú)立的;適合多個(gè)相同程序代碼的線(xiàn)程區(qū)處理同一資源的情況。繼承Thread類(lèi)Runnable方法啟動(dòng)線(xiàn)程都是使用start方法,然后JVM虛擬

27、機(jī)將此線(xiàn)程放到就緒隊(duì)列中,如果有處理機(jī)可用,則執(zhí)行run方法。實(shí)現(xiàn)Callable接口要實(shí)現(xiàn)call方法,并且線(xiàn)程執(zhí)行完畢后會(huì)有返回值。其他的兩種都是重寫(xiě)run方法,沒(méi)有返回值。線(xiàn)程安全定義某個(gè)類(lèi)的行為與其規(guī)范一致。不管多個(gè)線(xiàn)程是怎樣的執(zhí)行順序和優(yōu)先級(jí),或是wait,sleep,join等控制方式,,如果一個(gè)類(lèi)在多線(xiàn)程常,并且類(lèi)不需要進(jìn)行額外的同步處理或者協(xié)調(diào),那么就認(rèn)為它是線(xiàn)程安全的。如何保證線(xiàn)程安全?6對(duì)變量使用voli e對(duì)程序段進(jìn)行加鎖(synchronized,lock)注意下運(yùn)轉(zhuǎn)一切正非線(xiàn)程安全的集合在多線(xiàn)程環(huán)境下可以使用,但并不能作為多個(gè)線(xiàn)程共享的屬性,可以作為某個(gè)線(xiàn)程獨(dú)享的屬性

28、。例如Vector是線(xiàn)程安全的,ArrayList不是線(xiàn)程安全的。如果每一個(gè)線(xiàn)程中new一個(gè)ArrayList,而這個(gè)ArrayList只是在這一個(gè)線(xiàn)程中使用,肯定沒(méi)問(wèn)題。多線(xiàn)程如何進(jìn)行信息交互Object中的方法,wait(), notify(),notifyAll();多線(xiàn)程共用一個(gè)數(shù)據(jù)變量需要注意什么?當(dāng)程對(duì)象(Runnable)中定義了全局變量,run方修改該變量時(shí),如果有多個(gè)線(xiàn)程同時(shí)使用該線(xiàn)程對(duì)象,那么就會(huì)造成全局變量的值被同時(shí)修改,造成錯(cuò)誤.ThreadLocal是JDK引入的一種機(jī)制,它用于解決線(xiàn)程間共享變量,使用ThreadLocal的變量,即使程中屬于全局變量,針對(duì)每個(gè)線(xiàn)程來(lái)

29、講,這個(gè)變量也是獨(dú)立的。volatile變量每次被線(xiàn)程時(shí),都強(qiáng)迫線(xiàn)程從主內(nèi)存中重讀該變量的值,而當(dāng)該變量發(fā)生修改變化時(shí),也會(huì)強(qiáng)迫線(xiàn)程將的值刷新回主內(nèi)存中。這樣一來(lái),不同的線(xiàn)程都的看到該變量的值。線(xiàn)程池?如果讓你設(shè)計(jì)一個(gè)動(dòng)態(tài)大小的線(xiàn)程池,如何設(shè)計(jì),應(yīng)該有哪些方法?線(xiàn)程池18.線(xiàn)程池顧名思義就是事先創(chuàng)建若干個(gè)可執(zhí)行的線(xiàn)程放入一個(gè)池(容器)中,需要的時(shí)候從池中獲取線(xiàn)程不用自行創(chuàng)建,使用完畢不需要銷(xiāo)毀線(xiàn)程而是放回池中,從而減少創(chuàng)建和銷(xiāo)毀線(xiàn)程對(duì)象的開(kāi)銷(xiāo)。設(shè)計(jì)一個(gè)動(dòng)態(tài)大小的線(xiàn)程池,如何設(shè)計(jì),應(yīng)該有哪些方法一個(gè)線(xiàn)程池包括以下四個(gè)基本組成部分:線(xiàn)程管理器(Threool):用于創(chuàng)建并管理線(xiàn)程池,包括創(chuàng)建線(xiàn)程,

30、銷(xiāo)毀線(xiàn)程池,添加新任務(wù);工作線(xiàn)程(PoolWorker):線(xiàn)程池中線(xiàn)程,在沒(méi)有任務(wù)時(shí)處于等待狀態(tài),可以循環(huán)的執(zhí)行任務(wù);任務(wù)接口(Task):每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,以供工作線(xiàn)程調(diào)度任務(wù)的執(zhí)行,它主要規(guī)定了任務(wù)的完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等;任務(wù)隊(duì)列(TaskQueue):用于存放沒(méi)有處理的任務(wù)。提供一種緩沖機(jī)制;所包含的方法,任務(wù)執(zhí)行private Threool() 創(chuàng)建線(xiàn)程池public s ic Threool getThreool() 獲得一個(gè)默認(rèn)線(xiàn)程個(gè)數(shù)的線(xiàn)程池public void execute(Runnable task) 執(zhí)行任務(wù),其實(shí)只是把任務(wù)加入任務(wù)隊(duì)列,什么時(shí)候執(zhí)行

31、有線(xiàn)程池管理器決定public void execute(Runnable task) 批量執(zhí)行任務(wù),其實(shí)只是把任務(wù)加入任務(wù)隊(duì)列,什么時(shí)候執(zhí)行有線(xiàn)程池管理器決定public void destroy() 銷(xiāo)毀線(xiàn)程池,該方法保證在所有任務(wù)都完成的情況下才銷(xiāo)毀所有線(xiàn)程,否則等待任務(wù)完成才銷(xiāo)毀publicgetWorkThreadNumber() 返回工作線(xiàn)程的個(gè)數(shù)publicgetFinishedTasknumber() 返回已完成任務(wù)的個(gè)數(shù),這里的已完成是只出了任務(wù)隊(duì)列的任務(wù)個(gè)數(shù),可能該任務(wù)并沒(méi)有實(shí)際執(zhí)行完成public void addThread() 在保證線(xiàn)程池中所有線(xiàn)程正在執(zhí)行,并且要執(zhí)

32、行線(xiàn)程的個(gè)數(shù)大于某一值時(shí)。增加線(xiàn)程池中線(xiàn)程的個(gè)數(shù)public void reduceThread() 在保證線(xiàn)程池中有很大一部分線(xiàn)程處于空閑狀態(tài),并且空閑狀態(tài)的線(xiàn)程在小于某一值時(shí),減少線(xiàn)程池中線(xiàn)程的個(gè)數(shù)19. Java是否有內(nèi)存和內(nèi)存溢出靜態(tài)集合類(lèi),使用Set、Vector、HashMap等集合類(lèi)的時(shí)候需要特別注意。當(dāng)這些類(lèi)被定義成靜態(tài)的時(shí)候,由于他們的生命周期跟應(yīng)用程序一樣長(zhǎng),這時(shí)候就有可能發(fā)生內(nèi)存泄漏。例子class S icTest private s ic Vector v = new Vector(10);public void init()for ( i = 1; i =2);除根

33、結(jié)點(diǎn)和葉子結(jié)點(diǎn)外,其他每個(gè)結(jié)點(diǎn)至少有ceil(m / 2)個(gè)孩子(其中 ceil(x)是一個(gè)取上限的函數(shù));根結(jié)點(diǎn)至少有 2 個(gè)孩子(除非 B 樹(shù)只包含一個(gè)結(jié)點(diǎn):根結(jié)點(diǎn));所有葉子結(jié)點(diǎn)都出現(xiàn)在同一層, 葉子結(jié)點(diǎn)不包含任何關(guān)鍵字信息 (可以看做是外部結(jié)點(diǎn)或查詢(xún)失敗的結(jié)在,也有元素。類(lèi)似 樹(shù)中,每一個(gè) NULL 指針即當(dāng)做葉子結(jié)點(diǎn),只是沒(méi)畫(huà)出來(lái)而已)。每個(gè)非終端結(jié)點(diǎn)中包含有 n 個(gè)關(guān)鍵字信息: (n,P0,K1,P1,K2,P2,.,Kn,Pn)。其中:Ki (i=1. n)為關(guān)鍵字,且關(guān)鍵字按順序升序排序 K(i-1) Ki。Pi 為指向子樹(shù)根的結(jié)點(diǎn),且指針 P(i-1)指向子樹(shù)種所有結(jié)點(diǎn)的關(guān)鍵

34、字均小于 Ki,但都大于 K(i-1)。 鍵碼。第一范式的基礎(chǔ)上進(jìn)一步滿(mǎn)足 規(guī)范要求的稱(chēng)為第二范式(2NF),其余范式以次類(lèi)推。一般說(shuō)來(lái),數(shù)據(jù)庫(kù)只需1NF :符合1NF的關(guān)系中的每個(gè)屬性都不可再分用多叉樹(shù)結(jié) 樹(shù)的 能使B樹(shù)能保持較低的高度。點(diǎn),指向這些結(jié)點(diǎn)的指針都為 null);(注:葉子節(jié)點(diǎn)只是沒(méi)有孩子和指向孩子的指針,這些節(jié)點(diǎn)也存c) 關(guān)鍵字的個(gè)數(shù) n 必須滿(mǎn)足: ceil(m / 2)-1= n 標(biāo)記/整理算法 標(biāo)記/清除算法(此處的效率只是簡(jiǎn)單的對(duì)比時(shí)間復(fù)雜度,實(shí)際情況不一定如此)。內(nèi)存整齊度: 算法=標(biāo)記/整理算法標(biāo)記/清除算法。內(nèi)存利用率:標(biāo)記/整理算法=標(biāo)記/清除算法 算法。42

35、. JVM如何GC, ,老年代,持久代,都 哪些東西,以及各個(gè)區(qū)的作用?在方法中去new一個(gè)對(duì)象,那這方法調(diào)用完畢后,對(duì)象就會(huì)被回收,這就是一個(gè)典型的 對(duì)象。9/172017/12/19老年代OneNote Online在 中經(jīng)歷了N次 回收后仍然存活的對(duì)象就會(huì)被放到老年代中。而且大對(duì)象直接進(jìn)入老年代當(dāng)Survivor空間不夠用時(shí),需要依賴(lài)于老年代進(jìn)行分配擔(dān)保,所以大對(duì)象直接進(jìn)入老年代代即方法區(qū)。GC用的 可達(dá)性分析算法中,哪些對(duì)象可作為GC Roots對(duì)象?Java虛擬機(jī)棧中的對(duì)象方法區(qū)中的靜態(tài)成員方法區(qū)中的常量 對(duì)象什么時(shí)候進(jìn)行MinGC,F(xiàn)ullGCMinGC中的 收集動(dòng)作,采用的是 算

36、法對(duì)于較大的對(duì)象,在Min C的時(shí)候可以直接進(jìn)入老年代FullGC本地方法區(qū)中的JNI(Native方法) 對(duì)象。Full GC是發(fā)生在老年代的 收集動(dòng)作,采用的是標(biāo)記-清除/整理算法。由于老年代的對(duì)象幾乎都是在Survivor區(qū)熬過(guò)來(lái)的,不會(huì)那么容易死掉。因此Full GC發(fā)生的次數(shù)不會(huì)有Min C那么 頻繁,并且Time(Full GC)Time(Min C)各個(gè) 收集器是怎么工作的Serial收集器是一個(gè)單線(xiàn)程的收集器,不是只能使用一個(gè)CPU。在進(jìn)行 收集時(shí),必須暫停其他所有的工作線(xiàn)程,直到收集結(jié)采用 算法,Stop-The-World老年代采用標(biāo)記-整理算法,Stop-The-Worl

37、d簡(jiǎn)單高效,C nt模式下默認(rèn)的 收集器束。ParNew收集器ParNew收集器是Serial收集器的多線(xiàn)程版本采用 算法,Stop-The-World老年代采用標(biāo)記-整理算法,Stop-The-World除了Serial收集器之外,只有它能和CMS收集器配合工作它是運(yùn)行在Server模式下首選 收集器ParNew Scanvenge收集器類(lèi)似ParNew,但更加關(guān)注吞吐量。目標(biāo)是:達(dá)到一個(gè)可控制吞吐量的收集器。停頓時(shí)間和吞吐量不可能同時(shí)調(diào)優(yōu)。 一方面希望停頓時(shí)間少,另外一方面希望吞吐量高,其實(shí)這是 的。因?yàn)椋悍钡倪M(jìn)行GC,那吞吐量就會(huì)減少,性能就會(huì)降低。G1收集器是 收集器發(fā)展的最前言成果之

38、一,對(duì) 回收進(jìn)行了劃分優(yōu)先級(jí)的操作,這種有優(yōu)先級(jí)的區(qū)域回收方式保證了它的 高效率讓使用者明確指定指定停頓時(shí)間CMS收集器:(Concurrent Mark S p:并發(fā)標(biāo)記清除老年代收集器)一種以獲得最短回收停頓時(shí)間為目標(biāo)的收集器,適用于互聯(lián) 或者B/S系統(tǒng)的服務(wù)器上初始標(biāo)記(Stop-The-World):根可以直接關(guān)聯(lián)到的對(duì)象并發(fā)標(biāo)記(和用戶(hù)線(xiàn)程一起):主要標(biāo)記過(guò)程,標(biāo)記全部對(duì)象重新標(biāo)記(Stop-The-World):由于并發(fā)標(biāo)記時(shí),用戶(hù)線(xiàn)程依然運(yùn)行,因此在正式 前,再做修正并發(fā)清除(和用戶(hù)線(xiàn)程一起):基于標(biāo)記結(jié)果,直接 對(duì)象在GC的時(shí)候, 回收的工作總量是不變的,如果將停頓時(shí)間減少,那

39、頻率就會(huì)提高;既然頻率提高了,說(shuō)明就會(huì)頻最大的優(yōu)點(diǎn)是結(jié)合了空間整合,不會(huì)產(chǎn)生大量的碎片,也降低了進(jìn)行g(shù)c的頻率并發(fā)收集,低停頓10/172017/12/19OneNote OnlineJava虛擬機(jī)內(nèi)存的劃分,每個(gè)區(qū)域的功能程序計(jì)數(shù)器(線(xiàn)程私有)線(xiàn)程創(chuàng)建時(shí)創(chuàng)建,執(zhí)行本地方法時(shí)其值為undefined。虛擬機(jī)棧(線(xiàn)程私有)(棧內(nèi)存)為虛擬機(jī)執(zhí)行java方法服務(wù):方法被調(diào)用時(shí)創(chuàng)建棧幀-局部變量表-局部變量、對(duì)象如果線(xiàn)程請(qǐng)求的棧深度超出了虛擬機(jī)所允許的深度,就會(huì)出現(xiàn)StackOverFlowError。-Xss規(guī)定了棧的最大空間虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)展,如果擴(kuò)展到無(wú)法申請(qǐng)到足夠的內(nèi)存,會(huì)出現(xiàn)OOM本地方

40、法棧(線(xiàn)程私有)java虛擬機(jī)棧是為虛擬機(jī)執(zhí)行java方法服務(wù)的,而本地方法棧則為虛擬機(jī)執(zhí)使用到的Native方法服務(wù)。Java虛擬機(jī)沒(méi)有對(duì)本地方法棧的使用和數(shù)據(jù)結(jié)構(gòu)做強(qiáng)制規(guī)定。Sun HotSpot把Java虛擬機(jī)棧和本地方法棧合二為一會(huì)拋出StackOverFlowError和OutOfMemoryErrorJava堆被所有線(xiàn)程共享,在Java虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建,幾乎所有的對(duì)象實(shí)例都存放到堆中GC的管理的主要區(qū)域物理不連續(xù),邏輯上連續(xù),并可以動(dòng)態(tài)擴(kuò)展,無(wú)法擴(kuò)展時(shí)拋出OutOfMemoryError方法區(qū)用于 已被虛擬機(jī)加載的類(lèi)信息、常量、靜態(tài)變量、即使編譯器編譯后的代碼的數(shù)據(jù)Sun HotS

41、pot 虛擬機(jī)把方法區(qū)叫做 待(Permanent Generation) 運(yùn)行時(shí)常量池受到方法區(qū)的限制,拋出OutOfMemoryError用什么工具可以查出內(nèi)存泄漏Memory yzer:一個(gè)功能豐富的 JAVA 堆轉(zhuǎn)儲(chǔ)文件分析工具,可以幫助你發(fā)現(xiàn)內(nèi)存 和減少內(nèi)存消耗EclipseMAT:是一款開(kāi)源的JAVA內(nèi)存 ,查找內(nèi)存泄漏,能容易找到大塊內(nèi)存并驗(yàn)證誰(shuí)在一直占用它,它是基于 Eclipse RCP(Rich C nt Platform),可以 RCP的獨(dú)立版本或者Eclipse的插件JProbe:分析Java的內(nèi)存泄漏。48. JVM如何加載一個(gè)類(lèi)的過(guò)程,雙親委派模型中有哪些方法有沒(méi)有

42、可能父類(lèi)加載器和子類(lèi)加載器,加載同一個(gè)類(lèi)?如果加 載同一個(gè)類(lèi),該使用哪一個(gè)類(lèi)?雙親委派機(jī)制圖雙親委派概念如果一個(gè)類(lèi)加載器收到了類(lèi)加載的請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類(lèi),而是把這個(gè)請(qǐng)求委派給父類(lèi)加 載器去完成 每一個(gè)層次的加載器都是如此 因此所有的類(lèi)加載請(qǐng)求都會(huì)傳給頂層的啟動(dòng)類(lèi)加載器 只有當(dāng) 父加載器反饋?zhàn)约簾o(wú)法完成該加載請(qǐng)求(該加載器的搜索范圍中沒(méi)有找到對(duì)應(yīng)的類(lèi))時(shí),子加載器才會(huì)嘗試 自己去加載。加載器啟動(dòng)(Bootstrap)類(lèi)加載器:是用本地代碼實(shí)現(xiàn)的類(lèi)裝入器 它負(fù)責(zé)將/lib下面 的類(lèi)庫(kù)加載到內(nèi)存中(比如rt.jar)。由于引導(dǎo)類(lèi)加載器涉及到虛擬機(jī)本地實(shí)現(xiàn)細(xì)節(jié),開(kāi)發(fā)者無(wú)法直接獲取到

43、啟動(dòng)類(lèi)加載器的 所以不允許直接通過(guò) 進(jìn)行操作。標(biāo)準(zhǔn)擴(kuò)展(Exten )類(lèi)加載器:是由 Sun 的ExtClassLoader(sun.misc.Launcher$ExtClassLoader) 實(shí)現(xiàn)的。它負(fù)責(zé)將/lib/ext或者由系統(tǒng)變量 java.ext.dir指定位置中的類(lèi)庫(kù)加載到內(nèi) 存中。開(kāi)發(fā)者可以直接使用標(biāo)準(zhǔn)擴(kuò)展類(lèi)加載器。系統(tǒng)(System)類(lèi)加載器:由 Sun 的AppClassLoader(sun.misc.Launcher$AppClassLoader)實(shí)現(xiàn)的。 它負(fù)責(zé)將系統(tǒng)類(lèi)路徑(CLASSPATH)中指定的類(lèi)庫(kù)加載到內(nèi)存中。開(kāi)發(fā)者可以直接使用系統(tǒng)類(lèi)加載器。除 了以上列舉的三

44、種類(lèi)加載器,還有一種比較特殊的類(lèi)型 線(xiàn)程上下文類(lèi)加載器。如果加載同一個(gè)類(lèi),該使用哪一個(gè)類(lèi)?父類(lèi)的49. JVM線(xiàn)程死鎖,你該如何判斷是因?yàn)槭裁??如果用VisualVM,dump線(xiàn)程信息出來(lái),會(huì)有哪些信息常常需要在隔兩分鐘后再次收集一次thread dump,如果得到的輸出相同,仍然是大量thread都在等待給同一個(gè) 地址上鎖,那么肯定是死鎖了。50. java是如何進(jìn)行對(duì)象實(shí)例化的51. Student s = new Student();在內(nèi)存中做了哪些事情?加載Student.class文件進(jìn)內(nèi)存在棧內(nèi)存為s開(kāi)辟空間在堆內(nèi)存為學(xué)生對(duì)象開(kāi)辟空間對(duì)學(xué)生對(duì)象的成員變量進(jìn)行默認(rèn)初始化對(duì)學(xué)生對(duì)象的成

45、員變量進(jìn)行顯示初始化通過(guò)構(gòu)造方法對(duì)學(xué)生對(duì)象的成員變量賦值學(xué)生對(duì)象初始化完畢,把對(duì)象地址賦值給s變量52. 用什么工具調(diào)試程序?JConsole 用過(guò)嗎?JConsole 中,您將能夠監(jiān)視 JVM 內(nèi)存的使用情況、線(xiàn)程堆棧 、已裝入的類(lèi)和 VM 信息以及 CE MBean。53. 了解過(guò)JVM調(diào)優(yōu)沒(méi),基本思路是什么11/172017/12/19OneNote Online(JSP&Servlet)Servlet的生存周期Servlet接口定義了5個(gè)方法,其中前三個(gè)方法與Servlet生命周期相關(guān):-void init(ServletConfig config) throws ServletExc

46、eptionvoid serviervletRequest req, ServletResponse resp) throws ServletException, java.io.IOExceptionvoid destory()java.lang.String getServletInfo()ServletConfig getServletConfig()Web容器加載Servlet并將其實(shí)例化后,Servlet生命周期開(kāi)始,容器運(yùn)行其init()方法進(jìn)行Servlet的初始化;請(qǐng)求到達(dá)時(shí)調(diào)用 Servlet的service()方法,service()方 根據(jù)需要調(diào)用與請(qǐng)求對(duì)應(yīng)的doGet或

47、do t等方法;當(dāng)服務(wù)器關(guān)閉或項(xiàng)目被卸載時(shí)服務(wù)器會(huì)將Servlet實(shí)例銷(xiāo)毀,此時(shí)會(huì)調(diào)用Servlet的destroy()方法。Jsp和Servlet的區(qū)別Servlet是一個(gè)特殊的Java程序,它運(yùn)行于服務(wù)器的JVM中,能夠依靠服務(wù)器的支持向?yàn)g覽器提供顯示內(nèi)容。JSP本質(zhì)上是 Servlet的一種簡(jiǎn)易形式,JSP會(huì)被服務(wù)器處理成一個(gè)類(lèi)似于Servlet的Java程序,可以簡(jiǎn)化頁(yè)面內(nèi)容的生成。Servlet和JSP最主要的不同點(diǎn)在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML分離開(kāi)來(lái)。而JSP的情況是Java和 HTML可以組一個(gè)擴(kuò)展名為.jsp的文件。有人說(shuō),Se

48、rvlet就是在Java中寫(xiě)HTML,而JSP就是在HTML中寫(xiě)Java代碼,當(dāng)然這個(gè)說(shuō)法是很片面且不夠準(zhǔn)確的。JSP側(cè)重于視圖,Servlet更側(cè)重于控制邏輯,在MVC架構(gòu)模式中,JSP適合充當(dāng)視圖(view)而Servlet適合充當(dāng)控制器保存會(huì)話(huà)狀態(tài),有哪些方式、區(qū)別如何由于HTTP協(xié)議本身是無(wú)狀態(tài)的,服務(wù)器為了區(qū)分不同的用戶(hù),就需要對(duì)用戶(hù)會(huì)話(huà)進(jìn)行,簡(jiǎn)單的說(shuō)就是為用戶(hù)進(jìn)行登記,為用戶(hù)分配唯一的ID,下一次用戶(hù)在請(qǐng)求中包含此ID,服務(wù)器據(jù)此判斷到底是哪一個(gè)用戶(hù)。URL 重寫(xiě):在URL中添加用戶(hù)會(huì)話(huà)的信息作為請(qǐng)求的參數(shù),或者將唯一的會(huì)話(huà)ID添加到URL結(jié)尾以標(biāo)識(shí)一個(gè)會(huì)話(huà)。設(shè)置表單隱藏域:將和會(huì)

49、話(huà)相關(guān)的字段添加到隱式表單域中,這些信息不會(huì)在瀏覽器中顯示但是提交表單時(shí)會(huì)提交給服務(wù)器。這兩種方式很難處理多個(gè)頁(yè)面的信息傳遞,因?yàn)槿绻看味家薷腢RL或在頁(yè)面中添加隱式表單域來(lái)用戶(hù)會(huì)話(huà)相關(guān)信息,事情將變得非常麻煩。*補(bǔ)充:*HTML5中可以使用Web Storage技術(shù)通過(guò)JavaScript來(lái)保存數(shù)據(jù),例如可以使用localStorage和 sesStorage來(lái)保存用戶(hù)會(huì)話(huà)的信息,也能夠?qū)崿F(xiàn)會(huì)話(huà)。和ses ses的區(qū)別在服務(wù)器端,57.在客戶(hù)端(瀏覽器)ses的運(yùn)行依賴(lài) sesid,而 sesid 是存在中的,也就是說(shuō),如果瀏覽器禁用了,同時(shí) ses也會(huì)失效(但是可以通過(guò)其它方式實(shí)現(xiàn),比

50、如在 url 中傳遞 ses_id)ses可以放在 文件、數(shù)據(jù)庫(kù)、或內(nèi)存中都可以。用戶(hù)驗(yàn)證這種場(chǎng)合一般會(huì)用 ses不是很安全,別人可以分析存放在本地的并進(jìn)行考慮到安全應(yīng)當(dāng)使用ses。ses會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)增多,會(huì)比較占用你服務(wù)器的性能考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用。單個(gè)保存的數(shù)據(jù)過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)。(Spring&Hibernate)Spring IOC、AOP的理解以及實(shí)現(xiàn)的原理Spring IOCIoC叫控制反轉(zhuǎn),是Inverof Control的縮寫(xiě),DI(Dependency Injection)叫依賴(lài)注入,是對(duì)IoC更簡(jiǎn)單的詮釋??刂品?/p>

51、轉(zhuǎn)是把傳統(tǒng)上由程序代碼直接操控的對(duì)象的調(diào)用權(quán)交給容器,通過(guò)容器來(lái)實(shí)現(xiàn)對(duì)象組件的裝配和管理。所謂的 控制反轉(zhuǎn) 就是對(duì)組件對(duì)象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器,由容器來(lái)創(chuàng)建對(duì)象并管理對(duì)象之間的依賴(lài)關(guān)系。DI是對(duì)IoC更準(zhǔn)確的描述,即組件之間的依賴(lài)關(guān)系由容器在運(yùn)行期決定,形象的來(lái)說(shuō),即由容器動(dòng)態(tài)的將某種依賴(lài)關(guān)系注入到組件之中。舉個(gè)例子:一個(gè)類(lèi)A需要用到接口B中的方法,那么就需要為類(lèi)A和接口B建立關(guān)聯(lián)或依賴(lài)關(guān)系,最原始的方法是在類(lèi)A中創(chuàng)建一個(gè)接口B的實(shí)現(xiàn)類(lèi)C的實(shí)例,但這種方法需要開(kāi)發(fā) 自行 二者的依賴(lài)關(guān)系,也就是說(shuō)當(dāng)依賴(lài)關(guān)系發(fā)生變動(dòng)的時(shí)候需要修改代碼并重新構(gòu)建整個(gè)系統(tǒng)。如果通過(guò)一個(gè)容器來(lái)管

52、理這些對(duì)象以及對(duì)象的依賴(lài)關(guān)系,則只需要在類(lèi)A中定義好用于關(guān)聯(lián)接口B的方法(構(gòu)造器或setter方法),將類(lèi)A和接口B的實(shí)現(xiàn)類(lèi)C放入容器中,通過(guò)對(duì)容器的配置來(lái)實(shí)現(xiàn)二者的關(guān)聯(lián)。Spring IOC實(shí)現(xiàn)原理通過(guò)反射創(chuàng)建實(shí)例;獲取需要注入的接口實(shí)現(xiàn)類(lèi)并將其賦值給該接口。SprinPAOP(Aspect-Oriented Programming)指一種程序設(shè)計(jì)范型,該范型以一種稱(chēng)為切面(aspect)的語(yǔ)言構(gòu)造為基礎(chǔ),切面是一種新的模塊化機(jī)制,分散在對(duì)象、類(lèi)或方法中的橫切關(guān)注點(diǎn)(crosscutting concern)。橫切關(guān)注 是會(huì)影響到整個(gè)應(yīng)用程序的關(guān)注功能,它跟正常的業(yè)務(wù)邏輯是正交的,沒(méi)有必然的

53、聯(lián)系,但是幾乎所有的業(yè)務(wù)邏輯都會(huì)涉及到這些關(guān)注功能。通常,事務(wù)、日志、安全性等關(guān)注就是應(yīng)用中的橫切關(guān)注功能。SprinP實(shí)現(xiàn)原理動(dòng)態(tài)(利用反射和動(dòng)態(tài)編譯將模式變成動(dòng)態(tài)的)JDK的動(dòng)態(tài)JDKProxy返回動(dòng)態(tài)類(lèi),是目標(biāo)類(lèi)所實(shí)現(xiàn)接口的另一個(gè)實(shí)現(xiàn)版本,它實(shí)現(xiàn)了對(duì)目標(biāo)類(lèi)的(如同UserProxy與UserImp的關(guān)系)cglib動(dòng)態(tài)CGLibProxy返回的動(dòng)態(tài)Ioc容器的加載過(guò)程創(chuàng)建IOC配置文件的抽象資源類(lèi),則是目標(biāo)類(lèi)的一個(gè)子類(lèi)(類(lèi)擴(kuò)展了UserImpl類(lèi))創(chuàng)建一個(gè)BeanFactory把配置信息的BeanDefinitionReader,這里是XmlBeanDefinitionReader配置給

54、BeanFactory從定義好的資源位置讀入配置信息,具體的過(guò)程由XmlBeanDefinitionReader來(lái)完成,這樣完成整個(gè)載入bean定義的過(guò)程。60. 動(dòng)態(tài)與cglib實(shí)現(xiàn)的區(qū)別12/172017/12/19OneNote OnlineJDK動(dòng)態(tài)只能對(duì)實(shí)現(xiàn)了接口的類(lèi)生成,而不能針對(duì)類(lèi).CGLIB是針對(duì)類(lèi)實(shí)現(xiàn),主要是對(duì)指定的類(lèi)生成一個(gè)子類(lèi),覆蓋其中的方法因?yàn)槭抢^承,所以該類(lèi)或方法最好不要 final。成JDK是不需要以來(lái)第的庫(kù),只要JDK環(huán)境就可以進(jìn)行CGLib 必須依賴(lài)于CGLib的類(lèi)庫(kù),但是它需要類(lèi)來(lái)實(shí)現(xiàn)任何接口繼承的是指定的類(lèi)生成一個(gè)子類(lèi),覆蓋其中的方法,是一種61.的實(shí)現(xiàn)原理

55、唄62. HIbernate一級(jí)緩存與二級(jí)緩存之間的區(qū)別Hibernate的Ses提供了一級(jí)緩存的功能,默認(rèn)總是有效的,當(dāng)應(yīng)用程序保存持久化實(shí)體、修改持久化實(shí)體時(shí),Ses并不會(huì)立即把這種改變提交到數(shù)據(jù)庫(kù),而是緩存在當(dāng)前的Ses中,除非顯示調(diào)用了Ses的flush()方法或通過(guò)close()方法關(guān)閉Ses 。通過(guò)一級(jí)緩存,可以減少程序與數(shù)據(jù)庫(kù)的交互,從而提高數(shù)據(jù)庫(kù) 性能。Ses Factory級(jí)別的二級(jí)緩存是全局性的,所有的Ses 可以共享這個(gè)二級(jí)緩存。不過(guò)二級(jí)緩存默認(rèn)是關(guān)閉的,需要顯示開(kāi)啟并指定需要使用哪種二級(jí)緩存實(shí)現(xiàn)類(lèi)(可以使用第 提供的實(shí)現(xiàn))。一旦開(kāi)啟了二級(jí)緩存并設(shè)置了需要使用二級(jí)緩存的實(shí)

56、體類(lèi),Ses Factory就會(huì)緩存 過(guò)的該實(shí)體類(lèi)的每個(gè)對(duì)象,除非緩存的數(shù)據(jù)超出了指定的緩存空間。一級(jí)緩存和二級(jí)緩存都是對(duì)整個(gè)實(shí)體進(jìn)行緩存,不會(huì)緩存普通屬性,如果希望對(duì)普通屬性進(jìn)行緩存,可以使用查詢(xún)緩存。查詢(xún)緩存是將HQL或SQL語(yǔ)句以及它們的查詢(xún)結(jié)果作為鍵值對(duì)進(jìn)行緩存,對(duì)于同樣的查詢(xún)可以直接從緩存中獲取數(shù)據(jù)。查詢(xún)緩存默認(rèn)也是關(guān)閉的,需要顯示開(kāi)啟。63. Spring MVC的原理Spring MVC的工作原理如下圖所示: 客戶(hù)端的所有請(qǐng)求都交給前端控制器DispatcherServlet來(lái)處理,它會(huì)負(fù)責(zé)調(diào)用系統(tǒng)的其他模塊來(lái)真正處理用戶(hù)的請(qǐng)求。 DispatcherServlet收到請(qǐng)求后,將

57、根據(jù)請(qǐng)求的信息(包括URL、HTTP協(xié)議方法、請(qǐng)求頭、請(qǐng)求參數(shù)、等)以及 HandlerMap的配置找到處理該請(qǐng)求的Handler(任何一個(gè)對(duì)象都可以作為請(qǐng)求的Handler)。在這個(gè)地方Spring會(huì)通過(guò)HandlerAdapter對(duì)該處理進(jìn)行封裝。 HandlerAdapter是一個(gè)適配器,它用的接口對(duì)各種Handler中的方法進(jìn)行調(diào)用。 Handler完成對(duì)用戶(hù)請(qǐng)求的處理后,會(huì)返回一個(gè)MAndView對(duì)象給DispatcherServlet,MAndView顧名思義,包含了數(shù)據(jù)模型以及相應(yīng)的視圖的信息。 MAndView的視圖是邏輯視圖,DispatcherServlet還要借助View

58、Resolver完成從邏輯視圖到真實(shí)視圖對(duì)象的工作。 當(dāng)?shù)玫秸嬲囊晥D對(duì)象后,DispatcherServlet會(huì)利用視圖對(duì)象對(duì)模型數(shù)據(jù)進(jìn)行渲染。 客戶(hù)端得到響應(yīng),可能是一個(gè)普通的HTML頁(yè)面,也可以是XML或JSON字符串,還可以是一張或者一個(gè)PDF文件。簡(jiǎn)述Hibernate常見(jiàn)優(yōu)化策略。制定合理的緩存策略(二級(jí)緩存、查詢(xún)緩存)。采用合理的Ses管理機(jī)制。盡量使用延遲加載特性。設(shè)定合理的批處理參數(shù)。如果可以,選用UUID作為主鍵。如果可以,選用基于版本號(hào)的樂(lè)觀鎖替代悲觀鎖。在開(kāi)發(fā)過(guò)程中, 開(kāi)啟hibernate.show_sql選項(xiàng)查看生成的SQL,從而了解底層的狀況;開(kāi)發(fā)完成后關(guān)閉此選項(xiàng)

59、??紤]數(shù)據(jù)庫(kù)本身的優(yōu)化,合理的索引、恰當(dāng)?shù)臄?shù)據(jù)分區(qū)策略等都會(huì)對(duì)持久層的性能帶來(lái)可觀的,但這些需要專(zhuān)業(yè)的 DBA(數(shù)據(jù)庫(kù)管理員)提供支持。(操作系統(tǒng))操作系統(tǒng)什么情況下會(huì)死鎖?產(chǎn)生死鎖的必要條件互斥條件。即某個(gè)資源在一段時(shí)間內(nèi)只能由一個(gè)進(jìn)程占有,不能同時(shí)被兩個(gè)或兩個(gè)以上的進(jìn)程占有。這種獨(dú)占資源如 CD-ROM驅(qū)動(dòng)器,等等,必須在占有該資源的進(jìn)程主動(dòng) 它之后,其它進(jìn)程才能占有該資源。這是由資源本身的屬性所決定的。如獨(dú)木橋就是一種獨(dú)占資源,兩方的人不能同時(shí)過(guò)橋。不可搶占條件。進(jìn)程所獲得的資源在未使用完畢之前,資源申請(qǐng)者不能強(qiáng)行地從資源占有者手中奪取資源,而只能由該資源的占有者進(jìn)程自行 。如過(guò)獨(dú)木橋的

60、人不能強(qiáng)迫對(duì)方后退,也不能 地將對(duì)方推下橋,必須是橋上的人自己過(guò)橋后空出橋面(即主動(dòng) 占有資源),對(duì)方的 能過(guò)橋。占有且申請(qǐng)條件。進(jìn)程至少已經(jīng)占有一個(gè)資源,但又申請(qǐng)新的資源;由于該資源已被另程占有,此時(shí)該進(jìn)程阻塞;但是,它在等待新資源之時(shí),仍繼續(xù)占用已占有的資源。還以過(guò)獨(dú)木橋?yàn)槔?,甲乙兩人在橋上相遇。甲走過(guò)一段橋面(即占有了一些資源),還需要走其余的橋面(申請(qǐng)新的資源),但那部分橋面被乙占有(乙走過(guò)一段橋面)。甲過(guò)不去,前進(jìn)不能,又不后退;乙也處于同樣的狀況。循環(huán)等待條件。存在一個(gè)進(jìn)程等待序列P1,P2,.,Pn,其中P1等待P2所占有的某一資源,P2等待P3所占有的某一源,而Pn等待P1所占

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論