談面試中被提問的面試問題(一)

找工做時,被問及專業相關問題,固然基本上也是基礎類問題,被問到了仍是要記錄下來java

一、mysql中 # 和 $ 有何區別?(在項目開發中用 #{} 比較多,爲何呢)mysql

  • #{} 表示一個佔位符號,經過#{}能夠實現preparedStatement向佔位符中設置值,自動進行java類型和jdbc類型轉換,傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號

例如:spring

select * from table where name=#{name}

針對這個簡單的查詢語句,若傳入的值爲 張三,則解析成的sql就是這樣的:sql

select * from table where name="張三"
  •  #{} 能夠有效的防止sql注入
  • ${} 表示拼接sql串,經過${}能夠將parameterType傳入的內容拼接在sql中且不進行jdbc類型轉換

如上面的查詢語句,用 name=${name},那麼sql在解析的時候值爲name=name,執行時就會報錯數據庫

  • ${} 方式沒法防止sql注入,如驗證用戶名時經過 name=${abc or 1=1} 就能夠實現sql注入的目的
  • ${} 通常用於傳入數據庫對象,好比數據庫表名

延伸:mybatis排序時,使用order by動態參數時須要注意,使用${} 而不用 #{}編程

二、spring和springBuffer及springBuilder區別?安全

  • String 

String對象是不可變的。String類中每個看起來會修改String值的方法(如upcase等),實際上都是建立了一個全新的String對象,以包含修改後的字符串內容,而最初的String對象絲毫未動mybatis

特殊點注意:app

String中的「+」和「+=」是java中僅有的兩個重載過的操做符,它在字符串相加的時候有特殊意義,例:ide

String heart = "I" + "LOVE" + "YOU";

這段代碼是如何工做的呢?

根據咱們說String對象是不可變的,是否是應該這樣:

String建立了一個新的對象來接收「I」和「LOVE」組合起來的新字符串,而後在創個對象來接受「ILOVE」和"YOU"組成的對象。

分析:

可若是是這樣的話,就會產生一堆須要GC(垃圾回收)的對象,這樣的話性能確定至關糟糕。但是呢,它並非像上面那樣子的

實際上:

當你使用「+」鏈接字符串的時候,編譯器會自動引入 java.lang.StringBuilder 類。雖然咱們在源碼中並無使用StringBuilder類,但編譯器去自做主張的使用了它,由於它更加高效。編譯器會建立一個StringBuilder對象,併爲每一個字符串調用一次append()方法,而StringBuilder是可變的,所以它在這個過程當中只建立了一個對象。

再看看這段代碼:

String you="you";
String me="me";
for(int i=0;i<5;i++){
      me += you;
}

是否是每次循環都會建立一個StringBuilder對象。因此說,若是字符串操做簡單,那就能夠信賴編譯器優化,但若是是在循環中,那最好本身建立一個StringBuilder對象,用StringBuilder的append等方法去操做會方便些。

  • StringBuilder

StringBuilder是可變的,它不是線程安全的

  • StringBuffer

StringBuffer是可變的,它是線程安全的,因此它的開銷比StringBuilder大

注:通常這三個選用的順序是: StringBuilder > StringBuffer > String

 三、重載overload和重寫override區別?

  • 重載overload

表示同一個類中能夠有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不一樣)

應用場景:當方法功能類似,但須要傳遞不一樣的參數

  • 重寫override

表示子類中的方法能夠與父類中的某個方法的名稱和參數徹底相同;

經過子類建立的實例對象調用這個方法時,將調用子類中的定義方法,這至關於把父類中定義的那個徹底相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現;

子類覆蓋父類方法時,只能比父類中拋出更少的異常,或者是拋出父類拋出異常的子異常,由於子類能夠解決父類的一些問題,不能比父類有更多的問題;

子類方法的訪問權限只能比父類更大,不能更小。若是父類的方法是private類型,那麼子類則不存在覆蓋的限制,至關於子類中增長了一個全新的方法。

應用場景:子類有本身特有的行爲,從父類繼承而不能知足自身須要時。

注:重載和重寫都是多態的表現,前者是編譯器的多態,後者是運行期多態

相關文章
相關標籤/搜索