java知識片段

          在面試中,經常要評估面試者的java基礎知識和其他知識的掌握情況,包括public/private/protected/默認修飾符、static/final修飾符、集合、字符串操作、對象比較、異常、設計模式和面試者經常使用的框架等,整理一下自己經常使用的評估方法,:),拋磚中,希望能看到一些好的建議,讓大家更好的學習java知識,同時也更好的判斷人才,挖出真正的“金子”。
          在面試中我更喜歡用一些實際的題目來看面試者對于知識的真正掌握情況,而不是直接問理論,理論的話很多時候都是背出來的,只有在真正的實戰中能結合這些理論,那么才是真正的掌握了。
          1、public/private/protected/默認修飾符
             有如下一段程序:
             package a.b.c;
             public class Test{
                 String name="BlueDavy";
                 protected String desc="blog.bluedavy.cn";
             }
             package a.b.c;
             public class TestA{
                 private String name;
                 private String desc;
                 public TestA(){
                     Test test=new Test();
                     name=test.name;
                     desc=test.desc;
                 }
             }
             package a.b.c.d;
             public class TestB{
                  private String name;
                  private String desc;
                  public TestB(){
                     Test test=new Test();
                     name=test.name;
                     desc=test.desc;
                  }
             }
             package a.b.c.d;
             import a.b.c.Test;
             public class TestC extends Test{
                  private String cname;
                  private String cdesc;
                  public TestC(){
                     cname=name;
                     cdesc=desc;
                  }
             }
             請問以上TestA、TestB、TestC能編譯過嗎,如編譯不過,原因是什么?
          2、static/final修飾符
             有如下一段程序:
             package a.b.c;
             public class Test{
                 private static int i=0;
                 public int getNext(){
                    return i++;
                 }
             }
             package a.b.c;
             public class TestB{
                 public static void main(String[] args){
                     Test test=new Test();
                     System.out.println(test.getNext());
                     Test testObject=new Test();
                     System.out.println(testObject.getNext());
                     System.out.println(test.getNext());
                 }
             }
             請問最后打印出來的是什么,為什么?(這里其實還潛在的考察了i++和++i的不同)   
          3、集合
             有這樣一段程序:
             package a.b.c;
             public class Test{
                 public static void main(String[] args){
                     List list=new ArrayList();
                     list.add("a");
                     list.add("b");
                     list.add("a");
                     Set set=new HashSet();
                     set.add("a");
                     set.add("b");
                     set.add("a");
                     System.out.println(list.size());
                     System.out.println(set.size());
                 } 
             }
             請問運行上面的程序后會打印出的是什么,為什么?
          4、字符串操作
             有這么一段程序:
                     String a=new String("a");
                     String b="b";
                     String c=a+b;
                     StringBuffer strBuf=new StringBuffer();
                     strBuf.append("a");
                     strBuf.append("b");
                     String d=strBuf.toString();
                     StringBuilder strBuilder=new StringBuilder();
                     strBuilder.append("a");
                     strBuilder.append("b");
                     String e=strBuilder.toString();
             請問以上程序片段中c、d、e的字符串的創建各有什么不同?
          5、對象比較
             有這么一段程序:
             package a.b.c;
             public class Test{
                 public String name="BlueDavy";
             }
             package a.b.c;
             public class TestA{
                 public static void main(String[] args){
                     Test test=new Test();
                     Test testB=new Test();
                     System.out.println(test.equals(testB));
                     System.out.println(test.name.equals(testB.name));
                 }
             }
             請問以上程序執行的結果是,為什么?
             潛在問題,如要test.equals(testB)為true,需要怎么做?
          6、異常
             有這樣一段程序:
             package a.b.c;
             public class TestException extends Exception{
                 public TestException(String message){
                     super(message);
                 }
             };
             package a.b.c;
             public class Test{
                 public void call(int state) throws IllegalStateException{
                     if(state==0)
                        throws new IllegalStateException("state is 0");
                 }
                 public void invoke(int state) throws TestException{
                     if(state==0)
                        throws new TestException("state is 0");
                 }
             }
             package a.b.c;
             public class TestA{
                 public static void main(String[] args){
                      Test test=new Test();
                      test.call(0);
                      test.invoke(0);
                 }
             }
             請問以上的TestA有問題嗎,如沒問題執行的結果是?
          以上的這些題目更多的是從基礎層面去考慮,而且也只是考察了相應知識點的片面的部分,當面試者能正確的過掉這個基礎關后,完全可以更加深入的交流這些基礎知識,例如可以拿實際程序的題目來繼續問集合中HashMap和Hashtable的不同(甚至還可以引入并發場景)、JVM是如何存儲HashMap的key和value的、當存儲的內容超過了HashMap的容量時,jvm會怎么做等問題。
          除了這些基礎知識外,還可以進一步評估對于java io、java thread、java concurrent、java net、java NIO等package的掌握程度。
          更進一步,可以繼續評估面試者對于JMX、JNDI、JTA、RMI、Java classloader、反射、動態代理、GC、JVM內存分配等更為深入的領域的掌握程度,當然,問的問題需要根據所需招的崗位的知識體系來定。
          而設計模式也是在面試時經常會考察的一點:
          例如單態模式,可以請面試者直接手寫一段單態模式的代碼,然后針對代碼可以問些不同的問題,例如有用同步方式寫的,可以問如何減少getInstance的鎖競爭等問題。
          進而可以評估面試者對于更復雜的組合模式以及相關實現技術的掌握程度,例如MVC模式,可以請面試者說出假設不用任何開源的MVC框架,而是自己寫,那么這個時候提交的request的整個處理流程是怎么樣的,如果面試者答的不錯的話,可以繼續問這其中涉及的例如配置文件解析、反射等等問題,另外還可以評估下面試者自己的想法,同樣還有像事件機制如何實現、提供出3個spring bean xml,在沒有spring的情況下怎么將xml中定義的bean初始化并且將所有的依賴注入等等問題。
          在和面試者交流了這些后,可以交流下面試者在其熟悉的框架上的掌握程度。
          還有一點最需要評估的是面試者對于技術的興趣程度,在面試過程中要注意察言觀色,再結合一些技術興趣方面的問題,基本就可以判斷出來了,例如對于技術感興趣的很多會研究一些冷門的技術、對于所感興趣的技術會有比較多的了解、或用技術做一些好玩的東西等等。
          以上所有的問題更多的是面試官根據企業的需求來進行主動的提問,在最后應該問問面試者是否有未問到的,但面試者自己認為比較熟悉的領域,如果有的話,也應進行交流,以能夠更加準確的評估面試者,但畢竟面試的時間通常不會太長,問的問題必然會出現片面性,這個時候面試就存在了一定的運氣成分,因此要很準確的評估是很難做到的,多數的面試方法都是通過多輪面試的方法,以盡量更加準確的進行評估,:)。

          posted on 2008-10-16 23:41 BlueDavy 閱讀(6599) 評論(16)  編輯  收藏 所屬分類: Java

          評論

          # re: java知識片段 2008-10-17 00:20 Kane

          總結的很好!  回復  更多評論   

          # re: java知識片段[未登錄] 2008-10-17 01:04 trace

          不錯 都是很基本的東西 ,不過很有用   回復  更多評論   

          # re: java知識片段 2008-10-17 09:07 yeshucheng

          這題目咋看不難,但是很有陷阱。。。哈哈
          確實不錯,四個作用域都考到了。

          其實還可以測試類的調用順序  回復  更多評論   

          # re: java知識片段 2008-10-17 09:17 foy

          可惜沒遇到博主這樣好的面試官啊  回復  更多評論   

          # re: java知識片段 2008-10-17 10:23 YYX

          1.testB不過
          2.0 1 2
          3. 3 2
          4.只不過想比較下stringbuilder和stringbuffer不同吧,那就是線程安全性上區別而已,另外這里c和e創建過程是一樣的.
          5.false,true,如要test.equals(testB)為true就重寫equals方法,讓他對name比較.
          6.call方法和TestA都有問題,call方法聲明了個RuntimeException作為未捕獲異常是編譯不過的,TestA的main方法則沒有捕獲聲明的TestException.

          能過面試不?  回復  更多評論   

          # re: java知識片段 2008-10-17 10:24 YYX

          是自己想出來的面試題吧?其實可以參考scjp的題出。  回復  更多評論   

          # re: java知識片段 2008-10-17 10:42 galaxystar

          @YYX
          接下來幾題, 還考察了 string pool.
            回復  更多評論   

          # re: java知識片段[未登錄] 2008-10-17 11:19 henry1451

          這些題對于有了一,二年開發經驗的人來說,都不在話下,但面試的時候,在說明問題的原因時,有些面試者可能說的不太準確,但不妨礙使用,比如第4題,呵呵.  回復  更多評論   

          # re: java知識片段 2008-10-17 14:38 Kane

          @YYX
          5, 要同時重載hashCode(), equals()  回復  更多評論   

          # re: java知識片段[未登錄] 2008-10-17 18:43 小xiong

          其實都是些基礎的知識,但是又有難度。

          等自己畢業后出去找工作,要好好的多看這一類面試題目。

          同時也要謝謝博主,對于我這樣未畢業的大學生來說,實在好東西。

          謝謝您了!  回復  更多評論   

          # re: java知識片段 2008-10-17 18:53 yeshucheng

          這里第三題個人覺得沒有考出水平,其實可以結合hashCode(),equals()來做把Set提煉出來  回復  更多評論   

          # re: java知識片段 2008-10-18 11:53 fangfeimengxiang

          請問JAVA 學什么啊
          最初學什么知識啊
          我學JAVA的怎么從計算機基礎學啊
          到現在還不知道是JAVA  回復  更多評論   

          # re: java知識片段 2008-10-23 18:07 ic

          @YYX
          1. TestC也過不了的,因為對name的訪問超過了包訪問權限  回復  更多評論   

          # re: java知識片段 2008-10-23 18:12 ic

          @YYX
          5. 重寫equals()方法,才能使之相等,根據Object的equals()的規約
          if a.equals(b) -> a.hashCode()==b.hashCode()
          所以要把兩個方法都重寫了。  回復  更多評論   

          # re: java知識片段 2008-10-23 18:13 ic

          哎,就要找工作了,還有很多知識不曉得啊。。  回復  更多評論   

          # re: java知識片段 2009-01-23 11:45 MyYate

          if(state==0)
          throws new IllegalStateException("state is 0");
          這個肯能是筆誤吧,throws=》throw

          對于這個問題?
          在沒有spring的情況下怎么將xml中定義的bean初始化并且將所有的依賴注入等等問題、
          這個我想肯定也是和spring方式一樣,全部預先讀取,然后初始化,注入(這兩步也是分單例和原型的)、
          我想請問樓主,這個您是想考察面試者哪些方面的知識?  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2008年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 灵宝市| 青海省| 高淳县| 抚顺县| 南靖县| 公安县| 额敏县| 文安县| 新绛县| 沂源县| 平和县| 嘉兴市| 上饶市| 东兰县| 新泰市| 石狮市| 沧州市| 翼城县| 宝兴县| 平阳县| 萨嘎县| 双峰县| 琼中| 泌阳县| 阿克| 鹤峰县| 阿鲁科尔沁旗| 收藏| 云梦县| 子长县| 丰镇市| 开封县| 五华县| 镇原县| 新平| 南投市| 镇坪县| 华宁县| 昭通市| 汉阴县| 周至县|