71.垃圾回收算法,新生代和年老代用的什么算法,為什么用這個算法?
??????? 1.對象是否“已死”算法——引用計數(shù)器算法 對象中添加一個引用計數(shù)器,如果引用計數(shù)器為0則表示沒有其它地方在引用它。如果有一個地方引用就+1,引用失效時就-1。看似搞笑且簡單的一個算法,實際上在大部分Java虛擬機中并沒有采用這種算法,因為它會帶來一個致命的問題——對象循環(huán)引用。對象A指向B,對象B反過來指向A,此時它們的引用計數(shù)器都不為0,但它們倆實際上已經(jīng)沒有意義因為沒有任何地方指向它們。所以又引出了下面的算法。
??????? 2.對象是否“已死”算法——可達性分析算法 這種算法可以有效地避免對象循環(huán)引用的情況,整個對象實例以一個樹呈現(xiàn),根節(jié)點是一個稱為“GC Roots”的對象,從這個對象開始向下搜索并作標記,遍歷完這棵樹過后,未被標記的對象就會判斷“已死”,即為可被回收的對象。
??????? GC算法
??????? 1.標記-清除算法 等待被回收對象的“標記”過程在上文已經(jīng)提到過,如果在被標記后直接對對象進行清除,會帶來另一個新的問題——內(nèi)存碎片化。如果下次有比較大的對象實例需要在堆上分配較大的內(nèi)存空間時,可能會出現(xiàn)無法找到足夠的連續(xù)內(nèi)存而不得不再次觸發(fā)垃圾回收。
??????? 2.復制算法(Java堆中新生代的垃圾回收算法) 此GC算法實際上解決了標記-清除算法帶來的“內(nèi)存碎片化”問題。首先還是先標記處待回收內(nèi)存和不用回收的內(nèi)存,下一步將不用回收的內(nèi)存復制到新的內(nèi)存區(qū)域,這樣舊的內(nèi)存區(qū)域就可以全部回收,而新的內(nèi)存區(qū)域則是連續(xù)的。它的缺點就是會損失掉部分系統(tǒng)內(nèi)存,因為你總要騰出一部分內(nèi)存用于復制。當在新生代發(fā)生一次GC后,會將Eden和其中一個Survivor空間的內(nèi)存復制到另外一個Survivor中,如果反復幾次有對象一直存活,此時內(nèi)存對象將會被移至老年代。可以看到新生代中Eden占了大部分,而兩個Survivor實際上占了很小一部分。這是因為大部分的對象被創(chuàng)建過后很快就會被GC
??????? 3.標記-壓縮算法(或稱為標記-整理算法,Java堆中老年代的垃圾回收算法) 對于新生代,大部分對象都不會存活,所以在新生代中使用復制算法較為高效,而對于老年代來講,大部分對象可能會繼續(xù)存活下去,如果此時還是利用復制算法,效率則會降低。標記-壓縮算法首先還是“標記”,標記過后,將不用回收的內(nèi)存對象壓縮到內(nèi)存一端,此時即可直接清除邊界處的內(nèi)存,這樣就能避免復制算法帶來的效率問題,同時也能避免內(nèi)存碎片化的問題。老年代的垃圾回收稱為“Major GC”。
72.數(shù)據(jù)庫事務的隔離級別?
??????? 四大特性:
??????? ⑴ 原子性(Atomicity) 原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾
??????? ⑵ 一致性(Consistency) 一致性是指事務必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。 拿轉(zhuǎn)賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務結(jié)束后兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。
??????? ⑶ 隔離性(Isolation) 隔離性是當多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發(fā)事務之間要相互隔離。 即要達到這么一種效果:對于任意兩個并發(fā)的事務T1和T2,在事務T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個事務都感覺不到有其他事務在并發(fā)地執(zhí)行。
??????? ⑷ 持久性(Durability) 持久性是指一個事務一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務的操作。
??????? 如果不考慮事務的隔離性,會發(fā)生的幾種問題:
??????? 1,臟讀 臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數(shù)據(jù)。 當一個事務正在多次修改某個數(shù)據(jù),而在這個事務中這多次的修改都還未提交,這時一個并發(fā)的事務來訪問該數(shù)據(jù),就會造成兩個事務得到的數(shù)據(jù)不一致。
??????? 2,不可重復讀 不可重復讀是指在對于數(shù)據(jù)庫中的某個數(shù)據(jù),一個事務范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個事務修改并提交了。 例如事務T1在讀取某一數(shù)據(jù),而事務T2立馬修改了這個數(shù)據(jù)并且提交事務給數(shù)據(jù)庫,事務T1再次讀取該數(shù)據(jù)就得到了不同的結(jié)果,發(fā)送了不可重復讀。 不可重復讀和臟讀的區(qū)別是,臟讀是某一事務讀取了另一個事務未提交的臟數(shù)據(jù),而不可重復讀則是讀取了前一事務提交的數(shù)據(jù)。
??????? 3,虛讀(幻讀) 幻讀是事務非獨立執(zhí)行時發(fā)生的一種現(xiàn)象。例如事務T1對一個表中所有的行的某個數(shù)據(jù)項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行數(shù)據(jù)項,而這個數(shù)據(jù)項的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫。而操作事務T1的用戶如果再查看剛剛修改的數(shù)據(jù),會發(fā)現(xiàn)還有一行沒有修改,其實這行是從事務T2中添加的,就好像產(chǎn)生幻覺一樣,這就是發(fā)生了幻讀。 幻讀和不可重復讀都是讀取了另一條已經(jīng)提交的事務(這點就臟讀不同),所不同的是不可重復讀查詢的都是同一個數(shù)據(jù)項,而幻讀針對的是一批數(shù)據(jù)整體(比如數(shù)據(jù)的個數(shù))。
??????? MySQL數(shù)據(jù)庫為我們提供的四種隔離級別:
??????? (1) Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發(fā)生。
??????? (2) Repeatable read (可重復讀):可避免臟讀、不可重復讀的發(fā)生。
??????? (3) Read committed (讀已提交):可避免臟讀的發(fā)生。
??????? (4) Read uncommitted (讀未提交):最低級別,任何情況都無法保證。 以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執(zhí)行效率就越低。在MySQL數(shù)據(jù)庫中,支持上面四種隔離級別,默認的為Repeatable read (可重復讀);而在Oracle數(shù)據(jù)庫中,只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,其中默認的為Read committed級別。
73.HashMap的實現(xiàn)原理
??????? (1)利用key的hashCode重新hash計算出當前對象的元素在數(shù)組中的下標
??????? (2)存儲時,如果出現(xiàn)hash值相同的key,此時有兩種情況。如果key相同,則覆蓋原始值;如果key不同(出現(xiàn)沖突),則將當前的key-value放入鏈表中
??????? (3)獲取時,直接找到hash值對應的下標,在進一步判斷key是否相同,從而找到對應值。
??????? (4)理解了以上過程就不難明白HashMap是如何解決hash沖突的問題,核心就是使用了數(shù)組的存儲方式,然后將沖突的key的對象放入鏈表中,一旦發(fā)現(xiàn)沖突就在鏈表中做進一步的對比。


