今天下午去陸金所面試java。問得是java基礎與框架,但是自己沒有背面試寶典,很多都回答不好。
1.hashmap 與 hashtable 的區別 以及 hashmap的實現原理
arraylist與LinkedList 的區別與原理
Comparable和Comparator接口是干什么的?列出它們的區別。
經典的java中return和finally問題!
網上有很多人探討Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被執行?很多人都說不是,當然他們的回答是正確的,經過我試驗,至少有兩種情況下finally語句是不會被執行的:
(1)try語句沒有被執行到,如在try語句之前就返回了,這樣finally語句就不會執行,這也說明了finally語句被執行的必要而非充分條件是:相應的try語句一定被執行到。
(2)在try塊中有System.exit(0);這樣的語句,System.exit(0);是終止Java虛擬機JVM的,連JVM都停止了,所有都結束了,當然finally語句也不會被執行到。
當然還有很多人探討Finally語句的執行與return的關系,頗為讓人迷惑,不知道finally語句是在try的return之前執行還是之后執行?我也是一頭霧水,我覺得他們的說法都不正確,我覺得應該是:finally語句是在try的return語句執行之后,return返回之前執行。
最后總結:finally塊的語句在try或catch中的return語句執行之后返回之前執行且finally里的修改語句可能影響也可能不影響try或catch中 return已經確定的返回值,若finally里也有return語句則覆蓋try或catch中的return語句直接返回。
list 排序 去重 set
2.多線程:volatile 關鍵字與內存可見性 CAS 算法 同步容器類 ConcurrentHashMap鎖分段機制
object 中 的wait sleep notify
寫一個多線程的生產者與消費者的例子
3.jvm 模型 以及類加載機制 棧內存溢出 內存溢出
s0/s1 優缺點 缺點是浪費了一塊存儲空間 優點是方便了碎片整理 內存地址
當一個類加載器收到類加載任務,會先交給其父類加載器去完成,因此最終加載任務都會傳遞到頂層的啟動類加載器,只有當父類加載器無法完成加載任務時,才會嘗試執行加載任務。
采用雙親委派的一個好處是比如加載位於rt.jar包中的類java.lang.Object,不管是哪個加載器加載這個類,最終都是委托給頂層的啟動類加載器進行加載,這樣就保證了使用不同的類加載器最終得到的都是同樣一個Object對象。
4.springMVC 模型原理
1. 用戶發送請求到DispatcherServlet 控制器
2. DispatcherServlet 控制器根據請求路徑到HandlerMapping映射器查詢具體的handler處理器
3. HandlerMapping映射器根據用戶請求查找與之對應的HandlerExecutionChain執行鏈再回傳給DispatcherServlet控制器
4. DispatcherServlet控制器根據handler具體的實現方式調用HandlerAdapter適配器
5. HandlerAdapter適配器調用具體的handler處理器處理業務並返回ModelAndView到DispatcherServlet控制器
6. DispatcherServlet控制器將ModelAndView專遞到ViewResolver視圖解析器
7. ViewResolver視圖解析器 返回具體的視圖到DispatcherServlet控制器
8. DispatcherServlet控制器渲染視圖后響應給用戶
5.springIOC AOP 動態代理機制
l Jdk代理:基於接口的代理,一定是基於接口,會生成目標對象的接口類型的子對象。
l Cglib代理:基於類的代理,不需要基於接口,會生成目標對象類型的子對象。
6.mybatis原理 #、$ 的區別 分頁 resulttype與resultmap的區別
resultType:sql語句的結果集封裝類型
比如 : resultType="User"
看出來了吧,resultType和resultMap都映射到了User對象中
說說不同點吧,resultType 和restltMap
restulyType:
1.對應的是java對象中的屬性,大小寫不敏感,
2.如果放的是java.lang.Map,key是查詢語句的列名,value是查詢的值,大小寫敏感
3.resultMap:指的是定義好了的id的,是定義好的resyltType的引用
注意:用resultType的時候,要保證結果集的列名與java對象的屬性相同,而resultMap則不用,而且resultMap可以用typeHander轉換
4.type:java 對象對應的類,id:在本文件要唯一column :數據庫的列名或別名,property:對應java對象的屬性,jdbcType:java.sql.Types
查詢語句中,resultMap屬性指向上面那個屬性的標簽的id
parameterType:參數類型,只能傳一個參數,如果有多個參數要封裝,如封裝成一個類,要寫包名加類名,基本數據類型則可以省略
5.一對1、一對多時,若有表的字段相同必須寫別名,不然查詢結果無法正常映射,出現某屬性為空或者返回的結果與想象中的不同,而這往往是沒有報錯的。
6.若有意外中的錯誤,反復檢查以上幾點,和認真核查自己的sql語句,mapper.xml文件是否配置正確。
另外還有resultMap 元素,它是 MyBatis 中最重要最強大的元素,它能提供級聯查詢,緩存等功能
原sql語句:
在這里用到了#{},使用#時:
1、用來傳入參數,sql在解析的時候會加上" ",當成字符串來解析 ,如這里 role_id = "roleid";
2、#{}能夠很大程度上防止sql注入;
延伸:
1、用${}傳入數據直接顯示在生成的sql中,如上面的語句,用role_id = ${roleId,jdbcType=INTEGER},那么sql在解析的時候值為role_id = roleid,執行時會報錯;
2、${}方式無法防止sql注入;
3、$一般用入傳入數據庫對象,比如數據庫表名;
4、能用#{}時盡量用#{};
注意:
mybaties排序時使用order by 動態參數時需要注意,使用${}而不用#{};