更新時間:2019-08-09 14:25:55 來源:動力節(jié)點 瀏覽3125次
一、String,StringBuffer,StringBuilder的區(qū)別是什么?String為什么是不可變的?
1.String是字符串常量,StringBuffer和StringBuilder是字符串變量。StringBuffer是線程安全的,StringBuilder是非線程安全的。具體來說String是一個不可變的對象,每次修改String對象實際上是創(chuàng)新新對象,并將引用指向新對象。效率很低。StringBuffer
是可變的,即每次修改只是針對其本身,大部分情況下比String效率高,StringBuffer保證同步(synchronized),所以線程安全。StringBuilder沒有實現(xiàn)同步,所以非線程安全。但效率應(yīng)該比StringBuffer高。StringBuffer使用時最好指定容量,這樣會比不指定容量快30%-40%,甚至比不指定容量的StringBuilder還快。
二、VECTOR,ARRAYLIST,LINKEDLIST的區(qū)別是什么?
vector是同步的,arraylist和linkedlist不是同步的。底層方面,vector與arraylist都是基于object[]array實現(xiàn)的,但考慮vector線程安全,所以arraylist效率上回比vector較快。元素隨機訪問上,vector與arraylist是基本相同的,時間復(fù)雜度是O(1),linkedlist的隨機訪問元素的復(fù)雜度為O(n)。但在插入刪除數(shù)據(jù)上,linkedlist則比arraylist要快很多。linkedlist比arraylist更占內(nèi)存,因為linkedlist每個節(jié)點上還要存儲對前后兩個節(jié)點的引用。
三、HASHTABLE,HASHMAP,TreeMap區(qū)別
Hashmap和HashTable都實現(xiàn)了Map接口,但HashTable是線程安全的,HashMap是非線程安全的。HashMap中允許key-value值均為null,但HashTable則不允許。HashMap適合單線程,HashTable適合多線程。HashTAble中的hash數(shù)字默認大小是11,增加方式為old*2+1,HashMap中的hash默認大小為16,且均為2的指數(shù)。TreeMap則可以將保持的數(shù)據(jù)根據(jù)key值進行排列,可以按照指定的排序方式。默認為升序。
四、ConcurrentHashMap和HashTable的區(qū)別
兩者均應(yīng)用于多線程中,但當(dāng)HashTable增大到一定程度時,其性能會急劇下降。因為迭代時會被鎖很長時間。但ConcurrentHashMap則通過引入分割來保證鎖的個數(shù)不會很大。簡而言之就是HashTable會鎖住真?zhèn)€map,而ConcurrentHashMap則只需要鎖住map的一個部分。
五、Tomcat,apache,jboss的區(qū)別
Tomcat是servlet容器,用于解析jsp,servlet。是一個輕量級的高效的容器;缺點是不支持EJB,只能用于Java應(yīng)用。
Apache是http服務(wù)器(web服務(wù)器),類似于IIS可以用來建立虛擬站點,編譯處理靜態(tài)頁面。支持SSL技術(shù),支持多個虛擬主機等功能。
Jboss是應(yīng)用服務(wù)器,運行EJB的javaee應(yīng)用服務(wù)器,遵循javaee規(guī)范,能夠提供更多平臺的支持和更多集成功能,如數(shù)據(jù)庫連接,JCA等。其對servlet的支持是通過集成其他servlet容器來實現(xiàn)的。如tomcat。
六、GETPOST區(qū)別
get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器發(fā)送數(shù)據(jù)。
get是把參數(shù)數(shù)據(jù)隊列加到提交表單的action屬性所指的URL中,值和表單內(nèi)各個字段一一對應(yīng),在url中可以看到。post是通過HTTPpost機制,將表單內(nèi)各個字段與其內(nèi)容放置在htmlheader內(nèi)一起傳送到action屬性所指的url地址。
對于get方式,服務(wù)區(qū)端用request.QueryString獲取變量值,對于post方式,服務(wù)器端用request.Form獲取提交的數(shù)據(jù)。get傳送的數(shù)據(jù)量較小,post較大,一般不受限制。get安全性比post要低,但執(zhí)行效率較高。
七、SESSION,COOKIE區(qū)別
session數(shù)據(jù)放在服務(wù)器上,cookie則放在客戶瀏覽器上。cookie不太安全,因為可以分析出本地cookie,并進行cookie欺騙,考慮安全應(yīng)使用session。session會在一定時間內(nèi)保存在服務(wù)器上,當(dāng)訪問增多時,會比較占用服務(wù)器的性能,考慮減輕服務(wù)器壓力則應(yīng)該使用cookie。單個cookie保持的數(shù)據(jù)不超過4k,很多瀏覽器都限制要給站點最多保存20個cookie。
八、Servlet的生命周期
主要分三個階段:初始化——調(diào)用init()方法,響應(yīng)客戶請求階段——調(diào)用service()方法,終止階段——調(diào)用destroy方法。工作原理:客戶發(fā)送一個請求,servlet調(diào)用service方法對請求進行響應(yīng),即對請求方式進行匹配,選擇調(diào)用doGet、doPost方法等,然后進入對于的方法中調(diào)用邏輯層的方法,實現(xiàn)對客戶的響應(yīng)。自定義的servlet必須首先servlet接口。
具體生命周期包括:裝載Servlet、服務(wù)器創(chuàng)建Servlet實例、服務(wù)器調(diào)用Servlet的init()方法、客戶請求到達服務(wù)器、服務(wù)器創(chuàng)建請求對象、服務(wù)創(chuàng)建相應(yīng)對象、服務(wù)器激活Servlet的service方法,請求對象和響應(yīng)對象作為service()方法的參數(shù)、service()方法獲得關(guān)于請求對象的信息,處理請求,訪問其他資源,獲得需要的信息、service()方法可能激活其他方法以處理請求,如doGet(),doPost()
九、Statement與PreparedStatement的區(qū)別,什么是SQL注入,如何防止SQL注入
使用PreparedStatement可以提升代碼的可讀性和可維護性,可以盡最大可能提高性能。因為Statement每次執(zhí)行一個SQL命令都會對其編譯,但PreparedStatement則只編譯一次。PreparedStatement就類似于流水線生產(chǎn)。另一方面PreparedStatement可以極大提高安全性:它對傳遞過來的參數(shù)進行了強制參數(shù)類型轉(zhuǎn)換,確保插入或查詢數(shù)據(jù)時,與底層數(shù)據(jù)庫格式匹配。
SQL注入:就是通過將sql命令插入到web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務(wù)器執(zhí)行惡意SQL命令。如sql命令:selectidfromtestwherename='1'or1=1;droptabletest,但用PreparedStatement就可以避免這種問題。
十、redirect,forward區(qū)別
redirect:服務(wù)器根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址。所以地址欄顯示是新的url。forward是指服務(wù)器請求資源,直接訪問目標(biāo)地址url,把響應(yīng)的內(nèi)容讀取過來并再發(fā)送給瀏覽器,瀏覽器并不知道資源從哪里來,所以地址欄不變。
redirect不能共享數(shù)據(jù),forward轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到頁面可以貢獻request中的數(shù)據(jù)。redirect用于注銷,forward用于登陸。forward效率高于redirect。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743