成為Java頂尖程序員,先過(guò)了下面問(wèn)題!(二)

二、Java基礎(chǔ)

1.接口與抽象類的區(qū)別?
  • 接口是抽象方法的集合,一個(gè)類實(shí)現(xiàn)了某個(gè)接口,就必須實(shí)現(xiàn)接口中的所有方法。
  • 抽象類是用來(lái)描述子類的通用特性的,不能被實(shí)例化,只能作為子類的超類。
    各項(xiàng)差異對(duì)比:
參數(shù) 抽象類 接口
默認(rèn)的方法實(shí)現(xiàn) 它可以有默認(rèn)的方法實(shí)現(xiàn) 接口完全是抽象的。它根本不存在方法的實(shí)現(xiàn)
實(shí)現(xiàn) 子類使用extends關(guān)鍵字來(lái)繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實(shí)現(xiàn)。 子類使用關(guān)鍵字implements來(lái)實(shí)現(xiàn)接口。它需要提供接口中所有聲明的方法的實(shí)現(xiàn)
構(gòu)造器 抽象類可以有構(gòu)造器 接口不能有構(gòu)造器
與普通Java類的區(qū)別 除了你不能實(shí)例化抽象類之外,它和普通Java類沒(méi)有任何區(qū)別 接口是完全不同的類型
訪問(wèn)修飾符 抽象方法可以有publicprotecteddefault這些修飾符 接口方法默認(rèn)修飾符是public。你不可以使用其它修飾符。
main方法 抽象方法可以有main方法并且我們可以運(yùn)行它 接口沒(méi)有main方法,因此我們不能運(yùn)行它。
多繼承 抽象方法可以繼承一個(gè)類和實(shí)現(xiàn)多個(gè)接口 接口只可以繼承一個(gè)或多個(gè)其它接口
速度 它比接口速度要快 接口是稍微有點(diǎn)慢的,因?yàn)樗枰獣r(shí)間去尋找在類中實(shí)現(xiàn)的方法。
添加新方法 如果你往抽象類中添加新的方法,你可以給它提供默認(rèn)的實(shí)現(xiàn)。因此你不需要改變你現(xiàn)在的代碼。 如果你往接口中添加方法,那么你必須改變實(shí)現(xiàn)該接口的類。
2.Java中的異常有哪幾類?分別怎么使用?

Java的異常分為兩大類:Checked異常和Runtime異常(運(yùn)行時(shí)異常)。所有的RuntimeException類及其子類的實(shí)例被稱為Runtime異常,不是RuntimeException或其子類的異常實(shí)例則被稱為Checked異常。
常見(jiàn)的Checked異常有:IOException, SQLException
常見(jiàn)的Runtime異常有:ArithmeticException, ClassCastException, IllegalArgumentException, NullPointerException

3.常用的集合類有哪些?比如List如何排序?

Java集合類主要從兩個(gè)接口派生而出:CollectionMap

Collection又派生出Set,QueueList三個(gè)重要接口。常用實(shí)現(xiàn)類有,HashSet,LinkedHashSet,TreeSet(采用紅黑樹(shù)數(shù)據(jù)結(jié)構(gòu)),EnumSet(專門(mén)用于存放枚舉變量的Set); ArrayList(以數(shù)組結(jié)構(gòu)),LinkedList(以鏈表結(jié)構(gòu)),Vector(不建議使用), Stack(不建議使用); PriorityQueue,ArrayDeque;

Map的常見(jiàn)實(shí)現(xiàn)類有HashMap,LinkedHashMap,TreeMap,EnumMap,Hashtable(不建議使用)

對(duì)List排序可以采用 Collections.sort(arr)

4.ArrayList和LinkedList內(nèi)部的實(shí)現(xiàn)大致是怎樣的?他們之間的區(qū)別和優(yōu)缺點(diǎn)?

ArrayList內(nèi)部采用數(shù)組的方式實(shí)現(xiàn),LinkedList內(nèi)部采用鏈表的方式實(shí)現(xiàn)。由于數(shù)組以一塊連續(xù)內(nèi)存區(qū)域來(lái)保存所有的數(shù)組元素,所以數(shù)組在隨機(jī)訪問(wèn)時(shí)性能最好,即如果訪問(wèn)的頻率遠(yuǎn)高于插入和刪除時(shí),應(yīng)選用ArrayList。如果插入和刪除的頻率遠(yuǎn)高于訪問(wèn),那么應(yīng)該選用LinkedList

5.內(nèi)存溢出是怎么回事?請(qǐng)舉一個(gè)例子?

計(jì)算機(jī)內(nèi)存分配不夠用了。比如遞歸函數(shù)沒(méi)有寫(xiě)跳出,就會(huì)出現(xiàn)棧內(nèi)存溢出。

