架構技術onenote-阿里面經_第1頁
架構技術onenote-阿里面經_第2頁
架構技術onenote-阿里面經_第3頁
架構技術onenote-阿里面經_第4頁
架構技術onenote-阿里面經_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

21、方法中分別調用defaultReadObject()和 defaultWriteObject()兩個方法。為了保證安全性,可以使用transient關鍵字進行修飾不必序列化的屬性。因為在反序列化時,private修飾的屬性也能發(fā)查看到。實現(xiàn)ExternalSerializable方法自己對要序列化的內容進行控制,控制那些屬性能被序列化,那些不能被序列化。反序列化實現(xiàn)Serializable接口的對象在反序列化時不需要調用對象所在類的構造方法,完全基于字節(jié)。實現(xiàn)externalSerializable接口的方法在反序列化時會調用構造方法。注意事項被s ic修飾的屬性不會被序列化對象的類名、屬性都

22、會被序列化,方法不會被序列化要保證序列化對象所在類的屬性也是可以被序列化的當通過網絡、文件進行序列化時,必須按照寫入的順序對象。反序列化時必須有序列化對象時的class文件最好顯示的serializableID,因為在不同的JVM之間,默認生成serializableID 可能不同,會造成反序列化失敗。常見的序列化協(xié)議有哪些COM主要用于Windows,并沒有真正實現(xiàn)跨,另外COM的序列化的原理利用了編譯器中虛表,使得其學習成本巨大。CORBA是早期比較好的實現(xiàn)了跨,跨語言的序列化協(xié)議。COBRA的主要問題是參與方過多帶來的版本過多,版本之間兼容性較差,以及使用復雜晦澀。 XML&SOAPXM

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

45、員變量進行顯示初始化通過構造方法對學生對象的成員變量賦值學生對象初始化完畢,把對象地址賦值給s變量52. 用什么工具調試程序?JConsole 用過嗎?JConsole 中,您將能夠監(jiān)視 JVM 內存的使用情況、線程堆棧 、已裝入的類和 VM 信息以及 CE MBean。53. 了解過JVM調優(yōu)沒,基本思路是什么11/172017/12/19OneNote Online(JSP&Servlet)Servlet的生存周期Servlet接口定義了5個方法,其中前三個方法與Servlet生命周期相關:-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并將其實例化后,Servlet生命周期開始,容器運行其init()方法進行Servlet的初始化;請求到達時調用 Servlet的service()方法,service()方 根據需要調用與請求對應的doGet或

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

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

49、話相關的字段添加到隱式表單域中,這些信息不會在瀏覽器中顯示但是提交表單時會提交給服務器。這兩種方式很難處理多個頁面的信息傳遞,因為如果每次都要修改URL或在頁面中添加隱式表單域來用戶會話相關信息,事情將變得非常麻煩。*補充:*HTML5中可以使用Web Storage技術通過JavaScript來保存數(shù)據,例如可以使用localStorage和 sesStorage來保存用戶會話的信息,也能夠實現(xiàn)會話。和ses ses的區(qū)別在服務器端,57.在客戶端(瀏覽器)ses的運行依賴 sesid,而 sesid 是存在中的,也就是說,如果瀏覽器禁用了,同時 ses也會失效(但是可以通過其它方式實現(xiàn),比

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論