74.Hashset實現(xiàn)原理
??????? 往HashSet添加元素的時候,HashSet會先調(diào)用元素的hashCode方法得到元素的哈希值 , 然后通過元素 的哈希值經(jīng)過移位等運算,就可以算出該元素在哈希表中 的存儲位置。
??????? 情況1: 如果算出元素存儲的位置目前沒有任何元素存儲,那么該元素可以直接存儲到該位置上。
??????? 情況2: 如果算出該元素的存儲位置目前已經(jīng)存在有其他的元素了,那么會調(diào)用該元素的equals方法與該位置的元素再比較一次。如果equals返回的是true,那么該元素與這個位置上的元素就視為重復元素,不允許添加,如果equals方法返回的是false,那么該元素運行添加。
75.TCP與UDP區(qū)別總結(jié):
??????? 1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
??????? 2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付
??????? 3、UDP具有較好的實時性,工作效率比TCP高,適用于對高速傳輸和實時性有較高的通信或廣播通信。
??????? 4.每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
??????? 5、TCP對系統(tǒng)資源要求較多,UDP對系統(tǒng)資源要求較少。
76.數(shù)據(jù)庫中,exist和in的區(qū)別?
??????? in在查詢的時候,首先查詢子查詢的表,然后將內(nèi)表和外表做一個笛卡爾積,然后按照條件進行篩選 exist遍歷循環(huán)外表,然后看外表中的記錄有沒有和內(nèi)表的數(shù)據(jù)一樣的。匹配上就將結(jié)果放入結(jié)果集中。 In適合于外表大而內(nèi)表小的情況;EXISTS適合于外表小而內(nèi)表大的情況,這樣效率會高的
77.Spring中bean的作用域與生命周期?
??????? (1)作用域

