JAVA筆試題

 

第一:

1.String是最基本的數據類型麼?

答:不是。基本的數據類型包括:byte,int,char,long,float,double,boolean和short.

java.lang.String類是final類型的,因此不可以繼承這個類,不能修改這個類。

2.靜態變量和實例變量的區別?

答:static i = 10 ;//常量  

        class A a; a.i = 10 //可變

3.是否可以從一個static方法內部發出對非static方法的調用?

答:不可以。不能保證對象的初始化。

4.描述一下JVM加載class文件的原理機制?

答:JVM就是JAVA虛擬機。相當於JAVA語言和用戶平臺交互的接口。JVM裏中類的裝載是用ClassLoder和它的子類來實現的。這個類是java運行中的一個重要組件。負責運行時裝載類文件和查找功能。

5.&與&&的區別?

答:&是位運算符,表示按位與運算;

       &&是邏輯運算符,表示邏輯於。

6.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

答:不能作用在long和String,能作用在byte上。swtich(exprl)中,exprl是一個整數表達式。因此傳遞給switch和case語句的參數應該是int,shot,char或者byte。也就說誰可以和int相互轉換,那麼就可以用它。

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

答:12 和 -11.

8.heap和stack有什麼區別?

答:棧是一種線性集合,其添加和刪除元素的操作應在同一段完成。棧按照後進先出的方式進行處理。堆是棧的一個組成元素。(棧一般存放一些固定大小的元素,比如基本數據類型。堆裏面放對象,數組等可變的元素。)

9.怎樣用最有效率的方法算出2乘以幾等於16?

答:2<<3.或者16>>1.

10.簡述邏輯操作(&,|,^)與條件操作(&&,||)的區別?

答:兩點:a.條件操作只能操作布爾型,而邏輯操作不僅可以操作布爾型,而且可以操作數值型。b邏輯操作不會產生短路。

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

答:兩個對象。new String() 和 "xyz";

12.short sl = 1; sl = sl + 1; 有什麼錯?short sl = 1; sl + = 1 ; 有什麼錯?

答:數據類型轉換問題。sl+1運算結果是int型,需要強制轉換。否則出錯。而第二個可以正確編譯。

13.寫clone()方法時,通常都有一段代碼,是什麼?

答:clone()有缺省行爲,super.clone();它負責產生正確大小的空間,並逐位複製。

14.一個".java"源文件中是否可以包括多個類(不是內部類)?有什麼限制?

答:可以。必須只有一個類名與文件名相同。

15.在java中,如何跳出當前的多重嵌套循環?

答:用break ,return,加標號。

16.int 和 Integer有什麼區別?

答:int是8種數據類型中的一種;而Integer是一個封裝類。JDK1.6以後Integer可以自動轉換成int。

17.char型變量中能不能存儲一箇中文漢字?爲什麼?

答:可以。因爲JAVA中是以unicode編碼,一個char佔16字節,而一箇中文佔2字節。

18.數組有沒有length()這個方法?String有沒有length()這個方法?

答:數組中沒有這個方法,只有length屬性。String有這個方法。

19.String 和 StringBuffer的區別?

答:區別是String類提供了數值不可改變的字符串。而StringBuffer類提供的字符串是可變的。也就可以動態構造字符數據。同時也稍微提升了效率並且節省了空間。

 

第二:

1. 是否可以繼承STRING類?

答:不可以。因爲String類是final類型的。


2. 說出一些常用的類、包、接口。請各舉5個常用的類:

答:類:BufferedReader BufferedWriter FileReader FileWriter String Integer

      包:java.lang java.awt    java.io    java.util    java.sql

       接口:Remote   List   Map   Document NodeList
3. ERROR和EXCEPTION有什麼區別?

答:error是不可恢復的嚴重問題,程序沒辦法處理。比如說內存溢出。Exception是設計或者實現的問題。程序正常的話不會出現。


4. 運行時異常與一般異常有何異同?

答:異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的一場,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行異常,但是並不要求必須聲明拋出。


5. 給我一個你最常見到的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


6. TRY {}裏有一個RETURN語句,那麼緊跟在這個TRY後的FINALLY {}裏的CODE會不會被執行,什麼時候被執行,在RETURN前還是後?

答:會。在return前執行。


7. JAVA中的異常處理機制的簡單原理和應用。

答:當java程序違反了java 的語義規則時,java虛擬機就會將發生的錯誤表示一個異常。違反語義規則包括2種情況。一種是java類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException,訪問null的對象時會引發NullPointerException。另一種情況是java允許程序員擴張這種語義檢查,程序員可以創建自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。防止內存泄露。


8. 說出ARRAYLIST,VECTOR, LINKEDLIST的存儲性能和特性

答:ArrayList Vector 都是使用數組方式存儲數據,此數組元素大於實際存儲的數據以便增加和插入元素,他們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以所以索引數據快而插入數據慢,Vector由於使用了線程安全,所以性能較差。

