每日十道面試題(十)

1.throw 和 throws 的區別?

● throw:

throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理。

throw是具體向外拋出異常的動作,所以它拋出的是一個異常實例,執行throw一定是拋出了某種異常。

一般自定義異常我們也用throw new 類來拋出

● throws:

throws語句是用在方法聲明後面,表示如果拋出異常,由該方法的調用者來進行異常的處理。

throws主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。

● throws表示出現異常的一種可能性,並不一定會發生這種異常。

2.Java 異常處理機制的理解?

Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類爲 java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception

Error表示應用程序本身無法克服和恢復的一種嚴重問題。

Exception表示程序還能夠克服和恢復的問題,其中又分爲系統異常和普通異常。

系統異常是軟件本身缺陷所導致的問題,也就是軟件開發人員考慮不周所導致的問題,軟件使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟件系統繼續運行或者讓軟件死掉,例如,數組下標越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉換異常(ClassCastException)。

普通異常是運行環境的變化或異常所導致的問題,是用戶能夠克服的問題,例如,網絡斷線,硬盤空間不夠,發生這樣的異常後,程序不應該死掉。

Java爲系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try…catch處理或用throws聲明繼續拋給上層調用方法處理,所以普通異常也稱爲checked異常,而系統異常可以處理也可以不處理,所以編譯器不強制用try…catch處理或用throws聲明,所以系統異常也稱爲unchecked異常。

unchecked=系統異常可以處理也可以不處理

弄懂了上面這個,那來看下一個面試題,應該就迎刃而解了

3.error和exception的區別?

Error類和Exception類的父類都是Throwable類,他們的區別如下:

● Error類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢出等。對於這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和預防,遇到這樣的錯誤,建議讓程序終止。

● Exception類表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該儘可能處理異常,使程序恢復運行,而不應該隨意終止異常。

●Exception類又分爲未檢查異常(UnCheckedException)和受檢查的異常(CheckedException)。運行時異常ArithmeticException,IllegalArgumentException編譯能通過,但是一運行就終止了,**程序不會處理運行時異常,出現這類異常,**程序會終止。而受檢查的異常,要麼用 try…catch 捕獲,要麼用throws字句聲明拋出,交給它的父類處理,否則編譯不會通過。

4.簡述數據庫事務和實際工作中的作用?

所謂事務是用戶定義的一個數據庫操作序列,這些操作要麼全做要麼全不做,是一個不可分割的工作單位。

事務的ACID可以扯一下,下面講個例子

例如在關係數據庫中,一個事務可以是一條 SQL 語句、一組 SQL 語句或整個程序。簡單舉個例子就是你要同時修改數據庫中兩個不同表的時候,如果它們不是一個事務的話,當第一個表修改完,可是第二表改修出現了異常而沒能修改的情況下,就只有第二個表回到未修改之前的狀態,而第一個表已經被修改完畢。而當你把它們設定爲一個事務的時候,當第一個表修改完,可是第二表改修出現了異常而沒能修改的情況下,第一個表和第二個表都要回到未修改的狀態!這就是所謂的事務回滾。

例如,在將資金從一個帳戶轉移到另一個帳戶的銀行應用中,一個帳戶將一定的金額貸記到一個數據庫表中,同時另一個帳戶將相同的金額借記到另一個數據庫表中。由於計算機可能會因停電、網絡中斷等而出現故障,因此有可能更新了一個表中的行,但沒有更新另一個表中的行。如果數據庫支持事務,則可以將數據庫操作組成一個事務,以防止因這些事件而使數據庫出現不一致。如果事務中的某個點發生故障,則所有更新都可以回滾到事務開始之前的狀態。如果沒有發生故障,則通過以完成狀態提交事務來完成更新。

5. 你對MyBatis的一級緩存和二級緩存有了解嗎,說一下?

Mybatis對緩存提供支持,但是在沒有配置的默認情況下,它只開啓一級緩存**,一級緩存只是相對於同一個SqlSession而言**。所以在參數SQL完全一樣的情況下,我們使用同一個SqlSession對象調用一個Mapper方法,往往只執行一次SQL,因爲使用SqlSession第一次查詢後,MyBatis會將其放在緩存中,以後再查詢的時候,如果沒有聲明需要刷新,並且緩存沒有超時的情況下,SqlSession都會取出當前緩存的數據,而不會再次發送SQL到數據庫。

MyBatis的二級緩存是Application級別的緩存,它可以提高對數據庫查詢的效率,以提高應用的性能。SqlSessionFactory層面上的二級緩存默認是不開啓的,二級緩存的開啓需要進行配置,實現二級緩存的時候,MyBatis要求返回的POJO必須是可序列化的。 也就是要求實現Serializable接口,配置方法很簡單,只需要在映射XML文件配置就可以開啓緩存了

由於我們在實際的開發中目前都會使用第三方的緩存技術,例如Redis,所以MyBatis這塊的二級緩存沒有太多的瞭解。

6.ThreadLocal 的原理和應用場景

每一個ThreadLocal能夠放一個線程級別的變量,可是它本身能夠被多個線程共享使用,並且又能夠達到線程安全的目的,且絕對線程安全。

實際上ThreadLocal你可以想成全局變量,同一個線程的類都可以訪問到裏面的數據,它的Api有remove ,get ,set方法

他如何做到當前線程全局共享呢?

他的api裏面,都會判斷一個map裏面的值是不是爲空,其實底層是一個ThreadLocalMap,然後ThreadLocalMap是ThreadLocal裏面的內部類。放在了Thread類裏面作爲一個屬性而存在,

