Java開發面試題整理(2019春招)

1、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的。Java 5提供了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()方法用來找到鍵值對。
  • 1和2參考博客連接
  • 這裏還有許多相關問題的描述,都是比較重要的!建議將其背熟!

3. ArrayList和LinkList各自的特色和區別?

一、ArrayList和LinkedList可想從名字分析,它們一個是Array(動態數組)的數據結構,一個是Link(鏈表)的數據結構,此外,它們兩個都是對List接口的實現。前者是數組隊列,至關於動態數組;後者爲雙向鏈表結構,也可看成堆棧、隊列、雙端隊列html

二、當隨機訪問List時(get和set操做),ArrayList比LinkedList的效率更高,由於LinkedList是線性的數據存儲方式,因此須要移動指針從前日後依次查找。java

三、當對數據進行增長和刪除的操做時(add和remove操做),LinkedList比ArrayList的效率更高,由於ArrayList是數組,因此在其中進行增刪操做時,會對操做點以後全部數據的下標索引形成影響,須要進行數據的移動。程序員

四、從利用效率來看,ArrayList自由性較低,由於它須要手動的設置固定大小的容量,可是它的使用比較方便,只須要建立,而後添加數據,經過調用下標進行使用;而LinkedList自由性較高,可以動態的隨數據量的變化而變化,可是它不便於使用。web

五、ArrayList主要控件開銷在於須要在lList列表預留必定空間;而LinkList主要控件開銷在於須要存儲結點信息以及結點指針信息。算法

4. RESTFul風格接口的特色?

  • 此題是如今作應用開發常問的題目,RestFul風格在如今的應用開發仍是比較經常使用的,因此仍是比較重要,建議進行了解:如下是做者自認爲不錯的一篇關於RestFul架構風格的博客,推薦!博客·連接

5. 面向對象的七種設計原則

面向對象七大設計原則:sql

一、 開閉原則(OCP:Open Closed Principle)數據庫

核心:對擴展開放,對修改關閉。即在設計一個模塊的時候,應當使這個模塊能夠在不被修改的前提下被擴展。編程

  • 根據開閉原則,在設計一個軟件系統模塊(類,方法)的時候,應該能夠在不修改原有的模塊(修改關閉)的基礎上,能擴展其功能(擴展開放)。

二、 里氏替換原則(LSP:Liskov Substitution Principle)設計模式

核心:在任何父類出現的地方均可以用他的子類來替代(子類應當能夠替換父類並出如今父類可以出現的任何地方)數組

  • 1.子類必須徹底實現父類的方法。在類中調用其餘類是務必要使用父類或接口,若是不能使用父類或接口,則說明類的設計已經違背了LSP原則。
  • 2.子類能夠有本身的個性。子類固然能夠有本身的行爲和外觀了,也就是方法和屬性
  • 3.覆蓋或實現父類的方法時輸入參數能夠被放大。即子類能夠重載父類的方法,但輸入參數應比父類方法中的大,這樣在子類代替父類的時候,調用的仍然是父類的方法。即以子類中方法的前置條件必須與超類中被覆蓋的方法的前置條件相同或者更寬鬆。
  • 4.覆蓋或實現父類的方法時輸出結果能夠被縮小。

三、 單一職責原則(SRP:Single responsibility principle)

核心:解耦和加強內聚性(高內聚,低耦合)

  • 類被修改的概率很大,所以應該專一於單一的功能。若是你把多個功能放在同一個類中,功能之間就造成了關聯,改變其中一個功能,有可能停止另外一個功能,這時就須要新一輪的測試來避免可能出現的問題。

四、 接口隔離原則(ISP:Interface Segregation Principle)

核心思想:不該該強迫客戶程序依賴他們不須要使用的方法。接口分離原則的意思就是:一個接口不須要提供太多的行爲,一個接口應該只提供一種對外的功能,不該該把全部的操做都封裝到一個接口當中.

  • 分離接口的兩種實現方法:
  • 1.使用委託分離接口。(Separation through Delegation)
  • 2.使用多重繼承分離接口。(Separation through Multiple Inheritance)

五、 依賴倒置原則(DIP:Dependence Inversion Principle)

核心:要依賴於抽象,不要依賴於具體的實現

  • 1.高層模塊不該該依賴低層模塊,二者都應該依賴其抽象(抽象類或接口)
  • 2.抽象不該該依賴細節(具體實現)
  • 3.細節(具體實現)應該依賴抽象。
    三種實現方式:
  • 1.經過構造函數傳遞依賴對象
  • 2.經過setter方法傳遞依賴對象
  • 3.接口聲明實現依賴對象

六、 迪米特原則(最少知識原則)(LOD:Law of Demeter)

