Java面試問題總結

以下是面試總結:

其他面試相關鏈接:
互聯網面試問題1
170道面試題

1.JAVA基礎

1)HashMap和HashTable的區別

2)HashMap實現原理

3)ArrayList和LinkedList有什麼區別?

4)數組(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?

5)抽象類和接口的區別

6)垃圾回收機制

7)說說jvm

8)jvm性能調優

9)ThreadLocal

答案:

1)HashMap和HashTable的區別

區別:
(1).Hashtable是線程安全的,而HashMap是線程不安全的
(2).值:只有HashMap可以讓你將空值作爲一個表的條目的key或value

2)HashMap實現原理

Hashmap實際上是一個數組和鏈表的結合體。

HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然後返回值對象。HashMap使用鏈表來解決碰撞問題,當發生碰撞了,對象將會儲存在鏈表的下一個節點中。 HashMap在每個鏈表節點中儲存鍵值對對象。

當兩個不同的鍵對象的hashcode相同時會發生什麼?
它們會儲存在同一個bucket位置的鏈表中。鍵對象的equals()方法用來找到鍵值對。

3)ArrayList和LinkedList有什麼區別?

1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針。
3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據。

4)數組(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?

Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
Array大小是固定的,ArrayList的大小是動態變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。

5)抽象類和接口的區別

抽象類可以提供成員方法的實現細節,而接口中只能存在public abstract 方法;
抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的
接口中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;
一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含 main方法的話是可以被調用的

這裏寫圖片描述

接口:
[修飾符] interface 接口名 extends 父接口 1,父接口 2….
沒有構造方法,不能實例化;
接口只能繼承接口,不能繼承類
接口裏沒有普通方法,方法全是抽象的;
接口裏的方法默認修飾符是 public abstract;
接口裏的字段全是全局常量,默認修飾符是 public static final;
注意:接口方法只能用public abstract;修飾,接口中不允許出現static類型的方法

6).Java的鎖有哪幾種?

1、自旋鎖:自旋鎖是採用讓當前線程不停地的在循環體內執行實現的,當循環的條件被其他線程改變時 才能進入臨界區。
2、自旋鎖的其他種類
3、阻塞鎖:常用的有五個狀態的鎖都是阻塞所。
4、可重入鎖:ReentrantLock
5、讀寫鎖:寫鎖是排他鎖,讀鎖是共享鎖。
6、互斥鎖
7、悲觀鎖:在整個數據處理過程中,將數據處於鎖定狀態。 悲觀鎖的實現,往往依靠數據庫提供的鎖機制。
8、樂觀鎖:樂觀鎖假設認爲數據一般情況下不會造成衝突,所以在數據進行提交更新的時候,纔會正式對數據的衝突與否進行檢測,如果發現衝突了,則讓返回用戶錯誤的信息,讓用戶決定如何去做。
公平鎖(Fair):加鎖前檢查是否有排隊等待的線程,優先排隊等待的線程,先來先得
非公平鎖(Nonfair):加鎖時不考慮排隊等待問題,直接嘗試獲取鎖,獲取不到自動到隊尾等待

7)成員變量和局部變量的區別

成員變量和局部變量的區別?
A:在類中的位置不同
成員變量:在類中方法外
局部變量:在方法定義中或者方法聲明上
B:在內存中的位置不同
成員變量:在堆內存
局部變量:在棧內存
C:生命週期不同
成員變量:隨着對象的創建而存在,隨着對象的消失而消失
局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
D:初始化值不同
成員變量:有默認初始化值
局部變量:沒有默認初始化值,必須定義,賦值,然後才能使用。

注意事項:
局部變量名稱可以和成員變量名稱一樣,在方法中使用的時候,採用的是就近原則。

8)java內存分配:

jvm內存結構棧和堆

棧:存放局部變量
堆:存放所有new出來的東西

棧特點:棧內存的數據用完就釋放

堆特點:
1.每一個new出來的東西都有地址值
2.每一個變量都有默認值(例如byte、short、int、long默認值0,float、double默認值0.0,char默認值‘\u000’,boolean默認值false)
3.使用完畢就變成垃圾,但是沒有立即回收。會在垃圾回收器空閒時回收。

9)垃圾回收機制

相關鏈接:垃圾回收機制相關鏈接1