6.==和equals的區(qū)別?
  • 使用==比較原生類型如:boolean、int、char等等,使用equals()比較對(duì)象。
  • ==返回true如果兩個(gè)引用指向相同的對(duì)象,equals()的返回結(jié)果依賴于具體業(yè)務(wù)實(shí)現(xiàn)
  • 字符串的對(duì)比使用equals()代替==操作符
7.hashCode方法的作用?
  • equal()相等的兩個(gè)對(duì)象他們的hashCode()肯定相等,也就是用equal()對(duì)比是絕對(duì)可靠的。
  • hashCode()相等的兩個(gè)對(duì)象他們的equal()不一定相等,也就是hashCode()不是絕對(duì)可靠的。

所有對(duì)于需要大量并且快速的對(duì)比的話如果都用equal()去做顯然效率太低,所以解決方式是,每當(dāng)需要對(duì)比的時(shí)候,首先用hashCode()去對(duì)比,如果hashCode()不一樣,則表示這兩個(gè)對(duì)象肯定不相等(也就是不必再用equal()去再對(duì)比了),如果hashCode()相同,此時(shí)再對(duì)比他們的equal(),如果equal()也相同,則表示這兩個(gè)對(duì)象是真的相同了,這樣既能大大提高了效率也保證了對(duì)比的絕對(duì)正確性!

這種大量的并且快速的對(duì)象對(duì)比一般使用的hash容器中,比如HashSet,HashMap,Hashtable等等

8.NIO是什么?適用于何種場(chǎng)景?

簡(jiǎn)而言之,io是面向流的,是就用多少拿多少。是阻塞的。數(shù)據(jù)量不大的或者不在意阻塞的時(shí)可以用。nio是面向塊的,先把數(shù)據(jù)搬過(guò)來(lái),先存到緩存區(qū)里面,如果線程要用從緩存區(qū)拿。所以線程不需要時(shí)刻盯著io了,可以先做一些其他的事情,過(guò)幾天再來(lái)看一下緩存。是同步非阻塞的。因此,nio里有Buffer類作為緩沖區(qū),Channel(通道)相當(dāng)于io里的steam的抽象,Selector是nio提供的管理多個(gè)Channel的工具。nio出現(xiàn)也是因?yàn)閕o漸漸成為一些程序速度的瓶頸。
aio加了一個(gè)異步的特性。當(dāng)我們要拿數(shù)據(jù)花費(fèi)時(shí)間太長(zhǎng)的時(shí)候,我們可以考慮使用異步的io。異步就是可以理解為,讓io先處理著,我線程先去干別的事情了,你io處理完了通知我一下。aio提供的事件處理接口CompletionHandler,定義了回調(diào)函數(shù),這些函數(shù)再io完成后會(huì)被自動(dòng)的調(diào)用。

參考文章:https://www.zhihu.com/question/40930889/answer/146567853

9.HashMap實(shí)現(xiàn)原理,如何保證HashMap的線程安全?

鏈表的數(shù)組。

Map<Object, Object> map = Collections.synchronizedMap(new HashMap<>());

10.JVM內(nèi)存結(jié)構(gòu),為什么需要GC?
JVM內(nèi)存結(jié)構(gòu)分析.jpg

方法區(qū),堆,虛擬機(jī)棧,本地方法棧,程序計(jì)數(shù)器。

重點(diǎn)參考文章:JVM內(nèi)存結(jié)構(gòu)

垃圾回收可以有效的防止內(nèi)存泄露,有效的使用空閑的內(nèi)存;

  • 引用計(jì)數(shù)法: 思路簡(jiǎn)單,執(zhí)行效率高。但是無(wú)法檢測(cè)循環(huán)引用。

  • 可達(dá)性分析算法:

  • 標(biāo)記清除算法

  • 復(fù)制算法

  • 標(biāo)記整理算法

  • 分代收集算法

  1. 根搜索算法,從GCRoot出發(fā),不聯(lián)通的圖極為垃圾。作為GC Root的對(duì)象有:
    a. 虛擬機(jī)棧中的引用對(duì)象(本地變量表)
    b. 方法區(qū)中常量引用的對(duì)象
    c. 方法區(qū)中靜態(tài)屬性引用的對(duì)象
    d. 本地方法棧中引用的對(duì)象(Native對(duì)象)

重點(diǎn)參考文章:深入理解 Java 垃圾回收機(jī)制 , 一個(gè)面試官對(duì)面試問(wèn)題的分析

11.NIO模型,select/epoll的區(qū)別,多路復(fù)用的原理

select、poll、epoll之間的區(qū)別總結(jié)[整理]

12.Java中一個(gè)字符占多少個(gè)字節(jié),擴(kuò)展再問(wèn)int, long, double占多少字節(jié)

byte 1字節(jié)
short 2字節(jié)
int 4字節(jié)
long 8字節(jié)
float 4字節(jié)
double 8字節(jié)
char 2字節(jié)
boolean 1字節(jié)

13.創(chuàng)建一個(gè)類的實(shí)例都有哪些辦法?