核心思想:一個對象應當對其餘對象有儘量少的瞭解,不和陌生人說話。(類間解耦,低耦合)意思就是下降各個對象之間的耦合,提升系統的可維護性;在模塊之間只經過接口來通訊,而不理會模塊的內部工做原理,可使各個模塊的耦合成都降到最低,促進軟件的複用
注:

  • 1.在類的劃分上,應該建立有弱耦合的類;
  • 2.在類的結構設計上,每個類都應當儘可能下降成員的訪問權限;
  • 3.在類的設計上,只要有可能,一個類應當設計成不變;
  • 4.在對其餘類的引用上,一個對象對其它對象的引用應當降到最低;
  • 5.儘可能下降類的訪問權限;
  • 6.謹慎使用序列化功能;
  • 7.不要暴露類成員,而應該提供相應的訪問器(屬性)

七、 組合/聚合複用原則(CRP:Composite Reuse Principle)

核心思想:儘可能使用對象組合,而不是繼承來達到複用的目的。該原則就是在一個新的對象裏面使用一些已有的對象,使之成爲新對象的一部分:新的對象經過向這些對象的委派達到複用已有功能的目的。

複用的種類:

  • 1.繼承
  • 2.合成聚合

注:在複用時應優先考慮使用合成聚合而不是繼承

6. 談談堆和棧的區別!

a.堆棧空間分配

  • 棧(操做系統):由操做系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。
  • 堆(操做系統): 通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式卻是相似於鏈表

b.堆棧緩存方式

  • 棧使用的是一級緩存, 他們一般都是被調用時處於存儲空間中,調用完畢當即釋放。
  • 堆則是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並非一旦成爲孤兒對象就能被回收)。因此調用這些對象的速度要相對來得低一些。

c.堆棧數據結構區別

  • 堆(數據結構):堆能夠被當作是一棵樹,如:堆排序。
  • 棧(數據結構):一種先進後出的數據結構。

7. 談談你所瞭解的設計模式,並簡單描述其特色和用法,或簡單寫一個某某設計模式!

1. 單例設計模式
2. 工廠設計模式
3. 代理模式
4. 觀察者設計模式
5. 適配器模式
6. 策略模式
7. 門面模式
8. 橋接模式

來一個參考連接幾種經常使用的設計模式參考博客連接

注:設計模式有不少,這裏列舉幾種經常使用的!讀者須要自行將這幾種設計模式理解清楚!前五種是經常使用也是常考的!

8. 熟悉HTTP基本的狀態碼!

一些常見的狀態碼爲:

  • 200 - 服務器成功返回網頁
  • 404 - 請求的網頁不存在
  • 503 - 服務不可用
  • 具體詳細的能夠參考博客 HTTP狀態碼詳細博客連接

9. List、Set和Map的特色和區別(重點)

List

  • 1.能夠容許重複的對象。
  • 2.能夠插入多個null元素。
  • 3.是一個有序容器,保持了每一個元素的插入順序,輸出的順序就是插入的順序。
  • 4.經常使用的實現類有 ArrayList、LinkedList 和 Vector。ArrayList 最爲流行,它提供了使用索引的隨意訪問,而 LinkedList 則對於常常須要從 List 中添加或刪除元素的場合更爲合適。

Set

  • 1.不容許重複對象
  • 2.無序容器,你沒法保證每一個元素的存儲順序,TreeSet經過 Comparator 或者 Comparable 維護了一個排序順序。
  • 3.只容許一個 null 元素
  • 4.Set 接口最流行的幾個實現類是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基於 HashMap 實現的 HashSet;TreeSet 還實現了 SortedSet 接口,所以 TreeSet 是一個根據其 compare() 和 compareTo() 的定義進行排序的有序容器。

Map

  • 1.不是collection的子接口或者實現類。Map是一個接口。
  • 2.Map 的 每一個 Entry 都持有兩個對象,也就是一個鍵一個值,Map 可能會持有相同的值對象但鍵對象必須是惟一的。
  • 3.TreeMap 也經過 Comparator 或者 Comparable 維護了一個排序順序。
  • 4.Map 裏你能夠擁有隨意個 null 值但最多隻能有一個 null 鍵。
  • 5.Map 接口最流行的幾個實現類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最經常使用)

10.監聽器、過濾器、攔截器、servlet的區別

  • eb.xml 的加載順序是:context- param -> listener -> filter -> servlet
    監聽器(listener)
  • 在request、session、application三個對象建立消亡或者往其中增/刪/改屬性時自動執行指定代碼的功能組件。
  • 生命週期:隨web應用的啓動而啓動,只初始化一次,隨web應用的中止而銷燬。
  • 做用:作一些初始化的內容添加工做、設置一些基本的內容、好比一些參數或者是一些固定的對象等等。
    過濾器(filter)
  • 攔截請求,filter可以在一個請求到達控制層以前預處理用戶請求,也能夠在離開控制層時處理http 響應,進行一些設置以及邏輯判斷,而後再傳入servlet或者struts的 action進行業務邏輯,基於函數回調。
  • 生命週期:它是隨你的web應用啓動而啓動的,只初始化一次,之後就能夠攔截相關請求,只有當你的web應用中止或從新部署的時候才銷燬。
  • 做用:a.對請求或響應(Request、Response)統一設置統一編碼,簡化操做;b.進行邏輯判斷,如用戶是否已經登錄、有沒有權限訪問該頁面等等工做。c.過濾掉非法url
    攔截器(interceptor)
  • 攔截器是在面向切面編程中應用的,基於JAVA的反射機制,在一個業務邏輯(某個方法) 前、後調用另外一個方法。
    生命週期:
    做用:
    servlet
  • servlet是一種運行服務器端的java應用程序,具備獨立於平臺和協議的特性,而且能夠動態的生成web頁面,它工做在客戶端請求與服務器響應的中間層。
    參考連接:參考博客連接