垃圾回收就是釋放垃圾佔用的空間,那麼在Java中,什麼樣的對象會被認定爲“垃圾”?那麼當一些對象被確定爲垃圾之後,採用什麼樣的策略來進行回收(釋放空間)?在目前的商業虛擬機中,有哪些典型的垃圾收集器?

一.如何確定某個對象是“垃圾”?
使用引用計數法和可達分析法,引用計數法:當對象被引用一次就會加一,可達分析法:對象不能到達Groot就證明可以回收了,Groot是一般是常量池,方法去裏面的變量(jvm用這種算法)

二.典型的垃圾收集算法
第一種:標記-清除法
直接在內存裏標記無用的對象,然後直接回收;
缺點:形成內存碎片
第二種:複製算法:
將內存劃分爲大小相等的兩塊,當一塊的內存用完了,就將還存活的對象複製到另外一塊上面,然後將之前的那塊清理掉
缺點:浪費內存太多(對老年代的使用,效率低)
第三種:標記-整理算法
將存活的對象都向一端移動,然後直接清理掉端邊界以外的內存
第四種:分代收集算法:(當前商業虛擬機)
根據對象的存活中期的不同將內存劃分爲幾塊,一般java堆分爲新生代和老年代
新生代:用複製算法
老年代用標記整理算法進行回收

三.典型的垃圾收集器

10)說說jvm

11)jvm性能調優

12)ThreadLocal

2、線程相關

相關連接:java面試1

1)Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執行,它們有什麼區別?
2)當一個線程進入一個對象的synchronized方法A之後,其它線程是否可進入此對象的synchronized方法B?
3)多線程程序有幾種實現方式?

1.Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執行,它們有什麼區別?

答:sleep()方法(休眠)是線程類(Thread)的靜態方法,調用此方法會讓當前線程暫停執行指定的時間,將執行機會(CPU)讓給其他線程,但是對象的鎖依然保持,因此休眠時間結束後會自動恢復(線程回到就緒狀態,請參考第66題中的線程狀態轉換圖)。

wait()是Object類的方法,調用對象的wait()方法導致當前線程放棄對象的鎖(線程暫停執行),進入對象的等待池(wait pool),只有調用對象的notify()方法(或notifyAll()方法)時才能喚醒等待池中的線程進入等鎖池(lock pool),如果線程重新獲得對象的鎖就可以進入就緒狀態。

2.當一個線程進入一個對象的synchronized方法A之後,其它線程是否可進入此對象的synchronized方法B?

不能。其它線程只能訪問該對象的非同步方法,同步方法則不能進入。因爲非靜態方法上的synchronized修飾符要求執行方法時要獲得對象的鎖,如果已經進入A方法說明對象鎖已經被取走,那麼試圖進入B方法的線程就只能在等鎖池(注意不是等待池哦)中等待對象的鎖。

3.多線程程序有幾種實現方式?

Java 5以前實現多線程有兩種實現方法:一種是繼承Thread類;另一種是實現Runnable接口。兩種方式都要通過重寫run()方法來定義線程的行爲,推薦使用後者,因爲Java中的繼承是單繼承,一個類有一個父類,如果繼承了Thread類就無法再繼承其他類了,顯然使用Runnable接口更爲靈活。

Java 5以後創建線程還有第三種方式:實現Callable接口,該接口中的call方法可以在線程執行結束時產生一個返回值

3、WEB端

1.HTTP請求中POST與GET的區別

答:
1、GET請求,請求的數據會附加在URL之後,以?分割URL和傳輸數據,多個參數用&連接。URL的編碼格式採用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字符都要編碼之後再傳輸。
POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。
因此,GET請求的數據會暴露在地址欄中,而POST請求則不會

2、傳輸數據的大小
在HTTP規範中,沒有對URL的長度和傳輸的數據大小進行限制。但是在實際開發過程中,對於GET,特定的瀏覽器和服務器對URL的長度有限制。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。

對於POST,由於不是URL傳值,理論上是不會受限制的,但是實際上各個服務器會規定對POST提交數據大小進行限制,Apache、IIS都有各自的配置。

3、安全性
POST的安全性比GET的高。這裏的安全是指真正的安全,而不同於上面GET提到的安全方法中的安全,上面提到的安全僅僅是不修改服務器的數據。比如,在進行登錄操作,通過GET請求,用戶名和密碼都會暴露再URL上,因爲登錄頁面有可能被瀏覽器緩存以及其他人查看瀏覽器的歷史記錄的原因,此時的用戶名和密碼就很容易被他人拿到了。除此之外,GET請求提交的數據還可能會造成Cross-site request frogery攻擊

