網上大大小小的面試題很多,有的同學面試會遇到比較偏的試題,所以動力節點的老師總結了幾個經常被忽略的Java面試題來給大家,希望對大家有所幫助。
靜態類和靜態方法
如果一個類要被聲明為static的,只有一種情況,就是靜態內部類。
靜態內部類實際上與普通類(即類名必須與文件名一樣的頂級類)一樣,只是靜態內部類在某一類的內部定義了而已,既然是類,要想使用就必須實例化。概念上與靜態變量、靜態方法是不一樣的,不要被“靜態”兩個字迷惑了(不要以為凡是靜態的東西就不需要實例化就可以直接使用,靜態內部類是有區別),而且只有靜態內部類,而沒有靜態類(頂級類)的概念。
e.g.
publicclassSingleton{
privateSingleton(){}
privatestaticclassSingletonHolder{
privatefinalstaticSingletoninstance;
}
publicSingletongetInstance(){
returnSingletonHolder.instance;
}
}
靜態方法只能訪問靜態成員,實例方法可以訪問靜態和實例成員。之所以不允許靜態方法訪問實例成員變量,是因為實例成員變量是屬于某個對象的,而靜態方法在執行時,并不一定存在對象。靜態方法中也不能使用關鍵字this。
倒排索引
InvertedIndex
如果翻譯成轉置索引可能更好懂,它就相當于做了矩陣轉置。
倒排索引是一種索引方法,被用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。
反射
反射API中提供的動態代理也是非常強大的功能,可以原生實現AOP中的方法攔截功能。正如英文單詞reflection的含義一樣,使用反射API的時候就好像在看一個Java類在水中的倒影一樣。知道了Java類的內部結構之后,就可以與它進行交互,包括創建新的對象和調用對象中的方法等。
這種交互方式與直接在源代碼中使用的效果是相同的,但是又額外提供了運行時刻的靈活性。使用反射的一個很大的弊端是性能比較差。相同的操作,用反射API所需的時間大概比直接的使用要慢一兩個數量級。不過現在的JVM實現中,反射操作的性能已經有了很大的提升。
Java反射API的第一個主要作用是獲取程序在運行時刻的內部結構。
枚舉類型
EnumeratedType
•enum類型不支持public和protected修飾符的構造方法,因此構造函數一定要是private或friendly的。也正因為如此,所以枚舉對象是無法在程序中通過直接調用其構造方法來初始化的。
•由于enum類型的值實際上是通過運行期構造出對象來表示的,所以在cluster環境下,每個虛擬機都會構造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等號(‘==’)操作符,這些看似一樣的枚舉值一定不相等,因為這不是同一個對象實例。
多線程
Java中實現多線程有兩種方法:繼承Thread類、實現Runnable接口,在程序開發中只要是多線程,肯定以實現Runnable接口為主,因為實現Runnable接口相比繼承Thread類有如下優勢:
1、可以避免由于Java的單繼承特性而帶來的局限;
2、增強程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的;
3、適合多個相同程序代碼的線程區處理同一資源的情況。
下面是通過實現Runnable接口實現的多線程程序,代碼如下:
lassMyThreadimplementsRunnable{
privateintticket=5;
publicvoidrun(){
for(inti=0;i<10;i++)
{
if(ticket>0){
System.out.println("ticket="+ticket--);
}
}
}
}
publicclassRunnableDemo{
publicstaticvoidmain(String[]args){
MyThreadmy=newMyThread();
newThread(my).start();
newThread(my).start();
newThread(my).start();
}
}
大家都記住了嗎?如果在遇到類似的面試題就不要被難倒了喲,動寶兒祝大家面試順利。