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