java面試題二

1、抽象類和接口的異同點?(這個本人在面試中被三家公司問道,很重要哦)
1.1、相同點:(1)都不能被直接實例化,都可以通過繼承實現其抽象方法;
(2)都是面向抽象編程技術基礎,實現諸多的設計模式
1.2、不同點:(1)接口支持多繼承;抽象類不能實現多繼承
(2)接口只能定義抽象規則;抽象類既可以定義規則,還可能提供己實現的成員。
(3)接口是一組行爲規範;抽象類是一個不完整的類,着重族的概念。
(4)接口可用於支持回調;抽象類不能實現回調,因爲繼承不支持。
(5)接口只包含方法,屬性,索引器,事件的簽名,但是不能定義字段和包含實現的方法;抽象類可以定義字段,屬性,包含有實現的方法。
(6)接口可以作用於值類型和引用類型;抽象類只能作用於引用類型。例如:Struct就可以繼承接口,而不能繼承類。
2.ArrayList,vectro,LinkedList存儲性能和特徵
首先ArrayList類、vectro類、LinkedList類都是可伸縮的數組,也就是可以動態改變長度的數組。
ArrayList類是JDK1.1後出現的,在內存中是隊列形式存儲,適合查找,它是線程不安全的
Vectro類是較老的數組列表,他是線程安全的。
LinkedList類鏈表結構的數組,它適合增刪改操作,但與ArrayList相比查詢效率較低。在實際開發中用ArrayList相對多一點。
3.鏈表,隊列和棧的區別
鏈表是一種存儲結構,指得是存儲時候除了要存儲數據元素之外,還要用數據元素一起的另外空間存儲數據元素的關係。
隊列和棧都是線性表,屬於邏輯結構範疇,都是訪問點受到限制,並且限制在線性表端點的線性表。
棧被限定爲在線性表中的同一個(唯一一個的)端點插入刪除
隊列被限定爲在線性表的一端插入,另外一個端點刪除
棧和隊列也可以用鏈表來實現,分別稱爲鏈棧和鏈隊列
4.HashMap和HashTable的區別?
HashMap和HashTable都實現了Map接口,他們之間的主要區別在於:線程安全性,同步(synchronization)以及速度。
(1)、HashMap幾乎可以等價於HashTable,除了HashMap是非synchronization的,並可以允許null,也就是說HashMap的k-v可以爲null,而HashTable則不允許k-v爲null;
(2)、HashMap是非synchronization,而HashTable是synchronization的,這樣就意味着HashMap是線程不安全的,恰恰相反HashTable就是線程安全的,多個線程可以共享一個HashTable;而如果沒有正確同步的話,多個線程是不能共享HashMap的。Java5提供了ConcurrentHashMap,他是替代HashTable的替代者,比HashTable的擴展性更好。
(3)、HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結構(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並不是一個一定發生的行爲,要看JVM。這條同樣也是Enumeration和Iterator的區別。
(4)、HashMap不能保證隨着時間的推移Map中的元素次序是不變的。
5、session和cookie的區別
(1)、session數據放在服務器上;cookie數據存放在客戶瀏覽器上
(2)、cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮安全問題的時候應使用session
(3)、session會在一定時間內保存在服務器上面。當訪問增多的時候,會比較佔用服務器的內存,如果考慮減輕服務器性能方面問題,應使用cookie.
(4)、單個cookie保存的數據不能超過4k,大多數瀏覽器限制一個站點最多保存20個cookie
(5)、可以將重要信息比如用戶名和密碼存放到session中,其他信息如果需要保留可以放在cookie中。
6.SpringMVC的理解?SpringMVC的工作流程?
SpringMVC是基於過濾器對servlet進行了封裝的一個框架,我們使用的時候就在web.xml中配置DispatcherServlet類;SpringMVC工作是主要是通過DispatcherServlet管理接受到的請求並進行處理。
SpringMVC的工作流程描述:
第一步:用戶先服務器發送請求,請求被Spring前端控制Servelt DispatcherServlet捕獲;
第二步: DispatcherServlet對請求URL進行解析,得到請求資源標識符(URL),然後根據該URL調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;
第三步: DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(…)方法)
第四步:提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:(1)、 HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息(2)、數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等(3)、數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等(4)、數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
第五步: Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;
第六步:根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
第七步:ViewResolver 結合Model和View,來渲染視圖
第八步:將渲染結果返回給客戶端。
7、Nginx?怎麼實現負載均衡?
Nginx 是俄羅斯人編寫的十分輕量級的 是一個高性能的HTTP和反向代理服務器,同時也是一個 IMAP/POP3/SMTP 代理服務器.
Nginx實現負載均衡只需要在nginx文件中進行配置即可,配置如下:
第一步:在http模塊的 #gzip on; 下面加上:(舉例)

upstream www.myweb.com { 
        server  127.0.0.1:9100 weight=1; 
        server  127.0.0.1:9200 weight=1;  
} 

其中weight=1表示權重,用於後端服務器性能不均的情況,訪問比率約等於權重之比,權重越大訪問機會越多;
upstream是配置nginx與後端服務器負載均衡非常重要的一個模塊,並且它還能對後端的服務器的健康狀態進行檢查,若後端服務器中的一臺發生故障,則前端的請求不會轉發到該故障的機器;
第二步:在server模塊裏添加:(舉例)

location /myweb {
    proxy_pass http://www.myweb.com;
}

其中 www.myweb.com 字符串要和 upstream 後面的字符串相等;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章