中軟國際Java程序員筆試題

1、談談final, finally, finalize的區別。

final:修飾符(關鍵字)如果一個類被聲明爲final,意味着它不能再派生出新的子類,不能作爲父類被繼承。因此一個類不能既被聲明爲 abstract的,又被聲明爲final的。將變量或方法聲明爲final,可以保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在以後的引用中只能讀取,不可修改。被聲明爲final的方法也同樣只能使用,不能重載。

finally:在異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。

finalize:方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。

2、Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?

匿名的內部類是沒有名字的內部類。不能繼承其它類,但一個內部類可以作爲一個接口,由另一個內部類實現。

3、Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

Static nested class(嵌套類)是將內部類聲明爲static。普通內部類對象隱式地保存了一個引用,指向創建它的外圍類對象,不能有static數據和static字段。嵌套類意味着:1> 要創建嵌套類的對象,並不需要其外圍類的對象;2>不能從嵌套類的對象中訪問非靜態的外圍類的對象。

4、&和&&的區別。

& 是兩個數相與,是位運算符

&&是布爾邏輯運算符,連接兩個條件表達式的,兩個條件表達式都爲真時,整個才爲真

5、HashMap和Hashtable的區別。

都屬於Map接口的類,實現了將惟一鍵映射到特定的值上。HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。Hashtable 類似於 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因爲它是同步的,是線程安全的。

6、Collection 和 Collections的區別。

Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。

Collection是個java.util下的接口,它是各種集合結構的父接口。

7、List, Set, Map是否繼承自Collection接口?

List,Set是 Map不是

8、ArrayList和Vector的區別。

1>同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的 2>數據增長:當需要增長時,Vector默認增長爲原來一培,而ArrayList卻是原來的一半

9、什麼時候用assert。

assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值爲true;如果該值爲false,說明程序已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啓。爲了提高性能,在軟件發佈後,assertion檢查通常是關閉的。

10、GC是什麼? 爲什麼要有GC?

GC是垃圾收集器。Java 程序員不用擔心內存管理,因爲垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:

System.gc()

Runtime.getRuntime().gc()

11、String s = new String("xyz");創建了幾個String Object?

兩個對象,一個是“xyx”,一個是指向“xyx”的引用對象s

12、.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;因爲返回最接近參數的 long。通過加上 1/2 將該結果舍入爲整數,取結果的基數並將其強制轉換爲 long 類型。換句話說,結果等於以下表達式的值: (long)Math.floor(a + 0.5d)

13、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

short s1 = 1; s1 = s1 + 1;錯, short s1 = 1; s1 += 1;對。對於short s1 = 1; s1 = s1 + 1;由於s1+1運算時會自動提升表達式的類型,所以結果是int型,再賦值給short類型s1時,編譯器將報告需要強制轉換類型的錯誤。對於short s1 = 1; s1 += 1;由於 += 是java語言規定的運算符,java編譯器會對它進行特殊處理,因此可以正確編譯。

14、sleep() 和 wait() 有什麼區別?

sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

15、數組有沒有length()這個方法? String有沒有length()這個方法?

數組沒有length()這個方法,有length的屬性。String有有length()這個方法。

16、是否可以繼承String類?

String類是final類故不可以繼承。

17、Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

overload一般翻譯爲重載,表示多個函數共用同一個函數名,爲了保證調用這些同名函數時能正確區分究竟應該調用的是其中的哪一個,重載的各個函數的參數表(不考慮形參名)必須彼此不同,通常簡略地說成“不同參數表”。它對返回值的類型沒有任何要求,所以你可以隨意爲每一個重載的函數設置返回類型,相同也行,不同也行。

override一般翻譯爲覆蓋,表示子類對從父類繼承來的虛函數重新定義,它要求參數表必須跟父類中被覆蓋的那個函數的參數表完全相同,返回值類型原則上也要求相同,但如果返回類型是父類的指針或者父類的引用,覆蓋時返回類型允許是子類的指針或者子類的引用。

18、Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?

Set是Collection容器的一個子接口,它不允許出現重複元素,當然也只允許有一個null對象。 equals()區分更合適。爲什麼用equals()而不用==來區分? 應該從它倆的區別談起,==是用來判斷兩者是否是同一對象(同一事物),而equals是用來判斷是否引用同一個對象。再看一下Set裏面存的是對象,還是對象的引用。根據java的存儲機制可知,set裏面存放的是對象的引用,所以當兩個元素只要滿足了equals()時就已經指向同一個對象,也就出現了重複元素。所以應該用equals()來判斷。

19、給我一個你最常見到的runtime exception。

ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,

ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFORMatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

20、error和exception有什麼區別?

Error(錯誤)表示系統級的錯誤和程序不必處理的異常,是java運行環境中的內部錯誤或者硬件問題,比如,內存資源不足等,對於這種錯誤,程序基本無能爲力,除了退出運行外別無選擇。

Exception(違例)表示需要捕捉或者需要程序進行處理的異常,它處理的是因爲程序設計的瑕疵而引起的問題或者在外的輸入等引起的一般性問題,是程序必須處理的。

21、abstract class和interface有什麼區別?

1>.相同點

A. 兩者都是抽象類,都不能實例化。

B. interface實現類及abstrct class的子類都必須要實現已經聲明的抽象方法。

2.> 不同點

A. interface需要實現,要用implements,而abstract class需要繼承,要用extends。

B. 一個類可以實現多個interface,但一個類只能繼承一個abstract class。

C. interface強調特定功能的實現,而abstract class強調所屬關係。

D. 儘管interface實現類及abstrct class的子類都必須要實現相應的抽象方法,但實現的形式不同。interface中的每一個方法都是抽象方法,都只是聲明的(declaration, 沒有方法體),實現類必須要實現。而abstract class的子類可以有選擇地實現。

這個選擇有兩點含義:

一是Abastract class中並非所有的方法都是抽象的,只有那些冠有abstract的方法纔是抽象的,子類必須實現。那些沒有abstract的方法,在Abstrct class中必須定義方法體。

二是abstract class的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以通過再次聲明其方法爲抽象的方式,無需實現,留給其子類來實現,但此類必須也聲明爲抽象類。既是抽象類,當然也不能實例化。

E. abstract class是interface與Class的中介。

interface是完全抽象的,只能聲明方法,而且只能聲明pulic的方法,不能聲明private及protected的方法,不能定義方法體,也不能聲明實例變量。然而,interface卻可以聲明常量變量,並且在JDK中不難找出這種例子。但將常量變量放在interface中違背了其作爲接口的作用而存在的宗旨,也混淆了interface與類的不同價值。如果的確需要,可以將其放在相應的abstract class或Class中。

abstract class在interface及Class中起到了承上啓下的作用。一方面,abstract class是抽象的,可以聲明抽象方法,以規範子類必須實現的功能;另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的實例變量,以供子類通過繼承來使用。

3>. interface的應用場合

A. 類與類之前需要特定的接口進行協調,而不在乎其如何實現。

B. 作爲能夠實現特定功能的標識存在,也可以是什麼接口方法都沒有的純粹標識。

C. 需要將一組類視爲單一的類,而調用者只通過接口來與這組類發生聯繫。

D. 需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯繫。

4>、abstract class的應用場合

一句話,在既需要統一的接口,又需要實例變量或缺省的方法的情況下,就可以使用它。最常見的有:

A. 定義了一組接口,但又不想強迫每個實現類都必須實現所有的接口。可以用abstract class定義一組方法體,甚至可以是空方法體,然後由子類選擇自己所感興趣的方法來覆蓋。

B. 某些場合下,只靠純粹的接口不能滿足類與類之間的協調,還必需類中表示狀態的變量來區別不同的關係。abstract的中介作用可以很好地滿足這一點。

C. 規範了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特定的功能


22、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

接口可以繼承接口。抽象類可以實現(implements)接口。抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。

23、構造器Constructor是否可被override?

構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。

24、.當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?

不能,一個對象的一個synchronized方法只能由一個線程訪問。

25、編程題: 寫一個Singleton出來。

1
2
3
4
5
6
7
8
public class Singleton {
private Singleton(){}
//在自己內部定義自己一個實例,是不是很奇怪? 
//注意這是private 只供內部調用 
private static Singleton instance = new Singleton();
//這裏提供了一個供外部訪問本class的靜態方法,可以直接訪問 
public static Singleton getInstance() {
return instance;    }  }

第二種形式:

1
2
3
4
5
6
7
8
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次 
//使用時生成實例,提高了效率! 
if (instance==null)
instance=new Singleton();
return instance; }  }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章