??????? (2)生命周期 Bean實例生命周期的執(zhí)行過程如下:


??????? Spring對bean進行實例化,默認bean是單例;
??????? Spring對bean進行依賴注入;
??????? 如果bean實現(xiàn)了BeanNameAware接口,spring將bean的id傳給setBeanName()方法;
??????? 如果bean實現(xiàn)了BeanFactoryAware接口,spring將調(diào)用setBeanFactory方法,將BeanFactory實例傳進來;
??????? 如果bean實現(xiàn)了ApplicationContextAware接口,它的setApplicationContext()方法將被調(diào)用,將應用上下文的引用傳入到bean中;
??????? 如果bean實現(xiàn)了BeanPostProcessor接口,它的postProcessBeforeInitialization方法將被調(diào)用;
??????? 如果bean實現(xiàn)了InitializingBean接口,spring將調(diào)用它的afterPropertiesSet接口方法,類似的如果bean使用了init-method屬性聲明了初始化方法,該方法也會被調(diào)用;
??????? 如果bean實現(xiàn)了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法將被調(diào)用;
??????? 此時bean已經(jīng)準備就緒,可以被應用程序使用了,他們將一直駐留在應用上下文中,直到該應用上下文被銷毀;
??????? 若bean實現(xiàn)了DisposableBean接口,spring將調(diào)用它的distroy()接口方法。
??????? 同樣的,如果bean使用了destroy-method屬性聲明了銷毀方法,則該方法被調(diào)用;
78.什么是Spring MVC ?簡單介紹下你對springMVC的理解?
??????? SpringMVC是一個基于MVC架構(gòu)的用來簡化web應用程序開發(fā)的應用開發(fā)框架,它是Spring的一個模塊,無需中間整合層來整合。在web模型中,MVC是一種很流行的框架,通過把Model,View,Controller分離,把較為復雜的web應用分成邏輯清晰的幾部分,簡化開發(fā),減少出錯,方便組內(nèi)開發(fā)人員之間的配合。
79.SpringMVC的流程?
??????? (1)用戶發(fā)送請求至前端控制器DispatcherServlet;
??????? (2) DispatcherServlet收到請求后,調(diào)用HandlerMapping處理器映射器,請求獲取Handle;
??????? (3)處理器映射器根據(jù)請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet;
??????? (4)DispatcherServlet通過HandlerAdapter處理器適配器調(diào)用處理器;
??????? (5)執(zhí)行處理器(Handler,也叫后端控制器);
??????? (6)Handler執(zhí)行完成返回ModelAndView;
??????? (7)HandlerAdapter將Handler執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet;
??????? (8)DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進行解析;
??????? (9)ViewResolver解析后返回具體View;
??????? (10)DispatcherServlet對View進行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)??
??????? (11)DispatcherServlet響應用戶。
80.SpringMVC怎么樣設定重定向和轉(zhuǎn)發(fā)的?
??????? (1)在返回值前面加"forward:"就可以讓結(jié)果轉(zhuǎn)發(fā),譬如"forward:user.do?name=method4"
??????? (2)在返回值前面加"redirect:"就可以讓返回值重定向,譬如"redirect:http://www.baidu.com"