11. 當在瀏覽器輸入一個網址,所要通過的所有在過程,請詳細描述!

瀏覽器訪問某地址的詳細過程:

  • 在服務器上輸入一個地址:例如www.baidu.com後,回車:瀏覽器會根據輸入的URL到DNS服務器查詢對應的IP地址和域名;返回到客戶端,客戶端再根據所查到的的域名和IP,請求創建TCP鏈接,鏈接到對應的百度服務器,向服務器發送HTTP Request(請求),服務端接收到請求包並進行處理,並調用自身服務,返回HTTP Response(響應)。客戶端接到響應的時候開始渲染這個Response包裏的主體(body),等接收完全部內容後自動斷開該TCP鏈接。
  • 詳細過程圖:

在這裏插入圖片描述

12. 簡單描述Spring的特色:

  • spirng就是一個容器 ,它經過控制反轉IOC和依賴注入(DI)實現高內聚、低耦合的應用。除此以外她還能整合不少第三方框架,它提供了面向切面編程AOP的能力,使其對數據庫事務管理極爲方便。
  • 簡介:Spring就是一個輕量級的開源的Java SE 和Java EE 的開發應用框架。目的在於簡化企業級應用的開發。

2、數據庫基礎部分

1. 詳細描述幾種你所熟悉的優化數據庫的方式。

一、選取最適用的字段屬性
二、使用鏈接(JOIN)來代替子查詢(Sub-Queries)
三、使用聯合(UNION)來代替手動建立的臨時表
四、事務
五、鎖定表
六、使用外鍵
七、使用索引
八、優化的查詢語句

參考連接:優化數據庫的八種方式詳解

2. 數據庫的視圖和索引都有什麼特色,有什麼區別?

視圖:

  • 概念:視圖是從一個或多個表中導出來的表,是一種不是一種真正存在的概念。
  • 視圖操做sql:
 1 //建立視圖:
 2 create  view viewName(參數列表/能夠不寫這樣就是默認和下面的select同樣) as select * from   表名;
 3 //例1:
 4 create  table viewdemo(id int primary key , name char(10),score  float);
 5 create  view  view1
 6 as select* from  viewdemo;
 7 create view view2(name,score) as select name ,score from  viewdemo;
 8 //修改視圖:
 9 alter  view  viewname (columns)  as  select columns from   tableName;
10 //例:
11 alter view  view2 (id ,name)  as select  id,name from  viewdemo ;
12 //刪除視圖:
13 drop  view if exists  view  name;
14 //例:
15 drop   view  view2;

 

索引 :

  • 概念:能夠理解爲是一本書的目錄,它記錄了數據在數據庫中存放的位置,就像一本書的目錄,記錄了,某一頁在這本書的那個位置。相同地,索引是一個單獨的、存儲在磁盤上的數據庫結構,它們包含着對數據庫表裏全部記錄的引用指針。
  • 視圖操做sql:
1 ALTER  TABLE  table_name  ADD   [UNIQUE|FULLTEXT] [INDEX|KEY] 
2 [inex_name] (col_name [length ] ,...) [ASC|DESC]

 

1 普通索引:
2 ALTER  TABLE  book  ADD  INDEX        indexName( bookname(30) );
3 惟一索引:
4 ALTER  TABLE  book  ADD UNIQUE INDEX  UniqueIdx( bookid );
5 組合索引:
6 ALTER  TABLE  book  ADD  INDEX  BkAndInfoIdx( authors(20), info(50) );
7 全文索引:
8 ALTER TABLE t6  ADD  FULLTEXT  INDEX infiIdx(info);(
9 前提是這個表的存儲引擎爲 MyISAM)

 

使用 create index 建立索引:

語法:

1 CREATE  [UNIQUE|FULLTEXT] [INDEX|KEY] INDEX  index_name
2 ON   table_name ( col_name[ length ] , ... )  [ASC | DESC ]
3  例:在表book的bookname字段上創建名爲BkNameIdx的索引。
4 CREATE INDEX  BkNameIdx   ON   book (bookname);
5  例: 在book表的bookId字段上創建惟一索引。
6 CREATE   UNIQUE    INDEX  UniqueIdx    ON   book (bookId);
7 4、刪除索引:
8 ALTER   TABLE  table_name   DROP   INDEX  index_name;
9 DROP    INDEX     index_name   ON  table_name ;

後續還會有補充,姑且先寫到這吧!

我有一個微信公衆號,常常會分享一些Java技術相關的乾貨;

若是你喜歡個人分享,能夠用微信搜索「Java團長」或者「javatuanzhang」關注。

相關文章
相關標籤/搜索