ThreadLocal本身成爲這個Map裏面存放的Key,用戶輸入的值是Value。數據本身就放在這個線程裏面,自然能夠做到當前線程共享

簡單來講,就是這個Map對象在Thread裏面作爲私有的變量而存在,所以是線程安全的。ThreadLocal通過Thread.currentThread()獲取當前的線程就能得到這個Map對象。同一時候將自身作爲Key發起寫入和讀取,因爲將自身作爲Key所以一個ThreadLocal對象就能存放一個線程中相應的Java對象。通過get也自然能找到這個對象。

ThreadLocal的應用場景:最常見的ThreadLocal使用場景爲用來解決數據庫連接、Session 管理等在Spring中他在內部創建了連接對象,然後放入到ThcreadLocal,然後又能根據它最後訪問到連接可以控制關閉,實現了連接從創建到銷燬的控制,而單例正好保證了上下文連接都是唯一的。

private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {  
    public Connection initialValue() {  
        return DriverManager.getConnection(DB_URL);  
    }  
};  
  
public static Connection getConnection() {  
    return connectionHolder.get();  
}  

ps:當entry對象多了,map長度很長,遍歷效率變差所以個人覺得這個只適合少量值用作共享,

7.簡述 TCP 的三次握手

在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接。

● 第一次握手:建立連接時,客戶端發送 syn 包(syn=j)到服務器,並進入 SYN_SEND 狀態, 等待服務器確認; SYN:同步序列編號(Synchronize Sequence Numbers)。

● 第二次握手:服務器收到 syn 包,必須確認客戶的 SYN(ack=j+1),同時自己也發送一個 SYN 包(syn=k),即SYN+ACK 包,此時服務器進入 SYN_RECV 狀態。

● 第三次握手:客戶端收到服務器的 SYN+ACK 包,向服務器發送確認包 ACK(ack=k+1),此包發送完畢,客戶端和服務器進入 ESTABLISHED 狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據

爲什麼不是兩次?或者4次

首先4次就沒必要了,因爲第二次傳過來客戶端已經知道你服務器連接上了第三次發個包給服務器說明連接上了服務器,如果服務器沒收到,那麼就是客戶端沒連接上,即使有4次連接也一樣所以沒必要4次以上,如果收到客戶端的包,那就連接成功了,4次也沒必要,因爲已經雙方都確認了連接。

爲什麼不是兩次,首先客戶端到服務器的第一次握手肯定不能少這個是告訴服務器我們要進行連接了進入接收狀態,服務器返回給客戶端第二次客戶端知道服務器連接上它了,如果不要第三次,那麼服務器不知道你客戶端是否知道我連接上你,那麼發包過程錯誤也會不知道,坦白來講,第一次是就緒,二三次是互相確認

8.SpringMVC request接收設置是線程安全的嗎?

是線程安全的,request、response 以及 requestContext 在使用時不需要進行同步。而根據 spring的默認規則,controller對於BeanFactory而言是單例的。即controller只有一個, controller 中的request等實例對象也只有一個。

9.談談你對ajax的認識?

Ajax是一種創建交互式網頁應用的的網頁開發技術;AsynchronousJavaScriptandXML的縮寫。

Ajax的優勢:通過異步模式,提升了用戶體驗。優化了瀏覽器和服務器之間的傳輸,減少不必要的數據往返,減少了帶寬佔用。Ajax引擎在客戶端運行,承擔了一部分本來由服務器承擔的工作,從而減少了大用戶量下的服務器負載。

Ajax的最大特點:可以實現局部刷新,在不更新整個頁面的前提下維護數據,提升用戶體驗度

10.jsonp原理是什麼?

JavaScript是一種在Web開發中經常使用的前端動態腳本技術。在JavaScript中,有一個很重要的安全性限制,被稱爲“Same-OriginPolicy”(同源策略)。這一策略對於JavaScript代碼能夠訪問的頁面內容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內容。

JavaScript這個安全策略在進行多iframe或多窗口編程、以及Ajax編程時顯得尤爲重要。根據這個策略,在baidu.com下的頁面中包含的JavaScript代碼,不能訪問在google.com域名下的頁面內容;甚至不同的子域名之間的頁面也不能通過JavaScript代碼互相訪問。對於Ajax的影響在於,通過XMLHttpRequest實現的Ajax請求,不能向不同的域提交請求,例如,在abc.example.com下的頁面,不能向def.example.com提交Ajax請求,等等。然而,當進行一些比較深入的前端編程的時候,不可避免地需要進行跨域操作,這時候“同源策略”就顯得過於苛刻。JSONP跨域GET請求是一個常用的解決方案,下面我們來看一下JSONP跨域是如何實現的,並且探討下JSONP跨域的原理。jsonp的最基本的原理是:動態添加一個script標籤,使用script標籤的src屬性沒有跨域的限制特點。首先在客戶端註冊一個callback,然後把callback的名字傳給服務器。此時,服務器先生成json數據。然後以javascript語法的方式,生成一個function,function名字就是傳遞上來的參數jsonp。最後將json數據直接以入參的方式,放置到function中,這樣就生成了一段js語法的文檔,返回給客戶端。客戶端瀏覽器,解析script標籤,並執行返回的javascript文檔,此時數據作爲參數,傳入到了客戶端預先定義好的callback函數裏

方法傳參進來的方式,可以繞過同源策略

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