更新時(shí)間:2020-05-13 11:37:22 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2437次
HashTable與HashMap的區(qū)別
1)同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的。
2)HashMap允許存在一個(gè)為null的key,多個(gè)為null的value。
3)hashtable的key和value都不允許為null。
如何解決HashMap的線程不安全問題
1)替換成Hashtable,Hashtable通過對(duì)整個(gè)表上鎖實(shí)現(xiàn)線程安全,因此效率比較低
2)使用Collections類的synchronizedMap方法包裝一下。方法如下:
publicstatic<K,V>Map<K,V>synchronizedMap(Map<K,V>m)返回由指定映射支持的同步(線程安全的)映射
3)使用ConcurrentHashMap,它使用分段鎖來保證線程安全
通過前兩種方式獲得的線程安全的HashMap在讀寫數(shù)據(jù)的時(shí)候會(huì)對(duì)整個(gè)容器上鎖,而ConcurrentHashMap并不需要對(duì)整個(gè)容器上鎖,它只需要鎖住要修改的部分就行了
Collection和Collections的區(qū)別
Collection是java.util下的接口,它是各種集合的父接口,繼承于它的接口主要有Set和List;Collections是個(gè)java.util下的類,是針對(duì)集合的幫助類,提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程安全化等操作。
List、Map、Set三個(gè)接口,存取元素時(shí),各有什么特點(diǎn)
List以特定次序來持有元素,可有重復(fù)元素。
Set無法擁有重復(fù)元素,內(nèi)部排序。
Map保存key-value值,value可多值。
Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢?是用==還是equals()?它們有何區(qū)別?
Set里的元素是不能重復(fù)的,用equals()方法來區(qū)分重復(fù)與否。
覆蓋equals()方法用來判斷對(duì)象的內(nèi)容是否相同,而”==”判斷地址是否相等,用來決定引用值是否指向同一對(duì)象。
TreeMap和TreeSet在排序時(shí)如何比較元素?Collections工具類中的sort()方法如何比較元素
TreeSet要求存放的對(duì)象所屬的類必須實(shí)現(xiàn)Comparable接口,該接口提供了比較元素的compareTo()方法,當(dāng)插入元素時(shí)會(huì)回調(diào)該方法比較元素的大小。TreeMap要求存放的鍵值對(duì)映射的鍵必須實(shí)現(xiàn)Comparable接口從而根據(jù)鍵對(duì)元素進(jìn)行排序。Collections工具類的sort方法有兩種重載的形式,第一種要求傳入的待排序容器中存放的對(duì)象比較實(shí)現(xiàn)Comparable接口以實(shí)現(xiàn)元素的比較;第二種不強(qiáng)制性的要求容器中的元素必須可比較,但是要求傳入第二個(gè)參數(shù),參數(shù)是Comparator接口的子類型(需要重寫compare方法實(shí)現(xiàn)元素的比較),相當(dāng)于一個(gè)臨時(shí)定義的排序規(guī)則,其實(shí)就是是通過接口注入比較元素大小的算法,也是對(duì)回調(diào)模式的應(yīng)用。
實(shí)現(xiàn)類:HashMap、Hashtable、LinkedHashMap和TreeMap
HashMap是最常用的Map,它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時(shí),取得數(shù)據(jù)的順序是完全隨機(jī)的。因?yàn)殒I對(duì)象不可以重復(fù),所以HashMap最多只允許一條記錄的鍵為Null,允許多條記錄的值為Null,是非同步的。
Hashtable與HashMap類似,是HashMap的線程安全版,它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫Hashtable,因此也導(dǎo)致了Hashtale在寫入時(shí)會(huì)比較慢,它繼承自Dictionary類,不同的是它不允許記錄的鍵或者值為null,同時(shí)效率較低。
ConcurrentHashMap,線程安全,并且鎖分離。ConcurrentHashMap內(nèi)部使用段(Segment)來表示這些不同的部分,每個(gè)段其實(shí)就是一個(gè)小的hashtable,它們有自己的鎖。只要多個(gè)修改操作發(fā)生在不同的段上,它們就可以并發(fā)進(jìn)行。
LinkedHashMap保存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時(shí),先得到的記錄肯定是先插入的,在遍歷的時(shí)候會(huì)比HashMap慢,有HashMap的全部特性。
TreeMap實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序(自然順序),也可以指定排序的比較器,當(dāng)用Iterator遍歷TreeMap時(shí),得到的記錄是排過序的。不允許key值為空,非同步的。
ArrayList擴(kuò)容機(jī)制【必考】
1)發(fā)生擴(kuò)容的條件:
根據(jù)傳入的最小需要容量minCapacity來和數(shù)組的容量長度對(duì)比,若minCapactity大于或等于數(shù)組容量,則需要進(jìn)行擴(kuò)容。(如果實(shí)際存儲(chǔ)數(shù)組是空數(shù)組,則最小需要容量就是默認(rèn)容量)
2)實(shí)現(xiàn)擴(kuò)容:
jdk7中采用>>位運(yùn)算,右移動(dòng)一位。容量相當(dāng)于擴(kuò)大了1.5倍;
3)舉例說明:添加20個(gè)元素到ArrayList中
當(dāng)?shù)谝淮尾迦朐貢r(shí)才分配10(默認(rèn))個(gè)對(duì)象空間。之后擴(kuò)容會(huì)按照1.5倍增長。
也就是當(dāng)添加第11個(gè)數(shù)據(jù)的時(shí)候,Arraylist繼續(xù)擴(kuò)容變?yōu)?0*1.5=15;
當(dāng)添加第16個(gè)數(shù)據(jù)時(shí),繼續(xù)擴(kuò)容變?yōu)?5*1.5=22個(gè)
Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用
當(dāng)JAVA程序違反了JAVA的語義規(guī)則時(shí),JAVA虛擬機(jī)就會(huì)將發(fā)生的錯(cuò)誤表示為一個(gè)異常。違反語義規(guī)則包括2種情況。一種是JAVA類庫內(nèi)置的語義檢查。例如數(shù)組下標(biāo)越界,會(huì)引發(fā)IndexOutOfBoundsException;訪問null的對(duì)象時(shí)會(huì)引發(fā)NullPointerException。另一種情況就是JAVA允許程序員擴(kuò)展這種語義檢查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時(shí)用throw關(guān)鍵字引發(fā)異常。所有的異常都是java.lang.Thowable的子類。

以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“大家都在找的Java工程師筆試題目”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)