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