更新時(shí)間:2019-07-15 09:05:01 來源:動(dòng)力節(jié)點(diǎn) 瀏覽3051次
一般正式找工作的時(shí)候,面試官都會(huì)根據(jù)你的項(xiàng)目來問問題,小編這兒寫的大多都是2019年最新Java筆試題和一些面試經(jīng)常容易考到的問題!所以讀者還應(yīng)把自己的簡歷和項(xiàng)目吃透,所有相關(guān)知識(shí)點(diǎn)都應(yīng)該熟練掌握!這才是重點(diǎn)!
繼續(xù)來完成我們的秋招Java面試題,這些題都有可能你會(huì)在秋招的時(shí)候遇到的,希望對(duì)你有所幫助!
1.HashMap和Hashtable各有什么特點(diǎn),它們有什么區(qū)別?(必背題,超級(jí)重要)
HashMap和Hashtable都實(shí)現(xiàn)了Map接口,但決定用哪一個(gè)之前先要弄清楚它們之間的分別。主要的區(qū)別有:線程安全性,同步(synchronization),以及速度。
HashMap幾乎可以等價(jià)于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。
HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個(gè)線程可以共享一個(gè)Hashtable;而如果沒有正確的同步的話,多個(gè)線程是不能共享HashMap的。Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴(kuò)展性更好。
另一個(gè)區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素),將會(huì)拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會(huì)拋出ConcurrentModificationException異常。但這并不是一個(gè)一定發(fā)生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區(qū)別。
由于Hashtable是線程安全的也是synchronized,所以在單線程環(huán)境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。
HashMap不能保證隨著時(shí)間的推移Map中的元素次序是不變的。
2.HashMap的工作原理?
HashMap基于hashing原理,我們通過put()和get()方法儲(chǔ)存和獲取對(duì)象。當(dāng)我們將鍵值對(duì)傳遞給put()方法時(shí),它調(diào)用鍵對(duì)象的hashCode()方法來計(jì)算hashcode,讓后找到bucket位置來儲(chǔ)存值對(duì)象。當(dāng)獲取對(duì)象時(shí),通過鍵對(duì)象的equals()方法找到正確的鍵值對(duì),然后返回值對(duì)象。HashMap使用鏈表來解決碰撞問題,當(dāng)發(fā)生碰撞了,對(duì)象將會(huì)儲(chǔ)存在鏈表的下一個(gè)節(jié)點(diǎn)中。HashMap在每個(gè)鏈表節(jié)點(diǎn)中儲(chǔ)存鍵值對(duì)對(duì)象。
當(dāng)兩個(gè)不同的鍵對(duì)象的hashcode相同時(shí)會(huì)發(fā)生什么?它們會(huì)儲(chǔ)存在同一個(gè)bucket位置的鏈表中。鍵對(duì)象的equals()方法用來找到鍵值對(duì)。
這里還有許多相關(guān)問題的描述,都是比較重要的!建議將其背熟!
3.ArrayList和LinkList各自的特點(diǎn)和區(qū)別?
1、ArrayList和LinkedList可想從名字分析,它們一個(gè)是Array(動(dòng)態(tài)數(shù)組)的數(shù)據(jù)結(jié)構(gòu),一個(gè)是Link(鏈表)的數(shù)據(jù)結(jié)構(gòu),此外,它們兩個(gè)都是對(duì)List接口的實(shí)現(xiàn)。前者是數(shù)組隊(duì)列,相當(dāng)于動(dòng)態(tài)數(shù)組;后者為雙向鏈表結(jié)構(gòu),也可當(dāng)作堆棧、隊(duì)列、雙端隊(duì)列
2、當(dāng)隨機(jī)訪問List時(shí)(get和set操作),ArrayList比LinkedList的效率更高,因?yàn)長inkedList是線性的數(shù)據(jù)存儲(chǔ)方式,所以需要移動(dòng)指針從前往后依次查找。
3、當(dāng)對(duì)數(shù)據(jù)進(jìn)行增加和刪除的操作時(shí)(add和remove操作),LinkedList比ArrayList的效率更高,因?yàn)锳rrayList是數(shù)組,所以在其中進(jìn)行增刪操作時(shí),會(huì)對(duì)操作點(diǎn)之后所有數(shù)據(jù)的下標(biāo)索引造成影響,需要進(jìn)行數(shù)據(jù)的移動(dòng)。
4、從利用效率來看,ArrayList自由性較低,因?yàn)樗枰謩?dòng)的設(shè)置固定大小的容量,但是它的使用比較方便,只需要?jiǎng)?chuàng)建,然后添加數(shù)據(jù),通過調(diào)用下標(biāo)進(jìn)行使用;而LinkedList自由性較高,能夠動(dòng)態(tài)的隨數(shù)據(jù)量的變化而變化,但是它不便于使用。
5、ArrayList主要控件開銷在于需要在lList列表預(yù)留一定空間;而LinkList主要控件開銷在于需要存儲(chǔ)結(jié)點(diǎn)信息以及結(jié)點(diǎn)指針信息。
4.RESTFul風(fēng)格接口的特點(diǎn)?
此題是現(xiàn)在做應(yīng)用開發(fā)常問的題目,RestFul風(fēng)格在現(xiàn)在的應(yīng)用開發(fā)還是比較常用的,所以還是比較重要,建議進(jìn)行了解:以下是作者自認(rèn)為不錯(cuò)的一篇關(guān)于RestFul架構(gòu)風(fēng)格的博客,推薦!
博客?鏈接
5.面向?qū)ο?/span>的七種設(shè)計(jì)原則
面向?qū)ο笃叽笤O(shè)計(jì)原則
1、開閉原則(OCP:OpenClosedPrinciple)
核心:對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。即在設(shè)計(jì)一個(gè)模塊的時(shí)候,應(yīng)當(dāng)使這個(gè)模塊可以在不被修改的前提下被擴(kuò)展。
根據(jù)開閉原則,在設(shè)計(jì)一個(gè)軟件系統(tǒng)模塊(類,方法)的時(shí)候,應(yīng)該可以在不修改原有的模塊(修改關(guān)閉)的基礎(chǔ)上,能擴(kuò)展其功能(擴(kuò)展開放)。
2、里氏替換原則(LSP:LiskovSubstitutionPrinciple)
核心:在任何父類出現(xiàn)的地方都可以用他的子類來替代(子類應(yīng)當(dāng)可以替換父類并出現(xiàn)在父類能夠出現(xiàn)的任何地方)
1.子類必須完全實(shí)現(xiàn)父類的方法。在類中調(diào)用其他類是務(wù)必要使用父類或接口,如果不能使用父類或接口,則說明類的設(shè)計(jì)已經(jīng)違背了LSP原則。
2.子類可以有自己的個(gè)性。子類當(dāng)然可以有自己的行為和外觀了,也就是方法和屬性
3.覆蓋或?qū)崿F(xiàn)父類的方法時(shí)輸入?yún)?shù)可以被放大。即子類可以重載父類的方法,但輸入?yún)?shù)應(yīng)比父類方法中的大,這樣在子類代替父類的時(shí)候,調(diào)用的仍然是父類的方法。即以子類中方法的前置條件必須與超類中被覆蓋的方法的前置條件相同或者更寬松。
4.覆蓋或?qū)崿F(xiàn)父類的方法時(shí)輸出結(jié)果可以被縮小。
3、單一職責(zé)原則(SRP:Singleresponsibilityprinciple)
核心:解耦和增強(qiáng)內(nèi)聚性(高內(nèi)聚,低耦合)
類被修改的幾率很大,因此應(yīng)該專注于單一的功能。如果你把多個(gè)功能放在同一個(gè)類中,功能之間就形成了關(guān)聯(lián),改變其中一個(gè)功能,有可能中止另一個(gè)功能,這時(shí)就需要新一輪的測(cè)試來避免可能出現(xiàn)的問題。
4、接口隔離原則(ISP:InterfaceSegregationPrinciple)
核心思想:不應(yīng)該強(qiáng)迫客戶程序依賴他們不需要使用的方法。接口分離原則的意思就是:一個(gè)接口不需要提供太多的行為,一個(gè)接口應(yīng)該只提供一種對(duì)外的功能,不應(yīng)該把所有的操作都封裝到一個(gè)接口當(dāng)中.
分離接口的兩種實(shí)現(xiàn)方法:
1.使用委托分離接口。(SeparationthroughDelegation)
2.使用多重繼承分離接口。(SeparationthroughMultipleInheritance)
5、依賴倒置原則(DIP:DependenceInversionPrinciple)
核心:要依賴于抽象,不要依賴于具體的實(shí)現(xiàn)
1.高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象(抽象類或接口)
2.抽象不應(yīng)該依賴細(xì)節(jié)(具體實(shí)現(xiàn))
3.細(xì)節(jié)(具體實(shí)現(xiàn))應(yīng)該依賴抽象。
三種實(shí)現(xiàn)方式:
1.通過構(gòu)造函數(shù)傳遞依賴對(duì)象
2.通過setter方法傳遞依賴對(duì)象
3.接口聲明實(shí)現(xiàn)依賴對(duì)象
6、迪米特原則(最少知識(shí)原則)(LOD:LawofDemeter)
核心思想:一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少的了解,不和陌生人說話。(類間解耦,低耦合)意思就是降低各個(gè)對(duì)象之間的耦合,提高系統(tǒng)的可維護(hù)性;在模塊之間只通過接口來通信,而不理會(huì)模塊的內(nèi)部工作原理,可以使各個(gè)模塊的耦合成都降到最低,促進(jìn)軟件的復(fù)用
注:
1.在類的劃分上,應(yīng)該創(chuàng)建有弱耦合的類;
2.在類的結(jié)構(gòu)設(shè)計(jì)上,每一個(gè)類都應(yīng)當(dāng)盡量降低成員的訪問權(quán)限;
3.在類的設(shè)計(jì)上,只要有可能,一個(gè)類應(yīng)當(dāng)設(shè)計(jì)成不變;
4.在對(duì)其他類的引用上,一個(gè)對(duì)象對(duì)其它對(duì)象的引用應(yīng)當(dāng)降到最低;
5.盡量降低類的訪問權(quán)限;
6.謹(jǐn)慎使用序列化功能;
7.不要暴露類成員,而應(yīng)該提供相應(yīng)的訪問器(屬性)
7、組合/聚合復(fù)用原則(CRP:CompositeReusePrinciple)
核心思想:盡量使用對(duì)象組合,而不是繼承來達(dá)到復(fù)用的目的。該原則就是在一個(gè)新的對(duì)象里面使用一些已有的對(duì)象,使之成為新對(duì)象的一部分:新的對(duì)象通過向這些對(duì)象的委派達(dá)到復(fù)用已有功能的目的。
復(fù)用的種類:
1.繼承
2.合成聚合
注:在復(fù)用時(shí)應(yīng)優(yōu)先考慮使用合成聚合而不是繼承
6.談?wù)劧押蜅5膮^(qū)別!
a.堆棧空間分配
棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
堆(操作系統(tǒng)):一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收,分配方式倒是類似于鏈表
b.堆棧緩存方式
棧使用的是一級(jí)緩存,他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放。
堆則是存放在二級(jí)緩存中,生命周期由虛擬機(jī)的垃圾回收算法來決定(并不是一旦成為孤兒對(duì)象就能被回收)。所以調(diào)用這些對(duì)象的速度要相對(duì)來得低一些。
c.堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別
堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹,如:堆排序。
棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743