4.緩存
GET 請求能夠被緩存,默認的請求方式也是有緩存的
POST請求默認不會緩存

總結:
1.表現形式:get請求數據會暴露在url中和post請求是在http請求體中,
2.數據量:get請求有url長度限制而post沒有傳輸數據大小的限制 ,
3.安全性:post請求的安全性比get請求高。
4.緩存:get會被緩衝,post默認不會被緩衝

2.Ajax的原理

Ajax的原理簡單來說通過XmlHttpRequest對象來向服務器發異步請求,從服務器獲得數據,然後用javascript來操作DOM而更新頁面。這其中最關鍵的一步就是從服務器獲得請求數據。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所瞭解。

3. 如何保證http傳輸安全性

如何保證http傳輸安全性文章鏈接

4、數據庫

相關鏈接:
1.事務鏈接
2.數據庫SQL優化相關鏈接
3.58到家數據庫30條軍規解讀

1)談一談對數據庫事務的理解。

(四個特性和隔離級別必須要牢記,瞭解)

事務併發控制帶來的問題:髒讀、不可重複讀、更新丟失、幻讀等等
原子性,一致性,隔離性,持久性;
① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。
② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
③ Read committed (讀已提交):可避免髒讀的發生。
④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

2)spring事務傳播特性:

PROPAGATION_REQUIRED 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。這是默認值

PROPAGATION_SUPPORTS 支持當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY 使用當前的事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER 以非事務方式執行,如果當前存在事務,則拋出異常。

PROPAGATION_NESTED 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與 PROPAGATION_REQUIRED 類似的操作

3)sql的優化誤區:

SQL優化之針對count、表的連接順序、條件順序、in及exist的優化鏈接

5.框架問題

相關連接:三大框架面試題

  1. 開發中主要使用 Spring 的什麼技術 ?
  2. 簡述 AOP 和 IOC 概念
  3. Spring MVC 的運行流程
  4. 說出 Spring MVC 常用的註解

1.開發中主要使用 Spring 的什麼技術 ?

答:
①使用Spring的IOC來管理各層的組件
②使用Spring的AOP來配置聲明式事務
③使用spring整合其他框架或技術(redis、activemq、cxf)

2.簡述 AOP 和 IOC 概念 ?

答:IOC: 控制反轉. 也成爲 DI(依賴注入)其思想是反轉
資源獲取的方向. 傳統的資源查找方式要求組件向容器發起請求查找資源.作爲
迴應, 容器適時的返回資源. 而應用了 IOC 之後, 則是容器主動地將資源推送
給它所管理的組件,組件所要做的僅是選擇一種合適的方式來接受資源.

AOP: 面向(方面)切面的編程;Filter(過濾器)也是一種 AOP. AOP 是一種新的 方法論, 是對傳統 OOP(面向對象編程) 的補充. AOP 的主要編程對象是切面(aspect),而切面模塊化橫切關注點.可以通過舉例事務說明

3.Spring MVC 的運行流程

SpringMVC 處理請求過程:
①若一個請求匹配 我們在web.xml中配置的DispatcherServlet 對應的映射路徑, WEB 容器將該請求轉交給 DispatcherServlet 處理
②DispatcherServlet 接收到請求後, 根據請求信息及 HandlerMapping處理器映射器 的配置找到處理請求的處理器(Handler). 可將 HandlerMapping 看成路由控制器,將 Handler 看成
目標主機。
③當 DispatcherServlet 根據 HandlerMapping 得到對應當前請求的Handler 後,通過 HandlerAdapter (處理器適配器)對 Handler 進行封裝,再以統一的適配器接口調用 Handler。
④ 處 理 器 完 成 業 務 邏 輯 的 處 理 後 將 返 回 一 個 ModelAndView 給DispatcherServlet, ModelAndView 包含了視圖邏輯名和模型數據信息
⑤DispatcherServlet,藉助 ViewResoler (視圖解析器)完成邏輯視圖名到真實視圖對象的解析
⑥得到真實視圖對象 View 後, DispatcherServlet 進行視圖渲染將模型數據填到
view中,返回給用戶

4.Spring MVC 常用的註解

@RequestMapping 、 @PathVariable 、 @RequestParam 、 @RequestBoy
@ResponseBody

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章