經常被遺忘的Java面試題
通常,在面試中,會遇到面試官提一些比較“偏冷”的基礎知識,因此,本文對一些容易被遺忘的問題進行歸納,希望可以幫助廣大程序員輕鬆應對面試官的技術問題,以及提升編碼效率。
靜態類和靜態方法
如果一個類要被聲明為static的,只有一種情況,就是靜態內部類。
靜態內部類實際上與普通類(即類名必須與文件名一樣的頂級類)一樣,只是靜態內部類在某一類的內部定義了而已,既然是類,要想使用就必須實例化。概念上與靜態變量、靜態方法是不一樣的,不要被“靜態”兩個字迷惑了(不要以為凡是靜態的東西就不需要實例化就可以直接使用,靜態內部類是有區別),而且只有靜態內部類,而沒有靜態類(頂級類)的概念。
public class Singleton{
private Singleton(){}
private static class SingletonHolder{
private final static Singleton instance;
}
public Singleton getInstance(){
return ance;
}
}
public class Singleton{
private Singleton(){}
private static class SingletonHolder{
private final static Singleton instance;
}
public Singleton getInstance(){
return ance;
}
}
靜態方法只能訪問靜態成員,實例方法可以訪問靜態和實例成員。之所以不允許靜態方法訪問實例成員變量,是因為實例成員變量是屬於某個對象的,而靜態方法在執行時,並不一定存在對象。靜態方法中也不能使用關鍵字this。
倒排索引
Inverted Index
如果翻譯成轉置索引可能更好懂,它就相當於做了矩陣轉置。
倒排索引是一種索引方法,被用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。
反射
反射API中提供的動態代理也是非常強大的功能,可以原生實現AOP中 的方法攔截功能。正如英文單詞reflection的含義一樣,使用反射API的時候就好像在看一個Java類在水中的倒影一樣。知道了Java類的內部 結構之後,就可以與它進行交互,包括創建新的對象和調用對象中的方法等。
這種交互方式與直接在源代碼中使用的效果是相同的,但是又額外提供了運行時刻的靈活性。使用反射的.一個最大的弊端是性能比較差。相同的操作,用反射API所需的時間大概比直接的使用要慢一兩個數量級。不過現在的JVM實現中,反射操作的性能已經有了很大的提升。
Java 反射API的第一個主要作用是獲取程序在運行時刻的內部結構。
多路歸併算法
歸併排序也是一種使用分治法來實現的有效排序算法,它是現代計算機創始人John von Neumann於1945年發明的。
歸併排序在眾多排序算法中既是穩定排序,又有不錯的效率,同時,歸併排序不僅可以用於內排序,還可以用於外排序。
歸併排序的思路如下(以二路歸併為例):
將數組劃均分為兩個子數組;
對兩個字數組進行排序;
將排序好的兩個字數組歸併。
所謂 N路歸併 是指將數組均分為N個子數組,將字數組排序後再歸併。因此二路歸併是歸併排序的最一般的情況。
e.g.
def msort(array):
length = len(array)
if length == 1:
return array
else:
mid = length / 2
left = msort(array[0: mid])
right = msort(array[mid: length])
return merge(left, right)123
def msort(array):
length = len(array)
step = 1
while step < length:
for left in range(0, length - step, 2 * step):
result = merge(array[left:left + step],
array[left + step: min(left + 2 * step,
length)])
array = array[0:left] + result + array[min(left + 2 *
step, length)]
step = step * 2
return array
def merge(left, right):
llen = len(left)
lcur = 0
rlen = len(right)
rcur = 0
result = []
while lcur < llen and rcur < rlen:
lone = left[lcur]
rone = right[rcur]
nd(min(lone, rone))
if lone < rone:
lcur += 1
else:
rcur += 1
result += left[lcur:]
result += right[rcur:]
return result
枚舉類型
Enumerated Type
enum 類型不支持 public 和 protected 修飾符的構造方法,因此構造函數一定要是 private 或 friendly 的。也正因為如此,所以枚舉對象是無法在程序中通過直接調用其構造方法來初始化的。
由於 enum 類型的值實際上是通過運行期構造出對象來表示的,所以在 cluster 環境下,每個虛擬機都會構造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等號 ( ‘ == ’ ) 操作符,這些看似一樣的枚舉值一定不相等,因為這不是同一個對象實例。
-
Java編程語言初學者入門課程
初學者先弄清這些Java的基本概念也是必不可少的,死記硬背肯定是不行的,重在理解,理解它們之間的區別與聯繫,分別有哪些應用。希望對您有所幫助!更多內容請關注應屆畢業生考試網!一、先明白瞭解什麼是Java的四個方面。初學者先弄清這些Java的基本概念也是必不可少的...
-
21個java基本知識點
本文主要是一些java基礎知識點相關的,所以也希望能分享給剛剛入門的Java程序員和打算入Java開發這個行當的準新手們,希望可以給大家一些經驗,能讓大家更好學習和使用Java。1.JVM相關(包括了各個版本的特性)對於剛剛接觸Java的人來説,JVM相關的知識不一定需要理解很...
-
2017年計算機java提分練習題
學習必須如蜜蜂一樣,採過許多花,這才能釀出蜜來。以下是小編為大家搜索整理的2017年計算機java提分練習題,希望對大家有所幫助!更多精彩內容請及時關注我們應屆畢業生考試網!1).下列關於for循環和while循環的説法中哪個是正確的?e循環能實現的操作,for循環都能實現...
-
關於java如何配置MyEclipse Maven環境具體方法
雖然我的大部分項目已經遷到Idea上去了,但是在寫部分小的測試程序的時候還是習慣性的會點開MyEclipse。之前使用第三方庫的時候我會習慣的下載jar包,然後buildpath導入,但是在idea中貌似通過配置maven依賴更方便,於是我在MyEclipse中也想使用來導入依賴,在嘗試的過...