2020年中級(jí)Java工程師筆試題

2020年中級(jí)Java工程師筆試題

長(zhǎng)沙中公優(yōu)就業(yè)      2022-04-27 01:35:01     2

2020年中級(jí)Java工程師筆試題,String str=new String(xyz);創(chuàng)建了幾個(gè)對(duì)象。答:兩個(gè)延伸:String s1="a";String s2="a";System.out.print(s1==s2);輸出是True

課程價(jià)格 請(qǐng)咨詢(xún)

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹

String str=new String("xyz");創(chuàng)建了幾個(gè)對(duì)象。

答:兩個(gè)

延伸:

String s1="a";String s2="a";System.out.print(s1==s2);輸出是True

因?yàn)椋涸蚴荍ava為了避免產(chǎn)生大量的String對(duì)象,設(shè)計(jì)了一個(gè)字符串常量池。工作原理是這樣的,創(chuàng)建一個(gè)字符串時(shí),JVM首先為檢查字符串常量池中是否有值相等的字符串,如果有,則不再創(chuàng)建,直接返回該字符串的引用地址,若沒(méi)有,則創(chuàng)建,然后放到字符串常量池中,并返回新創(chuàng)建的字符串的引用地址。

4,說(shuō)幾個(gè)你常見(jiàn)到的異常。

答:

空指針異常:NullPointerException

數(shù)組下表越界異常:ArrayIndexOutOfBoundsException

內(nèi)存不足錯(cuò)誤:java.lang.OutOfMemoryError

字符串轉(zhuǎn)換為數(shù)字異常:NumberFormatException

hashtable和hashmap的區(qū)別是什么?

答;

1)、繼承的父類(lèi)不同

Hashtable繼承自Dictionary類(lèi),而HashMap繼承自AbstractMap類(lèi)。但二者都實(shí)現(xiàn)了Map接口。

2)、線程安全性不同

javadoc中關(guān)于hashmap的一段描述如下:此實(shí)現(xiàn)不是同步的。如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)哈希映射,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了該映射,則它必須保持外部同步

Hashtable中的方法是Synchronize的

3)、是否提供contains方法

HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因?yàn)閏ontains方法容易讓人引起誤解。

Hashtable則保留了contains,containsValue和containsKey三個(gè)方法,其中contains和containsValue功能相同。

4)、key和value是否允許null值

Hashtable中,key和value都不允許出現(xiàn)null值。但是如果在Hashtable中有類(lèi)似put(null,null)的操作,編譯同樣可以通過(guò),因?yàn)閗ey和value都是Object類(lèi)型,但運(yùn)行時(shí)會(huì)拋出NullPointerException異常,這是JDK的規(guī)范規(guī)定的。

HashMap中,null可以作為鍵,這樣的鍵只有一個(gè);可以有一個(gè)或多個(gè)鍵所對(duì)應(yīng)的值為null。當(dāng)get()方法返回null值時(shí),可能是HashMap中沒(méi)有該鍵,也可能使該鍵所對(duì)應(yīng)的值為null。因此,在HashMap中不能由get()方法來(lái)判斷HashMap中是否存在某個(gè)鍵,而應(yīng)該用containsKey()方法來(lái)判斷。

5)、兩個(gè)遍歷方式的內(nèi)部實(shí)現(xiàn)上不同

Hashtable、HashMap都使用了Iterator。而由于歷史原因,Hashtable還使用了Enumeration的方式

6)、hash值不同

(另一種解釋?zhuān)?/p>

Hashtable計(jì)算hash是直接使用key的hashcode對(duì)table數(shù)組的長(zhǎng)度直接進(jìn)行取模:

int hash=key.hashCode();

int index=(hash&0x7FFFFFFF)%tab.length;

2,HashMap計(jì)算hash對(duì)key的hashcode進(jìn)行了二次hash,以獲得更好的散列值,然后對(duì)table數(shù)組長(zhǎng)度取摸:

static int hash(int h){h^=(h>>>20)^(h>>>12);return h^(h>>>7)^(h>>>4);}static int indexFor(int h,int length){return h&(length-1);})

哈希值的使用不同,HashTable直接使用對(duì)象的hashCode。而HashMap重新計(jì)算hash值。

hashCode是jdk根據(jù)對(duì)象的地址或者字符串或者數(shù)字算出來(lái)的int類(lèi)型的數(shù)值。

Hashtable計(jì)算hash值,直接用key的hashCode(),而HashMap重新計(jì)算了key的hash值,Hashtable在求hash值對(duì)應(yīng)的位置索引時(shí),用取模運(yùn)算,而HashMap在求位置索引時(shí),則用與運(yùn)算,且這里一般先用hash&0x7FFFFFFF后,再對(duì)length取模,&0x7FFFFFFF的目的是為了將負(fù)的hash值轉(zhuǎn)化為正值,因?yàn)閔ash值有可能為負(fù)數(shù),而&0x7FFFFFFF后,只有符號(hào)外改變,而后面的位都不變。

7)、內(nèi)部實(shí)現(xiàn)使用的數(shù)組初始化和擴(kuò)容方式不同

HashTable在不指定容量的情況下的默認(rèn)容量為11,而HashMap為16,Hashtable不要求底層數(shù)組的容量一定要為2的整數(shù)次冪,而HashMap則要求一定為2的整數(shù)次冪。

Hashtable擴(kuò)容時(shí),將容量變?yōu)樵瓉?lái)的2倍加1,而HashMap擴(kuò)容時(shí),將容量變?yōu)樵瓉?lái)的2倍。

Hashtable和HashMap它們兩個(gè)內(nèi)部實(shí)現(xiàn)方式的數(shù)組的初始大小和擴(kuò)容的方式。HashTable中hash數(shù)組默認(rèn)大小是11,增加的方式是old*2+1。

hashmap的底層實(shí)現(xiàn)方式是什么?

HashMap的底層通過(guò)位桶實(shí)現(xiàn),位桶里面存的是鏈表(1.7以前)或者紅黑樹(shù)(有序,1.8開(kāi)始),其實(shí)就是數(shù)組加鏈表(或者紅黑樹(shù))的格式,通過(guò)判斷hashCode定位位桶中的下標(biāo),通過(guò)equals定位目標(biāo)值在鏈表中的位置,所以如果你使用的key使用可變類(lèi)(非final修飾的類(lèi)),那么你在自定義hashCode和equals的時(shí)候一定要注意要滿(mǎn)足:如果兩個(gè)對(duì)象equals那么一定要hashCode相同,如果是hashCode相同的話不一定要求equals!所以一般來(lái)說(shuō)不要自定義hashCode和equls,推薦使用不可變類(lèi)對(duì)象做key,比如Integer、String等等。

以上就是長(zhǎng)沙中公優(yōu)就業(yè)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“2020年中級(jí)Java工程師筆試題”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。

Java筆試題

培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過(guò)大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。