【面試總結】分享本人作爲一個javaweb方向的後端工程師面試問題

一、Spring MVC和Spring boot有啥區別

1.Spring MVC和Spring Boot都是Spring的一部分,且兩者都是由IOC提供了依賴注入的容器,由AOP解決面相切面編程(IOC和AOP後續會講到),然後在此二者基礎上衍生的高級功能。SpringMVC的配置比Springboot的配置要複雜得多,各種xml和properties配置文件,處理起來比較繁瑣;Springboot他遵循約定優於配置,啥意思呢,就是全都是用默認的配置,這樣極大地降低了Spring使用的門檻。

2.Springboot的涉及面比SpringMVC要廣,Springboot不僅可以集成Spring MVC,還可以集成JPA Security等,如下圖所示:

3.SpringMVC和Sringboot都屬於Spring,SpringMVC是基於Spring的一個MVC框架,Springboot是基於Spring的一套快速開發整合包。

總結:Spring 最初利用“工廠模式”( DI )和“代理模式”( AOP )解耦應用組件。大家覺得挺好用,於是按照這種模式搞了一個 MVC 框架(一些用 Spring 解耦的組件),用開發 web 應用( SpringMVC )。然後有發現每次開發都要搞很多依賴,寫很多樣板代碼很麻煩,於是搞了一些懶人整合包( starter ),這套就是 Spring Boot 。

二、session和cookie的區別

1.session是存在服務器端的,cookie是存在瀏覽器端。

2.cookie相對於session是不安全的。因爲cookie是存在瀏覽器端,別人可以通過分析本地的cookie進行cookie欺騙,如果考慮安全問題,應該使用session。

3.session會在一定時間內存儲在服務器上。如果用戶量較大,會影響服務器性能,考慮到服務器性能因素,可以使用cookie。

4.一般單個cookie不能超過4k。很多瀏覽器設置最多保存20個cookie,而session是無限量的。

三、在HashMap中是如何比較“key”的值的

在HashMap比較兩個key值時,首先使用equals進行比較兩個key的值,如果不同則認爲是兩個不同的key;如果相同,再比較兩個key的hashcode,如果不同,則認爲是兩個不同的key;如果相同則認爲是兩個相同的key,此時的value2會覆蓋value1的值。

四、JDK、JRE、JVM的聯繫與區別

JDK,java development kit,java開發工具包;

JRE,java runtime enviroment,java運行環境;

JVM,java virtual machine,java虛擬機;

在JDK安裝目錄下有一個jre目錄,jre目錄下面有bin和lib兩個文件夾,我們可以認爲bin裏面就是jvm,lib就是jvm運行所需的類庫,jvm和lib結合起來就是jre。

【JDK目錄結構】

【JDK-->JRE目錄結構】

下面我們由下圖來描述一下三者關係:

1.JDK提供開發工具包,編譯都是在JDK中進行的(由.java編譯爲.class),但運行不是在JDK中進行;

2.JRE由JVM和類庫組成,

3.JVM藉助jre提供的類庫,運行.Java程序,java做到跨平臺的特性,就是由於不同的平臺擁有不同的JVM或JDK,才得以實現。

五、如果main方法被聲明爲private會怎樣?

我們想一下,如果如果類中沒有main方法,會怎麼樣?當然是沒啥問題!

如果將修飾符改爲private,其實也沒啥問題。

如果將修飾符改爲private,就相當於我們自己定義了一個方法,名字叫main,當我們運行這個類的時候,會提示我們“找不到main方法,請將main方法定義爲public static void main(String[] args)”,因爲這裏只有我們自定義的一個private main方法,而沒有系統默認的public main方法

如果這時我們再寫一個public static void main(String[] args),這時候也會報錯,因爲已經存在了一個private static void main(String[] args),同一個類中不能存在方法名和參數相同的兩個方法,因爲重載的定義爲“方法名相同,參數不同的兩個方法叫重載”,所以和修飾符無關。

六、&和&&有啥區別

1.&是位運算符,按二進制進行運算

比如5 & 4就是將5和4分別轉換爲二進制5(00000101)和二進制4(00000100)進行“與”運算。我們順便提一下&(與)、“~”(非)、“|”(或)、“^”(異或)四種運算符規則:

【均需要轉換成二進制】

運算符 運算方式
&(與) 兩個數轉換爲二進制,然後從高位開始比較,如果所比較的兩個數都是1則爲1,否則爲0
|(或) 兩個數轉換爲二進制,然後從高位開始比較,如果所比較的兩個數有一個是1則爲1,否則爲0
~(非) 如果該爲爲0,結果是1;如果該爲是1,結果爲0
^(異或) 兩個數轉換爲二進制,然後從高位開始比較,兩個數相同爲0,不同

例:

2.&&是邏輯運算符,比較兩個Boolean表達式。

&&運算符對兩個Boolean表達式進行比較,當比較的兩個均爲true時,結果纔是true,有一個false,結果就是false。

並且&&運算符具有短路功能,如果比較的前者爲false,&&後面將不會運行,如果爲true,將會繼續運行&&後面的代碼;

||運算符同樣具有短路功能。

七、char類型的變量能不能存儲一箇中文?爲什麼

答案是可以的,但是兩個中文不行。因爲char佔兩個字節,一箇中文也佔兩個字節,所以是可以存儲的。

八、a=a+b和a+=b的區別

a=a+b是先進行“+”運算,然後進行賦值運算,如果當a(short)與b(int)的類型不同時,會報錯,若進行強轉,可能會導致精度丟失。

a+=b中,“+=”是一個運算符,而不是兩個,所以在運算時 會進行自動類型轉換。

總結一下,在兩個變量的數據類型一樣時:a+=b 和a=a+b 是沒有區別的。

但是當兩個變量的數據類型不同時,就需要考慮一下數據類型自動轉換的問題了。

也就是涉及到精度了。

這裏順便提一下,如何解決浮點型精度丟失的問題。

使用BigDecimal即可,具體使用方法可參考這個鏈接https://www.cnblogs.com/chenssy/archive/2012/09/09/2677279.html

九、sql查詢出重複值系列

1、查找多餘的重複記錄,重複記錄是根據字段username進行判斷:

SELECT
	*
FROM
	student
WHERE
	username IN (
		SELECT
			username
		FROM
			student
		GROUP BY
			username
		HAVING
			count(username) > 1
	)

查詢結果如下:

2、刪除表中多餘的重複記錄,重複記錄是根據單個字段username進行判斷,並且只保留rowid最小的記錄:

 

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