在面試中,經(jīng)常要評估面試者的java基礎知識和其他知識的掌握情況,包括public/private/protected/默認修飾符、static/final修飾符、集合、字符串操作、對象比較、異常、設計模式和面試者經(jīng)常使用的框架等,整理一下自己經(jīng)常使用的評估方法,:),拋磚中,希望能看到一些好的建議,讓大家更好的學習java知識,同時也更好的判斷人才,挖出真正的“金子”。
在面試中我更喜歡用一些實際的題目來看面試者對于知識的真正掌握情況,而不是直接問理論,理論的話很多時候都是背出來的,只有在真正的實戰(zhàn)中能結(jié)合這些理論,那么才是真正的掌握了。
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的字符串的創(chuàng)建各有什么不同?
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));
}
}
請問以上程序執(zhí)行的結(jié)果是,為什么?
潛在問題,如要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有問題嗎,如沒問題執(zhí)行的結(jié)果是?
以上的這些題目更多的是從基礎層面去考慮,而且也只是考察了相應知識點的片面的部分,當面試者能正確的過掉這個基礎關后,完全可以更加深入的交流這些基礎知識,例如可以拿實際程序的題目來繼續(xù)問集合中HashMap和Hashtable的不同(甚至還可以引入并發(fā)場景)、JVM是如何存儲HashMap的key和value的、當存儲的內(nèi)容超過了HashMap的容量時,jvm會怎么做等問題。
除了這些基礎知識外,還可以進一步評估對于java io、java thread、java concurrent、java net、java NIO等package的掌握程度。
更進一步,可以繼續(xù)評估面試者對于JMX、JNDI、JTA、RMI、Java classloader、反射、動態(tài)代理、GC、JVM內(nèi)存分配等更為深入的領域的掌握程度,當然,問的問題需要根據(jù)所需招的崗位的知識體系來定。
而設計模式也是在面試時經(jīng)常會考察的一點:
例如單態(tài)模式,可以請面試者直接手寫一段單態(tài)模式的代碼,然后針對代碼可以問些不同的問題,例如有用同步方式寫的,可以問如何減少getInstance的鎖競爭等問題。
進而可以評估面試者對于更復雜的組合模式以及相關實現(xiàn)技術的掌握程度,例如MVC模式,可以請面試者說出假設不用任何開源的MVC框架,而是自己寫,那么這個時候提交的request的整個處理流程是怎么樣的,如果面試者答的不錯的話,可以繼續(xù)問這其中涉及的例如配置文件解析、反射等等問題,另外還可以評估下面試者自己的想法,同樣還有像事件機制如何實現(xiàn)、提供出3個spring bean xml,在沒有spring的情況下怎么將xml中定義的bean初始化并且將所有的依賴注入等等問題。
在和面試者交流了這些后,可以交流下面試者在其熟悉的框架上的掌握程度。
還有一點最需要評估的是面試者對于技術的興趣程度,在面試過程中要注意察言觀色,再結(jié)合一些技術興趣方面的問題,基本就可以判斷出來了,例如對于技術感興趣的很多會研究一些冷門的技術、對于所感興趣的技術會有比較多的了解、或用技術做一些好玩的東西等等。
以上所有的問題更多的是面試官根據(jù)企業(yè)的需求來進行主動的提問,在最后應該問問面試者是否有未問到的,但面試者自己認為比較熟悉的領域,如果有的話,也應進行交流,以能夠更加準確的評估面試者,但畢竟面試的時間通常不會太長,問的問題必然會出現(xiàn)片面性,這個時候面試就存在了一定的運氣成分,因此要很準確的評估是很難做到的,多數(shù)的面試方法都是通過多輪面試的方法,以盡量更加準確的進行評估,:)。