new
clone
newInstance

14.final/finally/finalize的區(qū)別?

final 限定符,不能被繼承等
finally 配合try使用,一定會(huì)被執(zhí)行
finalize Object中的方法,被CG之前執(zhí)行,只執(zhí)行一次。

15.Session/Cookie的區(qū)別?

一個(gè)在服務(wù)器上,一個(gè)存在客戶端。

16.String/StringBuffer/StringBuilder的區(qū)別,擴(kuò)展再問(wèn)他們的實(shí)現(xiàn)?

String字符串常量

StringBuffer字符串變量(線程安全)

StringBuilder字符串變量(非線程安全)

17.Servlet的生命周期?

Web Client 向Servlet容器(Tomcat)發(fā)出Http請(qǐng)求
Servlet容器接收Web Client的請(qǐng)求
Servlet容器創(chuàng)建一個(gè)HttpRequest對(duì)象,將Web Client請(qǐng)求的信息封裝到這個(gè)對(duì)象中。
Servlet容器創(chuàng)建一個(gè)HttpResponse對(duì)象
Servlet容器調(diào)用HttpServlet對(duì)象的service方法,把HttpRequest對(duì)象與HttpResponse對(duì)象作為參數(shù)傳給 HttpServlet 對(duì)象。
HttpServlet調(diào)用HttpRequest對(duì)象的有關(guān)方法,獲取Http請(qǐng)求信息。
HttpServlet調(diào)用HttpResponse對(duì)象的有關(guān)方法,生成響應(yīng)數(shù)據(jù)。
Servlet容器把HttpServlet的響應(yīng)結(jié)果傳給Web Client。

18.如何用Java分配一段連續(xù)的1G的內(nèi)存空間?需要注意些什么?

使用數(shù)組即可分配連續(xù)1G內(nèi)存,由于分配大內(nèi)存容易出現(xiàn) OutOfMemoryError: Java heap space,因此當(dāng)需要使用這么大內(nèi)存時(shí)首先考慮優(yōu)化算法。

19.Java有自己的內(nèi)存回收機(jī)制,但為什么還存在內(nèi)存泄露的問(wèn)題呢?

內(nèi)存泄露 : 如果分配出去的內(nèi)存得不到釋放,及時(shí)回收,就會(huì)引起系統(tǒng)運(yùn)行速度下降,甚至導(dǎo)致程序癱瘓,這就是內(nèi)存泄露
stackoverflow上關(guān)于創(chuàng)建內(nèi)存泄漏的討論

資源不關(guān)閉就會(huì)導(dǎo)致內(nèi)存泄漏,比如數(shù)據(jù)庫(kù)連接,文件等

20.什么是java序列化,如何實(shí)現(xiàn)java序列化?(寫(xiě)一個(gè)實(shí)例)?

java中的序列化機(jī)制能夠?qū)⒁粋€(gè)實(shí)例對(duì)象(只序列化對(duì)象的屬性值,而不會(huì)去序列化什么所謂的方法。)的狀態(tài)信息寫(xiě)入到一個(gè)字節(jié)流中使其可以通過(guò)socket進(jìn)行傳輸、或者持久化到存儲(chǔ)數(shù)據(jù)庫(kù)或文件系統(tǒng)中;然后在需要的時(shí)候通過(guò)字節(jié)流中的信息來(lái)重構(gòu)一個(gè)相同的對(duì)象。

一般而言,要使得一個(gè)類可以序列化,只需簡(jiǎn)單實(shí)現(xiàn)java.io.Serializable接口即可。

21.String s = new String("abc");創(chuàng)建了幾個(gè) String Object?

2個(gè)。

目錄列表
一、數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)
二、Java基礎(chǔ)
三、JVM
四、多線程/并發(fā)
五、Linux使用與問(wèn)題分析排查
六、框架使用
七、數(shù)據(jù)庫(kù)相關(guān)
八、網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)編程
九、Redis等緩存系統(tǒng)/中間件/NoSQL/一致性Hash等
十、設(shè)計(jì)模式與重構(gòu)
本文是針對(duì)知乎文章《成為Java頂尖程序員,先過(guò)了下面問(wèn)題》的解答

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,640評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,957評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評(píng)論 6 413
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,011評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,183評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評(píng)論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,251評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,588評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,379評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,737評(píng)論 18 399
  • (一)Java部分 1、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,134評(píng)論 0 62
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,339評(píng)論 11 349
  • 兒子成績(jī)不好,丈夫很焦慮,內(nèi)心的焦灼,誰(shuí)人知曉。
    譚辛節(jié)閱讀 147評(píng)論 0 0
  • 我們平時(shí)在開(kāi)發(fā)過(guò)程中,偶爾會(huì)遇到一些崩潰日志,看到堆棧就想放棄的,例如下面這個(gè),很明顯的野指針崩潰,但是不知道崩潰...
    _ivanC閱讀 1,135評(píng)論 8 3