List和Set比較,各自的子類(lèi)比較
對(duì)比一:Arraylist與linkedList的比較
1、ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),因?yàn)榈刂愤B續(xù),一旦數(shù)據(jù)存儲(chǔ)好了,查詢(xún)操作效率會(huì)比較高(在內(nèi)存里是連著放的)。
2、因?yàn)榈刂愤B續(xù),ArrayList要移動(dòng)數(shù)據(jù),所以插入和刪除操作效率比較低。
3、linkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu),地址是任意的,所以在開(kāi)辟內(nèi)存空間的時(shí)候不需要等一個(gè)連續(xù)的地址,對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì)。
4、因?yàn)閘inkedList要移動(dòng)指針,所以查詢(xún)操作性能比較低。
適用場(chǎng)景分析:
當(dāng)需要對(duì)數(shù)據(jù)進(jìn)行對(duì)此訪問(wèn)的情況下選用ArrayList,當(dāng)需要對(duì)數(shù)據(jù)進(jìn)行多次增加刪除修改時(shí)采用linkedList。
對(duì)比二:ArrayList與Vector的比較
1、Vector的方法都是同步的,是線程安全的,而ArrayList的方法不是,由于線程的同步必然要影響性能。因此,ArrayList的性能比Vector好。
2、當(dāng)Vector或ArrayList中的元素超過(guò)它的初始大小時(shí),Vector會(huì)將它的容量翻倍,而ArrayList只增加50%的大小,這樣。ArrayList就有利于節(jié)約內(nèi)存空間。
3、大多數(shù)情況不使用Vector,因?yàn)樾阅懿缓?,但是它支持線程的同步,即某一時(shí)刻只有一個(gè)線程能夠?qū)慥ector,避免多線程同時(shí)寫(xiě)而引起的不一致性。
4、Vector可以設(shè)置增長(zhǎng)因子,而ArrayList不可以。
適用場(chǎng)景分析:
1、Vector是線程同步的,所以它也是線程安全的,而ArrayList是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用ArrayList效率比較高。
2、如果集合中的元素的數(shù)目大于目前集合數(shù)組的長(zhǎng)度時(shí),在集合中使用數(shù)據(jù)量比較大的數(shù)據(jù),用Vector有一定的優(yōu)勢(shì)。
對(duì)比三:HashSet與TreeSet的比較
1.TreeSet是二叉樹(shù)實(shí)現(xiàn)的,Treeset中的數(shù)據(jù)是自動(dòng)排好序的,不允許放入null值。
2.HashSet是哈希表實(shí)現(xiàn)的,HashSet中的數(shù)據(jù)是無(wú)序的,可以放入null,但只能放入一個(gè)null,兩者中的值都不能重復(fù),就如數(shù)據(jù)庫(kù)中唯一約束。
3.HashSet要求放入的對(duì)象必須實(shí)現(xiàn)HashCode()方法,放入的對(duì)象,是以hashcode碼作為標(biāo)識(shí)的,而具有相同內(nèi)容的String對(duì)象,hashcode是一樣,所以放入的內(nèi)容不能重復(fù)。但是同一個(gè)類(lèi)的對(duì)象可以放入不同的實(shí)例。
適用場(chǎng)景分析:
HashSet是基于Hash算法實(shí)現(xiàn)的,其性能通常都優(yōu)于TreeSet。我們通常都應(yīng)該使用HashSet,在我們需要排序的功能時(shí),我們才使用TreeSet。
HashMap和ConcurrentHashMap的區(qū)別
1、HashMap不是線程安全的,而ConcurrentHashMap是線程安全的。
2、ConcurrentHashMap采用鎖分段技術(shù),將整個(gè)Hash桶進(jìn)行了分段segment,也就是將這個(gè)大的數(shù)組分成了幾個(gè)小的片段segment,而且每個(gè)小的片段segment上面都有鎖存在,那么在插入元素的時(shí)候就需要先找到應(yīng)該插入到哪一個(gè)片段segment,然后再在這個(gè)片段上面進(jìn)行插入,而且這里還需要獲取segment鎖。
3、ConcurrentHashMap讓鎖的粒度更精細(xì)一些,并發(fā)性能更好。
至于兩者的底層實(shí)現(xiàn),你如果想通過(guò)一篇文章就理解了,那就tooyoung了,好好找些博文+看源碼去吧。
HashTable和ConcurrentHashMap的區(qū)別
它們都可以用于多線程的環(huán)境,但是當(dāng)Hashtable的大小增加到一定的時(shí)候,性能會(huì)急劇下降,因?yàn)榈鷷r(shí)需要被鎖定很長(zhǎng)的時(shí)間。因?yàn)镃oncurrentHashMap引入了分割(segmentation),不論它變得多么大,僅僅需要鎖定map的某個(gè)部分,而其它的線程不需要等到迭代完成才能訪問(wèn)map。簡(jiǎn)而言之,在迭代的過(guò)程中,ConcurrentHashMap僅僅鎖定map的某個(gè)部分,而Hashtable則會(huì)鎖定整個(gè)map。
String,StringBuffer和StringBuilder的區(qū)別
1、運(yùn)行速度,或者說(shuō)是執(zhí)行速度,在這方面運(yùn)行速度快慢為:StringBuilder>StringBuffer>String。
2、線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的。
適用場(chǎng)景分析:
String:適用于少量的字符串操作的情況
StringBuilder:適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
StringBuffer:適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
wait和sleep的區(qū)別
1、sleep()方法是屬于Thread類(lèi)中的,而wait()方法,則是屬于Object類(lèi)中的。
2、sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間,讓出cpu給其他線程,但是他的監(jiān)控狀態(tài)依然保持著,當(dāng)指定的時(shí)間到了又會(huì)自動(dòng)恢復(fù)運(yùn)行狀態(tài)。所以在調(diào)用sleep()方法的過(guò)程中,線程不會(huì)釋放對(duì)象鎖。
3、調(diào)用wait()方法的時(shí)候,線程會(huì)放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象調(diào)用notify()方法后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲取對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。
JVM的內(nèi)存結(jié)構(gòu)
根據(jù)JVM規(guī)范,JVM內(nèi)存共分為虛擬機(jī)棧、堆、方法區(qū)、程序計(jì)數(shù)器、本地方法棧五個(gè)部分。
1、Java虛擬機(jī)棧:
線程私有;每個(gè)方法在執(zhí)行的時(shí)候會(huì)創(chuàng)建一個(gè)棧幀,存儲(chǔ)了局部變量表,操作數(shù)棧,動(dòng)態(tài)連接,方法返回地址等;每個(gè)方法從調(diào)用到執(zhí)行完畢,對(duì)應(yīng)一個(gè)棧幀在虛擬機(jī)棧中的入棧和出棧。
2、堆:
線程共享;被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建,用于存放對(duì)象實(shí)例。
3、方法區(qū):
線程共享;被所有線程共享的一塊內(nèi)存區(qū)域;用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息,常量,靜態(tài)變量等。
4、程序計(jì)數(shù)器:
線程私有;是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,每條線程都要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,這類(lèi)內(nèi)存也稱(chēng)為“線程私有”的內(nèi)存。
5、本地方法棧:
線程私有;主要為虛擬機(jī)使用到的Native方法服務(wù)。
強(qiáng)引用,軟引用和弱引用的區(qū)別
強(qiáng)引用:
只有這個(gè)引用被釋放之后,對(duì)象才會(huì)被釋放掉,只要引用存在,垃圾回收器永遠(yuǎn)不會(huì)回收,這是最常見(jiàn)的New出來(lái)的對(duì)象。
軟引用:
內(nèi)存溢出之前通過(guò)代碼回收的引用。軟引用主要用戶(hù)實(shí)現(xiàn)類(lèi)似緩存的功能,在內(nèi)存足夠的情況下直接通過(guò)軟引用取值,無(wú)需從繁忙的真實(shí)來(lái)源查詢(xún)數(shù)據(jù),提升速度;當(dāng)內(nèi)存不足時(shí),自動(dòng)刪除這部分緩存數(shù)據(jù),從真正的來(lái)源查詢(xún)這些數(shù)據(jù)。
弱引用:
第二次垃圾回收時(shí)回收的引用,短時(shí)間內(nèi)通過(guò)弱引用取對(duì)應(yīng)的數(shù)據(jù),可以取到,當(dāng)執(zhí)行過(guò)第二次垃圾回收時(shí),將返回null。弱引用主要用于監(jiān)控對(duì)象是否已經(jīng)被垃圾回收器標(biāo)記為即將回收的垃圾,可以通過(guò)弱引用的isEnQueued方法返回對(duì)象是否被垃圾回收器標(biāo)記。
數(shù)組在內(nèi)存中如何分配
1、簡(jiǎn)單的值類(lèi)型的數(shù)組,每個(gè)數(shù)組成員是一個(gè)引用(指針),引用到棧上的空間(因?yàn)橹殿?lèi)型變量的內(nèi)存分配在棧上)
2、引用類(lèi)型,類(lèi)類(lèi)型的數(shù)組,每個(gè)數(shù)組成員仍是一個(gè)引用(指針),引用到堆上的空間(因?yàn)轭?lèi)的實(shí)例的內(nèi)存分配在堆上)
springmvc的核心是什么,請(qǐng)求的流程是怎么處理的,控制反轉(zhuǎn)怎么實(shí)現(xiàn)的
核心:
控制反轉(zhuǎn)和面向切面
請(qǐng)求處理流程:
1、首先用戶(hù)發(fā)送請(qǐng)求到前端控制器,前端控制器根據(jù)請(qǐng)求信息(如URL)來(lái)決定選擇哪一個(gè)頁(yè)面控制器進(jìn)行處理并把請(qǐng)求委托給它,即以前的控制器的控制邏輯部分;
2、頁(yè)面控制器接收到請(qǐng)求后,進(jìn)行功能處理,首先需要收集和綁定請(qǐng)求參數(shù)到一個(gè)對(duì)象,并進(jìn)行驗(yàn)證,然后將命令對(duì)象委托給業(yè)務(wù)對(duì)象進(jìn)行處理;處理完畢后返回一個(gè)ModelAndView(模型數(shù)據(jù)和邏輯視圖名);
3、前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進(jìn)行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;
4、前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶(hù)。
控制反轉(zhuǎn)如何實(shí)現(xiàn):
我們每次使用spring框架都要配置xml文件,這個(gè)xml配置了bean的id和class。
spring中默認(rèn)的bean為單實(shí)例模式,通過(guò)bean的class引用反射機(jī)制可以創(chuàng)建這個(gè)實(shí)例。
因此,spring框架通過(guò)反射替我們創(chuàng)建好了實(shí)例并且替我們維護(hù)他們。
A需要引用B類(lèi),spring框架就會(huì)通過(guò)xml把B實(shí)例的引用傳給了A的成員變量。
mybatis如何處理結(jié)果集
MyBatis的結(jié)果集是通過(guò)反射來(lái)實(shí)現(xiàn)的。并不是通過(guò)get/set方法。在實(shí)體類(lèi)中無(wú)論是否定義get/set()方法,都是可以接收到的。
如果面試只是考你這個(gè)點(diǎn)的話就恭喜了。如果繼續(xù)深問(wèn)流程,那就需要自己找一些源碼來(lái)閱讀了。
java的多態(tài)表現(xiàn)在哪里
主要有兩種表現(xiàn)形式:重載和重寫(xiě)
重載:
是發(fā)生在同一類(lèi)中,具有相同的方法名,主要是看參數(shù)的個(gè)數(shù),類(lèi)型,順序不同實(shí)現(xiàn)方法的重載的,返回值的類(lèi)型可以不同。
重寫(xiě):
是發(fā)生在兩個(gè)類(lèi)中(父類(lèi)和子類(lèi)),具有相同的方法名,主要看方法中參數(shù),個(gè)數(shù),類(lèi)型必須相同,返回值的類(lèi)型必須相同。
接口有什么用
1、通過(guò)接口可以實(shí)現(xiàn)不相關(guān)類(lèi)的相同行為,而不需要了解對(duì)象所對(duì)應(yīng)的類(lèi)。
2、通過(guò)接口可以指明多個(gè)類(lèi)需要實(shí)現(xiàn)的方法。
3、通過(guò)接口可以了解對(duì)象的交互界面,而不需了解對(duì)象所對(duì)應(yīng)的類(lèi)。
另:Java是單繼承,接口可以使其實(shí)現(xiàn)多繼承的功能。
說(shuō)說(shuō)http,https協(xié)議
HTTP:
是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個(gè)客戶(hù)端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP),用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。
HTTPS:
是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。
區(qū)別:
1、https協(xié)議需要到ca申請(qǐng)證書(shū),一般免費(fèi)證書(shū)較少,因而需要一定費(fèi)用。
2、http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
4、http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。
說(shuō)說(shuō)tcp/ip協(xié)議族
TCP/IP協(xié)議族是一個(gè)四層協(xié)議系統(tǒng),自底而上分別是數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。每一層完成不同的功能,且通過(guò)若干協(xié)議來(lái)實(shí)現(xiàn),上層協(xié)議使用下層協(xié)議提供的服務(wù)。
1、數(shù)據(jù)鏈路層負(fù)責(zé)幀數(shù)據(jù)的傳遞。
2、網(wǎng)絡(luò)層責(zé)數(shù)據(jù)怎樣傳遞過(guò)去。
3、傳輸層負(fù)責(zé)傳輸數(shù)據(jù)的控制(準(zhǔn)確性、安全性)
4、應(yīng)用層負(fù)責(zé)數(shù)據(jù)的展示和獲取。
tcp五層網(wǎng)絡(luò)協(xié)議
物理層:
為數(shù)據(jù)端設(shè)備提供傳送數(shù)據(jù)的通路,數(shù)據(jù)通路可以是一個(gè)物理媒體,也可以是多個(gè)物理媒體連接而成。
數(shù)據(jù)鏈路層:
為網(wǎng)絡(luò)層提供數(shù)據(jù)傳送服務(wù)。
網(wǎng)絡(luò)層:
路由選擇和中繼、激活,終止網(wǎng)絡(luò)連接、在一條數(shù)據(jù)鏈路上復(fù)用多條網(wǎng)絡(luò)連接,多采取分時(shí)復(fù)用技術(shù)、差錯(cuò)檢測(cè)與恢復(fù)、排序,流量控制、服務(wù)選擇、網(wǎng)絡(luò)管理。
傳輸層:
傳輸層是兩臺(tái)計(jì)算機(jī)經(jīng)過(guò)網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)通信時(shí),第一個(gè)端到端的層次,具有緩沖作用。
應(yīng)用層:
應(yīng)用層向應(yīng)用程序提供服務(wù)
TCP與UDP的區(qū)別
1、基于連接與無(wú)連接
2、TCP要求系統(tǒng)資源較多,UDP較少;
3、UDP程序結(jié)構(gòu)較簡(jiǎn)單
4、流模式(TCP)與數(shù)據(jù)報(bào)模式(UDP);
5、TCP保證數(shù)據(jù)正確性,UDP可能丟包
6、TCP保證數(shù)據(jù)順序,UDP不保證
cookie和session的區(qū)別,分布式環(huán)境怎么保存用戶(hù)狀態(tài)
1、cookie數(shù)據(jù)存放在客戶(hù)的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。
2、cookie不是很安全,別人可以分析存放在本地的cookie并進(jìn)行cookie欺騙,考慮到安全應(yīng)當(dāng)使用session。
3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能,考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用cookie。
4、單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。
分布式環(huán)境下的session(舉例兩種):
服務(wù)器session復(fù)制
原理:任何一個(gè)服務(wù)器上的session發(fā)生改變(增刪改),該節(jié)點(diǎn)會(huì)把這個(gè)session的所有內(nèi)容序列化,然后廣播給所有其它節(jié)點(diǎn),不管其他服務(wù)器需不需要session,以此來(lái)保證Session同步。
優(yōu)點(diǎn):可容錯(cuò),各個(gè)服務(wù)器間session能夠?qū)崟r(shí)響應(yīng)。
缺點(diǎn):會(huì)對(duì)網(wǎng)絡(luò)負(fù)荷造成一定壓力,如果session量大的話可能會(huì)造成網(wǎng)絡(luò)堵塞,拖慢服務(wù)器性能。
session共享機(jī)制
GIT和SVN的區(qū)別
1、GIT是分布式的,SVN不是。
2、GIT把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ),而SVN是按文件。
3、GIT分支和SVN的分支不同。
4、GIT沒(méi)有一個(gè)全局的版本號(hào),而SVN有。
5、GIT的內(nèi)容完整性要優(yōu)于SVN。
更多Java相關(guān)面試題,登錄長(zhǎng)沙中公優(yōu)就業(yè)IT培訓(xùn)官網(wǎng)。
Java面試題