LinkedList使用雙向鏈表變現存儲,按序號索引數據需要進行前向和後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。

(數組方式存儲數據在內存中的空間是連續的。而雙向鏈表存儲數據空間是隨便的。可以從查找數據方面入手,比較它們的不同:檢索數據時候ArrayList Vector的方式很快。而LinkedList查找數據不方便,但是插入,刪除等操作時很快,可以自己思考一下。)


9. COLLECTION 和 COLLECTIONS的區別?

答:Collection是結合類的上級接口,繼承與它的接口主要有set和list。

Collection是針對結合類的一個幫助類,或叫工具類。它提供了一系列的靜態方法實現對各種集合的搜索,排序,線程安全化等操作。


10. LIST, SET, MAP是否繼承自COLLECTION接口?

答:list , set 是。而map不是。(map和collection是同級的接口)


11. LIST、MAP、SET三個接口,存取元素時,各有什麼特點?

答:List以特定次序來持有元素,可以有重複元素。Set無法擁有重複元素,內部排序。Map保存key-value值,value可多值。(key和value都是object類型的)


12. 你所知道的集合類都有哪些?主要方法?

答:最常用的集合類是List Set和 Map 。List 的具體實現包括ArrayList 和 Vector,它們是可變大小的列表,比較適合構建,存儲和操作任何類型對象的元素列表。List使用於按數值索引訪問元素的情形。Map提供了一個更通用的元素存儲方法。Map集合類用於存儲元素對(稱作"鍵"和"值"),其中每個鍵映射到一個值。


13. 請說一下ARRAYLIST和VECTOR的區別。

答:一 同步性:Vector是線程安全的,同步的。而ArrayList是線程不安全的。

      二 數據增長:當需要增長時,Vector默認增長爲原來一倍,而ArrayList是原來的一半。如果涉及到堆棧,隊列等操作,應該考慮用Vector,如果需要快速隨機訪問元素,應該使用ArrayList。


14. HASHMAP和HASHTABLE的區別。

答:HASHMAP是HASHTABLE的輕量級實現(非線程安全的實現),它們都實現了MAP接口,主要卻別在於HASHMAP允許空鍵值,效率比HASHTABLE高。HASHMAP允許將null作爲一個entry的key或者value,而HASHTABLE不允許。HASHMAP把HASHTABLE的contains方法去掉了,改成containsvalue和containsKey了。HASHTABLE繼承自Dictionary類,而HASHMAP是java1.2引進的Map interface的一個實現。


15. 請說一下HASHMAP和HASHTABLE的區別。

答:1.Hashtable是Dictionary的子類,HashMap是Map接口的一個實現類。

      2.HashTable中的方法是同步的,而HashMap中的方法在缺省情況下是非同步的。

      3.在HashMap中,null可以作爲鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值爲null。


16. 兩個對象值相同(X.EQUALS(Y) == TRUE),但卻可有不同的HASH CODE,這句話對不對?

答:不對。有相同的hash code。


17. JAVA中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?

答:兩種。字節流和字符流。字節流繼承自InputStream OutputStream ,字符流繼承自InputStreamReader OutputStreamWriter。


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

答:用iterrator()方法來區分重複與否。equals()是判斷兩個Set是否相等。

      (equals()和==方法決定引用值是否指向同一對象。equals()在類中被覆蓋,爲的是當兩個分離的對象的內容和類型相配的話,返回真值。)


19. 線程的基本概念、線程的基本狀態以及狀態之間的關係?

答:線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都有一個線程,也就是程序本身。


20. JAVA線程中有哪四種狀態?

答:運行,就緒,等待,結束。


21. 多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?

答:兩種。一種是:繼承Thread;還有是實現Runnable接口。同步的實現有兩種,分別是:synchronized(關鍵字),wait(等待)與notify(喚醒)。

第三:

1.當一個線程進入一個對象的一個synchronized方法後,其他線程是否可以進入此對象的其他方法?

答:不可以。一個對象的一個synchronized方法只能有一個線程訪問。

2.請說出你所知道的線程同步的方法?

答:wait()使一個線程處於等待狀態,並且釋放所持有的對象的lock。

sleep()讓一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉interruptedException異常。

notify()喚醒一個處於等待狀態的線程,注意的是用在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個縣城,而且不是按優先級。

Allnotify()喚醒所有處於等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

3.JAVA中用什麼關鍵字修飾同步方法?stop()和suspend()方法爲什麼不推薦使用?

答:用synchronized關鍵字修飾同步方法。

stop()方法不安全。它會解除由線程獲取的所有鎖定,而且如果對象處於一種不連貫的狀態,那麼其他線程就能檢查和修改它們。結果很難檢查出問題所在。

suspend()方法會導致"死鎖"。它使目標線程停下來,但卻依然持有這之前的鎖定。此時,其他線程不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們像恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成"死鎖"。

所以不應該用suspend(),而應在自己的Thread類中置入一個標誌,指出線程應該活動還是掛起。若標誌指出線程應該掛起,那麼就用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()重新啓動線程。

4.sleep()和wait()有什麼區別?

答:sleep()是線程類Thread的方法。此方法作用是:線程暫停並可以指定時間,把執行機會給其他線程,但是監控狀態保持,到時間就自動恢復。調用此方法不會釋放對象鎖。

wait()是Object類的方法,對此對象調用wait方法會導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或者notifyAll)後本線程進入對象鎖定池準備獲得對象鎖進入運行狀態。

5.final     finally       finalize的區別?

答:final用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

finnaly是異常處理語句結構的一部分,表示總是執行。

finalize是Object類的一個方法,在垃圾回收器執行的時候會被調用此方法。

6.overload 和 override的區別是?overloaded的方法是否可以改變返回值的類型?

答:overload是重載,override是重寫。都是java多態性的不同表現。重寫是父類與子類之間的多態表現,重載是一個類中多態的表現。如果子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫。子類的對象使用這個方法時,將調用子類中的定義。如果一個類中定義了多個同名的方法,它們有着不同的參數列表,那麼稱爲方法的重載。重載的方法是可以改變返回值的類型。

7.abstract class 和 interface 有什麼區別?

答:前者是抽象類,後者是接口。抽象類是可以被繼承的,但是要把所有的方法都實現。

8.anonymous inner class(匿名內部類)是否可以extends(繼承)其他類?是否可以implements (實現)interface(接口)?

答:都是可以的。

9.static nested class 和 inner class 的不同?

答:static nested class 是聲明爲靜態的內部類。

10.接口是否可繼承接口?抽象類是否可實現接口?抽象類是否可繼承實體類(concrete class)?

答:可以。可以。可以(所有的類都繼承Object類)。

11.請用遞歸編寫的函數來計算N的階乘?

答:public class Test {
public static void main(String[] args) {
   int n = 5;
   System.out.println(method(n));
}
public static int method(int n) {
   int re = 1;
   if(n <= 1) {
    return 1;
   } else {
    return n*method(n-1);
   }
}
}

12.構造器constructor是否可被override?

答:構造器不可以被重寫,繼承。但是可以重載。

13.當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏到底是值傳遞還是引用傳遞?

答:值傳遞。java中只有值傳遞。

14.寫一個single。

答:第一種方法:

class TestSingle{

private static final TestSingle single = new TestSingle();

public static TestSingle getSingle(){

return single;

}

private TestSingle(){}

}

第二種方法:

public class Singleon{

private static Singleton instance = null;

public static synchronized Singleton getIntance(){

if(instance==null){

instance = new Singleton();

return instance;

}

}

private Singleton(){}

}

15.GC是什麼?爲什麼有GC?

答:GC是垃圾收集的意思(Gabage Collection),java提供的GC功能可以自動檢測對象是否超過作用域,從而達到自動回收內存的目的。

16.垃圾回收的優點和原理。並考慮兩種回收機制?

答:java語言中一個顯著的特點就是引入垃圾回收機制。使得java程序員在編寫程序的時候不需要考慮內存管理。java中的對象不再有"作用域"的概念,只有對象的引用纔有"作用域"。垃圾回收機制可以有效的防止內存泄露,有效使用內存。通常它作爲一個單獨的低級別的線程運行,不可預知情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時調用垃圾回收機器對某個對象回收。(回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收)

17.垃圾回收機制可以馬上回收內存麼?有什麼辦法主動通知虛擬機進行垃圾回收呢?

答:不可以。垃圾回收機制在java中不保證什麼時候一定會執行。它的線程級別很低,只能不定時的回收。程序員可以通過System.gc()通知JVM的GC運行,同樣不保證一定執行。

18.java語言如何進行異常處理,關鍵字:throws throw try catch finally分別代表什麼意義?在try塊中可以拋出異常麼?

答:throws用來聲明一個函數可能拋出各種異常。

throw語句用來明確拋出一個異常。

try.....catch finally是一段捕捉異常的代碼塊。try來指定一段程序,如果有異常,會在catch裏捕捉到。而finally是缺省處理。爲了確保一段代碼不管發生什麼都執行的。

19.java中實現多態的機制是什麼?

答;多態表現在重寫(Overriding)和重載(OverLoading)。重寫是父類與子類之間的多態表現。重載是一個類的多態表現。

20.面向對象的特徵有哪些方面?

答:

a.       抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。

b.       繼承:繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱爲類繼承。新類繼承了原始類的特性,新類稱爲原始類的派生類(子類),而原始類稱爲新類的基類(父類)。派生類可以從它的基類那裏繼承方法和實例變量,並且類可以修改或增 加新的方法使之更適合特殊的需要。

c.       封裝:封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。

d.       多態性:多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行爲共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。

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