什么是死鎖(deadlock)?
兩個(gè)進(jìn)程都在等待對(duì)方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時(shí)候就發(fā)生了死鎖。結(jié)果就是兩個(gè)進(jìn)程都陷入了無(wú)限的等待中。
代碼表示:
代碼描述:
publicclassDieLockDemo{publicstaticvoidmain(String[]args){DieLockdl1=newDieLock(true);DieLockdl2=newDieLock(false);?dl1.start();?dl2.start();}}
*...理想狀態(tài)下dl1線程為true從if執(zhí)行先打出"ifobjA"然后再接著打出"ifobjB"之后釋放A、B的鎖對(duì)象,之后dl2線程執(zhí)行else語(yǔ)句打出"elseobjB","elseobjA"。
非理想狀態(tài)下dl1先打出"ifobjA",之后線程dl2執(zhí)行打出"elseobjB",然后1、2線程的鎖對(duì)象A和B都處于被鎖的狀態(tài),兩個(gè)線程爭(zhēng)奪鎖對(duì)象發(fā)生死鎖現(xiàn)象。..*
publicclassDieLockextendsThread{? ? privatebooleanflag;? ? publicDieLock(booleanflag){? ? this.flag=flag;? ? }? ? @Override? ? publicvoidrun(){? ? if(flag){? ? synchronized(MyLock.objA){? ? System.out.println("ifobjA");? ? synchronized(MyLock.objB){? ? System.out.println("ifobjB");? ? }? ? }? ? }else{? ? synchronized(MyLock.objB){? ? System.out.println("elseobjB");? ? synchronized(MyLock.objA){? ? System.out.println("elseobjA");? ? }? ? }? ? }? ? }? ? }
如何確保N個(gè)線程可以訪問(wèn)N個(gè)資源同時(shí)又不導(dǎo)致死鎖?
使用多線程的時(shí)候,一種非常簡(jiǎn)單的避免死鎖的方式就是:指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會(huì)出現(xiàn)死鎖了。
Java集合類框架的基本接口有哪些?
Java集合類提供了一套設(shè)計(jì)良好的支持對(duì)一組對(duì)象進(jìn)行操作的接口和類。Java集合類里面最基本的接口有:
Collection:代表一組對(duì)象,每一個(gè)對(duì)象都是它的子元素。
Set:不包含重復(fù)元素的Collection。
List:有順序的collection,并且可以包含重復(fù)元素。
Map:可以把鍵(key)映射到值(value)的對(duì)象,鍵不能重復(fù)。
什么是迭代器(Iterator)?
Iterator接口提供了很多對(duì)集合元素進(jìn)行迭代的方法。每一個(gè)集合類都包含了可以返回迭代器實(shí)例的迭代方法。迭代器可以在迭代的過(guò)程中刪除底層集合的元素。
Iterator和ListIterator的區(qū)別是什么?
下面列出了他們的區(qū)別:
Iterator可用來(lái)遍歷Set和List集合,但是ListIterator只能用來(lái)遍歷List。
Iterator對(duì)集合只能是前向遍歷,ListIterator既可以前向也可以后向。
ListIterator實(shí)現(xiàn)了Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個(gè)和后一個(gè)元素的索引,等等。
Java中的HashMap的工作原理是什么?
Java中的HashMap是以鍵值對(duì)(key-value)的形式存儲(chǔ)元素的。HashMap需要一個(gè)hash函數(shù),它使用hashCode()和equals()方法來(lái)向集合/從集合添加和檢索元素。當(dāng)調(diào)用put()方法的時(shí)候,HashMap會(huì)計(jì)算key的hash值,然后把鍵值對(duì)存儲(chǔ)在集合中合適的索引上。如果key已經(jīng)存在了,value會(huì)被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負(fù)載因子(loadfactor)和擴(kuò)容極限(thresholdresizing)。
HashMap和Hashtable有什么區(qū)別?
HashMap和Hashtable都實(shí)現(xiàn)了Map接口,因此很多特性非常相似。但是,他們有以下不同點(diǎn):
HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更適合于單線程環(huán)境,而Hashtable適合于多線程環(huán)境。
HashMap提供了可供應(yīng)用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對(duì)鍵的列舉(Enumeration)。
o一般認(rèn)為Hashtable是一個(gè)遺留的類。
數(shù)組(Array)和列表(ArrayList)有什么區(qū)別?什么時(shí)候應(yīng)該使用Array而不是ArrayList?
下面列出了Array和ArrayList的不同點(diǎn):
Array可以包含基本類型和對(duì)象類型,ArrayList只能包含對(duì)象類型。
Array大小是固定的,ArrayList的大小是動(dòng)態(tài)變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對(duì)于基本類型數(shù)據(jù),集合使用自動(dòng)裝箱來(lái)減少編碼工作量。但是,當(dāng)處理固定大小的基本數(shù)據(jù)類型的時(shí)候,這種方式相對(duì)比較慢。
ArrayList和linkedList有什么區(qū)別?
ArrayList和linkedList都實(shí)現(xiàn)了List接口,他們有以下的不同點(diǎn):
ArrayList是基于索引的數(shù)據(jù)接口**,它的底層是數(shù)組**。它可以以O(shè)(1)時(shí)間復(fù)雜度對(duì)元素進(jìn)行隨機(jī)訪問(wèn)。與此對(duì)應(yīng),linkedList是以元素鏈表的形式存儲(chǔ)它的數(shù)據(jù),每一個(gè)元素都和它的前一個(gè)和后一個(gè)元素鏈接在一起,在這種情況下,查找某個(gè)元素的時(shí)間復(fù)雜度是O(n)。
相對(duì)于ArrayList,linkedList的插入,添加,刪除操作速度更快,因?yàn)楫?dāng)元素被添加到集合任意位置的時(shí)候,不需要像數(shù)組那樣重新計(jì)算大小或者是更新索引。
linkedList比ArrayList更占內(nèi)存,因?yàn)閘inkedList為每一個(gè)節(jié)點(diǎn)存儲(chǔ)了兩個(gè)引用,一個(gè)指向前一個(gè)元素,一個(gè)指向下一個(gè)元素。
也可以參考ArrayListvs.linkedList。
以上就是北大青鳥(niǎo)長(zhǎng)沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“2020年Java經(jīng)典企業(yè)筆試題”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
Java筆試題