1、JAVA中的幾種基本數(shù)據(jù)類型是什么,各自占用多少字節(jié)。
2、String類能被繼承嗎,為什么
不能。在Java中,只要是被定義為final的類,也可以說是被final修飾的類,就是不能被繼承的。
3、String,Stringbuffer,StringBuilder的區(qū)別。
4、ArrayList和linkedList有什么區(qū)別。
簡(jiǎn)單的區(qū)別:
(1)ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),linkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。(linkedList是雙向鏈表,有next也有previous)
(2)對(duì)于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于linkedList,因?yàn)閘inkedList要移動(dòng)指針。
(3)對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)。
深度的區(qū)別:
(1)對(duì)ArrayList和linkedList而言,在列表末尾增加一個(gè)元素所花的開銷都是固定的。對(duì)ArrayList而言,主要是在內(nèi)部數(shù)組中增加一項(xiàng),指向所添加的元素,偶爾可能會(huì)導(dǎo)致對(duì)數(shù)組重新進(jìn)行分配;而對(duì)linkedList而言,這個(gè)開銷是統(tǒng)一的,分配一個(gè)內(nèi)部Entry對(duì)象。
(2)在ArrayList的中間插入或刪除一個(gè)元素意味著這個(gè)列表中剩余的元素都會(huì)被移動(dòng);而在linkedList的中間插入或刪除一個(gè)元素的開銷是固定的。
(3)linkedList不支持高效的隨機(jī)元素訪問。
(4)ArrayList的空間浪費(fèi)主要體現(xiàn)在在list列表的結(jié)尾預(yù)留一定的容量空間,而linkedList的空間花費(fèi)則體現(xiàn)在它的每一個(gè)元素都需要消耗相當(dāng)?shù)目臻g
5、講講類的實(shí)例化順序。
問題:比如父類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù),字段,子類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù),字段,當(dāng)new的時(shí)候,他們的執(zhí)行順序。
答案:類加載器實(shí)例化時(shí)進(jìn)行的操作步驟(加載–>連接->初始化)。父類靜態(tài)變量、父類靜態(tài)代碼塊、子類靜態(tài)變量、子類靜態(tài)代碼塊、父類非靜態(tài)變量(父類實(shí)例成員變量)、父類構(gòu)造函數(shù)、子類非靜態(tài)變量(子類實(shí)例成員變量)、子類構(gòu)造函數(shù)。
6、用過哪些Map類,都有什么區(qū)別。
問題:比如HashMap是線程安全的嗎,并發(fā)下使用的Map是什么,他們內(nèi)部原理分別是什么,比如存儲(chǔ)方式,hashcode,擴(kuò)容,默認(rèn)容量等。答案:不安全,并發(fā)下使用ConcurrentHashMap。
7、JAVA8的ConcurrentHashMap為什么放棄了分段鎖?
原因:通過JDK的源碼和官方文檔看來,他們認(rèn)為的棄用分段鎖的原因由以下幾點(diǎn):1、加入多個(gè)分段鎖浪費(fèi)內(nèi)存空間。2、生產(chǎn)環(huán)境中,map在放入時(shí)競(jìng)爭(zhēng)同一個(gè)鎖的概率非常小,分段鎖反而會(huì)造成更新等操作的長(zhǎng)時(shí)間等待。3、為了提高GC的效率
既然棄用了分段鎖,那么一定由新的線程安全方案,我們來看看源碼是怎么解決線程安全的呢?CAS
首先通過hash找到對(duì)應(yīng)鏈表過后,查看是否是第一個(gè)object,如果是,直接用cas原則插入,無需加鎖,然后如果不是鏈表第一個(gè)object,則直接用鏈表第一個(gè)object加鎖,這里加的鎖是synchronized,雖然效率不如ReentrantLock,但節(jié)約了空間,這里會(huì)一直用第一個(gè)object為鎖,直到重新計(jì)算map大小,比如擴(kuò)容或者操作了第一個(gè)object為止。
8、ConcurrentHashMap(JDK1.8)為什么要使用synchronized而不是如ReentranLock這樣的可重入鎖?
可以從下面幾個(gè)方面講述:鎖的粒度首先鎖的粒度并沒有變粗,甚至變得更細(xì)了。每當(dāng)擴(kuò)容一次,ConcurrentHashMap的并發(fā)度就擴(kuò)大一倍。Hash沖突JDK1.7中,ConcurrentHashMap從過二次hash的方式(Segment->HashEntry)能夠快速的找到查找的元素。在1.8中通過鏈表加紅黑樹的形式彌補(bǔ)了put、get時(shí)的性能差距。擴(kuò)容JDK1.8中,在ConcurrentHashmap進(jìn)行擴(kuò)容時(shí),其他線程可以通過檢測(cè)數(shù)組中的節(jié)點(diǎn)決定是否對(duì)這條鏈表(紅黑樹)進(jìn)行擴(kuò)容,減小了擴(kuò)容的粒度,提高了擴(kuò)容的效率。
為什么是synchronized,而不是可重入鎖
減少內(nèi)存開銷假設(shè)使用可重入鎖來獲得同步支持,那么每個(gè)節(jié)點(diǎn)都需要通過繼承AQS來獲得同步支持。但并不是每個(gè)節(jié)點(diǎn)都需要獲得同步支持的,只有鏈表的頭節(jié)點(diǎn)(紅黑樹的根節(jié)點(diǎn))需要同步,這無疑帶來了巨大內(nèi)存浪費(fèi)。
獲得JVM的支持可重入鎖畢竟是API這個(gè)級(jí)別的,后續(xù)的性能優(yōu)化空間很小。synchronized則是JVM直接支持的,JVM能夠在運(yùn)行時(shí)作出相應(yīng)的優(yōu)化措施:鎖粗化、鎖消除、鎖自旋等等。這就使得synchronized能夠隨著JDK版本的升級(jí)而不改動(dòng)代碼的前提下獲得性能上的提升。
9、有沒有有順序的Map實(shí)現(xiàn)類,如果有,他們是怎么保證有序的。
Hashmap和Hashtable都不是有序的。TreeMap和linkedHashmap都是有序的。(TreeMap默認(rèn)是key升序,linkedHashmap默認(rèn)是數(shù)據(jù)插入順序)TreeMap是基于比較器Comparator來實(shí)現(xiàn)有序的。linkedHashmap是基于鏈表來實(shí)現(xiàn)數(shù)據(jù)插入有序的。
10、抽象類和接口的區(qū)別,類可以繼承多個(gè)類么,接口可以繼承多個(gè)接口么,類可以實(shí)現(xiàn)多個(gè)接口么。
區(qū)別:1、抽象類和接口都不能直接實(shí)例化,如果要實(shí)例化,抽象類變量必須指向?qū)崿F(xiàn)所有抽象方法的子類對(duì)象,接口變量必須指向?qū)崿F(xiàn)所有接口方法的類對(duì)象。2、抽象類要被子類繼承,接口要被類實(shí)現(xiàn)。3、接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實(shí)現(xiàn)4、接口里定義的變量只能是公共的靜態(tài)的常量,抽象類中的變量是普通變量。5、抽象類里的抽象方法必須全部被子類所實(shí)現(xiàn),如果子類不能全部實(shí)現(xiàn)父類抽象方法,那么該子類只能是抽象類。同樣,一個(gè)實(shí)現(xiàn)接口的時(shí)候,如不能全部實(shí)現(xiàn)接口方法,那么該類也只能為抽象類。6、抽象方法只能申明,不能實(shí)現(xiàn)。abstract void abc();不能寫成abstract void abc(){}。7、抽象類里可以沒有抽象方法8、如果一個(gè)類里有抽象方法,那么這個(gè)類只能是抽象類9、抽象方法要被實(shí)現(xiàn),所以不能是靜態(tài)的,也不能是私有的。10、接口可繼承接口,并可多繼承接口,但類只能單根繼承。
類不能繼承多個(gè)類接口可以繼承多個(gè)接口類可以實(shí)現(xiàn)多個(gè)接口
以上就是深圳達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java基礎(chǔ)部分組成27個(gè)知識(shí)點(diǎn)”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。