陸金所面試題


今天下午去陸金所面試java。問得是java基礎與框架,但是自己沒有背面試寶典,很多都回答不好。

1.hashmap 與 hashtable 的區別 以及 hashmap的實現原理

arraylist與LinkedList 的區別與原理

ComparableComparator接口是干什么的?列出它們的區別。

經典的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

寫一個多線程的生產者與消費者的例子 

方法一:   wait()  和   notify()   通信方法實現
 
看盒子代碼
        public class PublicBox { 
           private int apple = 0;     
           public synchronized void increace() { 
               while (apple ==5) { 
                   try { 
                       wait(); 
                   } catch (InterruptedException e) { 
                       e.printStackTrace(); 
                   } 
                  
               } 
               apple++; 
               System.  out .println("生成蘋果成功!" );
               notify(); 
           }       
           public synchronized void decreace() { 
               while (apple ==0) { 
                   try { 
                       wait(); 
                   } catch (InterruptedException e) { 
                       e.printStackTrace(); 
                   } 
               } 
               apple--; 
              System.  out.println( "消費蘋果成功!" );
               notify(); 
           } 
          
           public static void main(String []args)
              {
                     PublicBox box= new PublicBox();
                     
                     Consumer con= new Consumer(box);
                     Producer pro= new Producer(box);
                     
                     Thread t1= new Thread(con);
                     Thread t2= new Thread(pro);
                     
                     t1.start();
                     t2.start();
                     
                     
              }
       }
  
生產者代碼(定義十次):
 
public class Producer implements Runnable { 
    private PublicBox box; 
 
    public Producer(PublicBox box) { 
        this .box = box; 
    } 
 
    @Override 
    public void run() { 
       
        for( int i=0;i<10;i++)  
       {
               try {
                     System.  out .println("pro  i:" +i);
                           Thread.  sleep(30);
                     } catch (InterruptedException e) {
                            // TODO: handle exception
                           e.printStackTrace();
                     }
       
            box.increace(); 
       }
        
    } 
}
 
消費者代碼(同樣十次):
 
public class Consumer implements Runnable { 
    private PublicBox box; 
 
    public Consumer(PublicBox box) { 
        this .box = box; 
    } 
 
    @Override 
    public void run() { 
       
        for( int i=0;i<10;i++)
       {
             try {
                     System.  out .println("Con: i " +i);
                           Thread.  sleep(3000);                 // 這里設置跟上面30不同是為了 盒子中的蘋果能夠增加,不會生產一個馬上被消費  
                     } catch (InterruptedException e) {
                            // TODO: handle exception
                           e.printStackTrace();
                     }
       
            box.decreace(); 
        } 
 } 
}
 
輸出如下:
 
pro  i:0
Con: i 0
生成蘋果成功!
pro  i:1
生成蘋果成功!
pro  i:2
生成蘋果成功!
pro  i:3
生成蘋果成功!
pro  i:4
生成蘋果成功!
pro  i:5
消費蘋果成功!
Con: i 1
生成蘋果成功!
pro  i:6
消費蘋果成功!
Con: i 2
生成蘋果成功!
pro  i:7
消費蘋果成功!
生成蘋果成功!
pro  i:8
Con: i 3
消費蘋果成功!
生成蘋果成功!
pro  i:9
Con: i 4
消費蘋果成功!
生成蘋果成功!
Con: i 5
消費蘋果成功!
Con: i 6
消費蘋果成功!
Con: i 7
消費蘋果成功!
Con: i 8
消費蘋果成功!
Con: i 9
消費蘋果成功!

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處理器處理業務並返回ModelAndViewDispatcherServlet控制器

6. DispatcherServlet控制器將ModelAndView專遞到ViewResolver視圖解析器

7. ViewResolver視圖解析器 返回具體的視圖到DispatcherServlet控制器

8. DispatcherServlet控制器渲染視圖后響應給用戶

5.springIOC   AOP  動態代理機制

l Jdk代理:基於接口的代理,一定是基於接口,會生成目標對象的接口類型的子對象。

l Cglib代理:基於類的代理,不需要基於接口,會生成目標對象類型的子對象。

6.mybatis原理   #、$ 的區別  分頁 resulttype與resultmap的區別

 

resultTypesql語句的結果集封裝類型   

比如 :    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語句:

[sql] 
           <span style= "font-size:18px;">
           delete from   ups_role_permission_dataparams   where role_id = #{roleId,jdbcType=INTEGER}
         </span>  

在這里用到了#{},使用#時:

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 動態參數時需要注意,使用${}而不用#{};

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM