找工做時,被問及專業相關問題,固然基本上也是基礎類問題,被問到了仍是要記錄下來java
一、mysql中 # 和 $ 有何區別?(在項目開發中用 #{} 比較多,爲何呢)mysql
例如:spring
select * from table where name=#{name}
針對這個簡單的查詢語句,若傳入的值爲 張三,則解析成的sql就是這樣的:sql
select * from table where name="張三"
如上面的查詢語句,用 name=${name},那麼sql在解析的時候值爲name=name,執行時就會報錯數據庫
延伸:mybatis排序時,使用order by動態參數時須要注意,使用${} 而不用 #{}編程
二、spring和springBuffer及springBuilder區別?安全
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是可變的,它不是線程安全的
StringBuffer是可變的,它是線程安全的,因此它的開銷比StringBuilder大
注:通常這三個選用的順序是: StringBuilder > StringBuffer > String
三、重載overload和重寫override區別?
表示同一個類中能夠有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不一樣)
應用場景:當方法功能類似,但須要傳遞不一樣的參數
表示子類中的方法能夠與父類中的某個方法的名稱和參數徹底相同;
經過子類建立的實例對象調用這個方法時,將調用子類中的定義方法,這至關於把父類中定義的那個徹底相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現;
子類覆蓋父類方法時,只能比父類中拋出更少的異常,或者是拋出父類拋出異常的子異常,由於子類能夠解決父類的一些問題,不能比父類有更多的問題;
子類方法的訪問權限只能比父類更大,不能更小。若是父類的方法是private類型,那麼子類則不存在覆蓋的限制,至關於子類中增長了一個全新的方法。
應用場景:子類有本身特有的行爲,從父類繼承而不能知足自身須要時。
注:重載和重寫都是多態的表現,前者是編譯器的多態,後者是運行期多態