前言
大白話(huà)講面試題,每天更新三題,提倡每日積累而不是臨陣磨槍?zhuān)业哪康牟皇菫榱吮愁},而是通過(guò)這種方式來(lái)更好的鞏固自身所掌握的知識(shí)。
題目的星星代表難度等級(jí),五星為滿(mǎn),并且我會(huì)列出需要掌握的前置知識(shí)。
大家一起,沖鴨!
Java 面向?qū)ο笥心男┨卣鳎?
目的:了解你的基礎(chǔ),有些人干了三年都有可能答不好或答不出這個(gè)問(wèn)題。
回答這題你還需要理解:什么是面向?qū)ο?,什么是?lèi),什么是對(duì)象,他們之間的關(guān)系。
- 封裝
- 繼承
- 多態(tài)
封裝隱藏了類(lèi)的內(nèi)部實(shí)現(xiàn)機(jī)制,可以在不影響使用的情況下改變類(lèi)的內(nèi)部結(jié)構(gòu),同時(shí)也保護(hù)了數(shù)據(jù)。對(duì)外界來(lái)說(shuō),它的內(nèi)部細(xì)節(jié)是隱藏的,暴露給外界的只是它的訪(fǎng)方法。
對(duì)于一個(gè)類(lèi)來(lái)說(shuō),封裝了自己的屬性和方法,想要訪(fǎng)問(wèn)屬性的值,只能通過(guò)事先寫(xiě)好的方法去訪(fǎng)問(wèn),可以通過(guò)控制方法的邏輯來(lái)限制對(duì)屬性的不合理操作;同時(shí),方法的封裝可以讓調(diào)用者不必關(guān)心方法的內(nèi)部實(shí)現(xiàn)邏輯,便于使用便于修改。
繼承是從已有類(lèi)中派生出新的類(lèi),新的類(lèi)繼承了已有類(lèi)的屬性和方法,并且可以擴(kuò)展新的能力。
派生出來(lái)的類(lèi)叫子類(lèi)(或派生類(lèi)),原有類(lèi)叫父類(lèi)(或基類(lèi));比如經(jīng)典的 Animal 和 Cat,Dog,由 Animal 類(lèi)派生出貓和狗,他們有共同的特征是跑跳叫,但狗可以擴(kuò)展自己的動(dòng)作,比如吃屎……
多態(tài)是指兩個(gè)類(lèi)由繼承關(guān)系,存在有方法的重寫(xiě),故而可以在調(diào)用時(shí)有父類(lèi)引用指向子類(lèi)對(duì)象。比如 Animal animal = new Dog。
ArrayList 和 LinkedList 之間有什么區(qū)別??
目的:考察數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),以及對(duì)基礎(chǔ)集合有沒(méi)有比較深入的了解,這個(gè)題目是一個(gè)很經(jīng)典的對(duì)比。
回答這題你還需要理解:數(shù)組和鏈表,他們的特點(diǎn)、特性、原理等。
ArrayList 和 LinkedList 都實(shí)現(xiàn)了 List 接口,他們之間有以下的不同點(diǎn):
- 底層數(shù)據(jù)結(jié)構(gòu)上:前者底層使用了數(shù)組;后者使用了鏈表,因此后者所占用的內(nèi)存空間要更大一些,因?yàn)橐鎯?chǔ)前后節(jié)點(diǎn)的位置。
- 效率上:前者使用索引訪(fǎng)問(wèn)數(shù)據(jù),取數(shù)賊快,但插入和刪除需要移動(dòng)后面的數(shù)據(jù),效率較慢;后者由于鏈表的特性,插入和刪除特別快,但查詢(xún)需要從頭開(kāi)始遍歷,效率較慢。
線(xiàn)程安全的集合類(lèi)都有哪些????
目的:考察多線(xiàn)程方面的基礎(chǔ),往往以這個(gè)問(wèn)題為入口,越問(wèn)越深
回答這題你還需要理解:關(guān)鍵字 synchronized、volatile,什么是 CAS(容易被追問(wèn))。
第一代線(xiàn)程安全集合類(lèi):
- Vector(Since: JDK1.0)
- Hashtable(Since: JDK1.0)
底層使用 synchronized 關(guān)鍵字來(lái)保障線(xiàn)程安全,效率低下。
第二代集合類(lèi):
- ArrayList(Since: JDK1.2)
- HashMap(Since: JDK1.2)
那如果需要線(xiàn)程安全怎么辦呢?
在寫(xiě)這兩個(gè)集合類(lèi)的時(shí)候,作者還寫(xiě)了一個(gè) Collections 集合工具類(lèi),比如 Collections.synchronizedListCollections(List<T> list) 就可以創(chuàng)建一個(gè)線(xiàn)程安全的 List 對(duì)象,底層任然使用的是關(guān)鍵字synchronized ,但由于鎖的是方法,性能上有一定提升。
第三代線(xiàn)程安全集合類(lèi):
從 JDK1.5 開(kāi)始,引入了包 java.util.concurrent.* ,JUC 中多數(shù)類(lèi)是通過(guò) volatile關(guān)鍵字和 CAS 來(lái)實(shí)現(xiàn),線(xiàn)程安全且高效。
在這個(gè)包下的所有集合類(lèi)都是線(xiàn)程安全的,比如常用的 ConcurrentHashMap。
引用
在這里我會(huì)放上所有我參考的資料鏈接