1. 下面哪些不是Thread類的方法()java
A. start() B. run() C. exit() D. getPriority()程序員
答案:C算法
[解析] 看Java API docs吧:http://docs.oracle.com/javase/7/docs/api/,exit()是System類的方法,如System.exit(0)。數據庫
2. 下面關於java.lang.Exception類的說法正確的是()api
A. 繼承自Throwable B. Serialable 數組
答案:A安全
[解析] Java異常的基類爲java.lang.Throwable,java.lang.Error和java.lang.Exception繼承 Throwable,RuntimeException和其它的Exception等繼承Exception,具體的RuntimeException繼承RuntimeException。數據結構
擴展:錯誤和異常的區別(Error vs Exception)多線程
1) java.lang.Error: Throwable的子類,用於標記嚴重錯誤。合理的應用程序不該該去try/catch這種錯誤。絕大多數的錯誤都是非正常的,就根本不應出現的。
java.lang.Exception: Throwable的子類,用於指示一種合理的程序想去catch的條件。即它僅僅是一種程序運行條件,而非嚴重錯誤,而且鼓勵用戶程序去catch它。併發
2) Error和RuntimeException 及其子類都是未檢查的異常(unchecked exceptions),而全部其餘的Exception類都是檢查了的異常(checked exceptions).
checked exceptions: 一般是從一個能夠恢復的程序中拋出來的,而且最好可以從這種異常中使用程序恢復。好比FileNotFoundException, ParseException等。檢查了的異常發生在編譯階段,必需要使用try…catch(或者throws)不然編譯不經過。
unchecked exceptions: 一般是若是一切正常的話本不應發生的異常,可是的確發生了。發生在運行期,具備不肯定性,主要是因爲程序的邏輯問題所引發的。好比ArrayIndexOutOfBoundException, ClassCastException等。從語言自己的角度講,程序不應去catch這類異常,雖然可以從諸如RuntimeException這樣的異常中catch並恢復,可是並不鼓勵終端程序員這麼作,由於徹底沒要必要。由於這類錯誤自己就是bug,應該被修復,出現此類錯誤時程序就應該當即中止執行。 所以,面對Errors和unchecked exceptions應該讓程序自動終止執行,程序員不應作諸如try/catch這樣的事情,而是應該查明緣由,修改代碼邏輯。
RuntimeException:RuntimeException體系包括錯誤的類型轉換、數組越界訪問和試圖訪問空指針等等。
處理RuntimeException的原則是:若是出現 RuntimeException,那麼必定是程序員的錯誤。例如,能夠經過檢查數組下標和數組邊界來避免數組越界訪問異常。其餘(IOException等等)checked異常通常是外部錯誤,例如試圖從文件尾後讀取數據等,這並非程序自己的錯誤,而是在應用環境中出現的外部錯誤。
3. 下面程序的運行結果是()
1 String str1 = "hello"; 2 String str2 = "he" + new String("llo"); 3 System.err.println(str1 == str2);
答案:false
[解析] 由於str2中的llo是新申請的內存塊,而==判斷的是對象的地址而非值,因此不同。若是是String str2 = str1,那麼就是true了。
4. 下列說法正確的有()
A. class中的constructor不可省略
B. constructor必須與class同名,但方法不能與class同名
C. constructor在一個對象被new時執行
D. 一個class只能定義一個constructor
答案:C
[解析] 這裏可能會有誤區,其實普通的類方法是能夠和類名同名的,和構造方法惟一的區分就是,構造方法沒有返回值。
5. 下列數據結構中,按先進後出的原則組織數據的是()
A. 線性鏈表 B. 棧 C. 循環鏈表 D. 順序表
答案:B
[解析] 本題主要考查對於棧的理解。
棧是限定在一端進行插入與刪除的線性表。在棧中,容許插入與刪除的一端稱爲棧頂,而不容許插入與刪除的另外一端稱爲棧底。棧頂元素老是最後被插入的元素,從而也是最早能被刪除的元素;棧底元素老是最早被插入的元素,從而也是最後才能被刪除的元素,即棧是按照「先進後出」或「後進先出」的原則組織數據的。
隊列組織數據的原則是「先進先出」或「後進後出」。
6. 下面程序的運行結果:()
1 public static void main(String args[]) { 2 3 Thread t = new Thread() { 4 5 public void run() { 6 pong(); 7 } 8 }; 9 10 t.run(); 11 System.out.print("ping"); 12 13 } 14 15 static void pong() { 16 17 System.out.print("pong"); 18 19 }
A. pingpong B. pongping C. pingpong和pongping都有可能 D. 都不輸出
答案:B
[解析] 這裏考的是Thread類中start()和run()方法的區別了。start()用來啓動一個線程,當調用start方法後,系統纔會開啓一個新的線程,進而調用run()方法來執行任務,而單獨的調用run()就跟調用普通方法是同樣的,已經失去線程的特性了。所以在啓動一個線程的時候必定要使用start()而不是run()。
7. 下列屬於關係型數據庫的是()
A. Oracle B. MySql C. IMS D. MongoDB
答案:AB
[解析] IMS(Information Management System )數據庫是IBM公司開發的兩種數據庫類型之一;
一種是關係數據庫,典型表明產品:DB2;
另外一種則是層次數據庫,表明產品:IMS層次數據庫。
非關係型數據庫有MongoDB、memcachedb、Redis等。
8. GC線程是否爲守護線程?()
A. 是 B. 否
答案:A
[解析] 線程分爲守護線程和非守護線程(即用戶線程)。
只要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就所有工做;只有當最後一個非守護線程結束時,守護線程隨着JVM一同結束工做。
守護線程最典型的應用就是 GC (垃圾回收器)
9. volatile關鍵字是否能保證線程安全?()
A. 不能 B.能
答案:A
[解析] volatile關鍵字用在多線程同步中,可保證讀取的可見性,JVM只是保證從主內存加載到線程工做內存的值是最新的讀取值,而非cache中。但多個線程對volatile的寫操做,沒法保證線程安全。例如假如線程1,線程2 在進行read,load 操做中,發現主內存中count的值都是5,那麼都會加載這個最新的值,在線程1對count進行修改以後,會write到主內存中,主內存中的count變量就會變爲6;線程2因爲已經進行read,load操做,在進行運算以後,也會更新主內存count的變量值爲6;致使兩個線程即便用volatile關鍵字修改以後,仍是會存在併發的狀況。
10. 下列說法正確的是()
A. LinkedList繼承自List
B. AbstractSet繼承自Set
C. HashSet繼承自AbstractSet
D. WeakMap繼承自HashMap
答案:ABC
[解析] 下面是一張下載的Java中的集合類型的繼承關係圖,一目瞭然。
11. 存在使i + 1 < i的數嗎()
A. 存在 B. 不存在
答案:A
[解析] 若是i爲int型,那麼當i爲int能表示的最大整數時,i+1就溢出變成負數了,此時不就<i了嗎。
擴展:存在使i > j || i <= j不成立的數嗎()
答案:存在
[解析] 好比Double.NaN或Float.NaN。
12. 0.6332的數據類型是()
A. float B. double C. Float D. Double
答案:B
[解析] 默認爲double型,若是爲float型須要加上f顯示說明,即0.6332f
13. 下面哪一個流類屬於面向字符的輸入流( )
A. BufferedWriter B. FileInputStream C. ObjectInputStream D. InputStreamReader
答案:D
[解析] Java的IO操做中有面向字節(Byte)和麪向字符(Character)兩種方式。
面向字節的操做爲以8位爲單位對二進制的數據進行操做,對數據不進行轉換,這些類都是InputStream和OutputStream的子類。
面向字符的操做爲以字符爲單位對數據進行操做,在讀的時候將二進制數據轉爲字符,在寫的時候將字符轉爲二進制數據,這些類都是Reader和Writer的子類。
總結:以InputStream(輸入)/OutputStream(輸出)爲後綴的是字節流;
以Reader(輸入)/Writer(輸出)爲後綴的是字符流。
擴展:Java流類圖結構,一目瞭然,解決大部分選擇題:
14. Java接口的修飾符能夠爲()
A. private B. protected C. final D. abstract
答案:CD
[解析] 接口很重要,爲了說明狀況,這裏稍微囉嗦點:
(1)接口用於描述系統對外提供的全部服務,所以接口中的成員常量和方法都必須是公開(public)類型的,確保外部使用者能訪問它們;
(2)接口僅僅描述系統能作什麼,但不指明如何去作,因此接口中的方法都是抽象(abstract)方法;
(3)接口不涉及和任何具體實例相關的細節,所以接口沒有構造方法,不能被實例化,沒有實例變量,只有靜態(static)變量;
(4)接口的中的變量是全部實現類共有的,既然共有,確定是不變的東西,由於變化的東西也不可以算共有。因此變量是不可變(final)類型,也就是常量了。
(5) 接口中不能夠定義變量?若是接口能夠定義變量,可是接口中的方法又都是抽象的,在接口中沒法經過行爲來修改屬性。有的人會說了,沒有關係,能夠經過 實現接口的對象的行爲來修改接口中的屬性。這固然沒有問題,可是考慮這樣的狀況。若是接口 A 中有一個public 訪問權限的靜態變量 a。按照 Java 的語義,咱們能夠不經過實現接口的對象來訪問變量 a,經過 A.a = xxx; 就能夠改變接口中的變量 a 的值了。正如抽象類中是能夠這樣作的,那麼實現接口 A 的全部對象也都會自動擁有這一改變後的 a 的值了,也就是說一個地方改變了 a,全部這些對象中 a 的值也都跟着變了。這和抽象類有什麼區別呢,怎麼體現接口更高的抽象級別呢,怎麼體現接口提供的統一的協議呢,那還要接口這種抽象來作什麼呢?因此接口中 不能出現變量,若是有變量,就和接口提供的統一的抽象這種思想是抵觸的。因此接口中的屬性必然是常量,只能讀不能改,這樣才能爲實現接口的對象提供一個統 一的屬性。
通俗的講,你認爲是要變化的東西,就放在你本身的實現中,不能放在接口中去,接口只是對一類事物的屬性和行爲更高層次的抽象。對修改關閉,對擴展(不一樣的實現 implements)開放,接口是對開閉原則的一種體現。
因此:
接口的方法默認是public abstract;
接口中不能夠定義變量即只能定義常量(加上final修飾就會變成常量)。因此接口的屬性默認是public static final 常量,且必須賦初值。
注意:final和abstract不能同時出現。
15. 不經過構造函數也能建立對象嗎()
A. 是 B. 否
答案:A
[解析] Java建立對象的幾種方式(重要):
(1) 用new語句建立對象,這是最多見的建立對象的方法。
(2) 運用反射手段,調用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。
(3) 調用對象的clone()方法。
(4) 運用反序列化手段,調用java.io.ObjectInputStream對象的 readObject()方法。
(1)和(2)都會明確的顯式的調用構造函數 ;(3)是在內存上對已有對象的影印,因此不會調用構造函數 ;(4)是從文件中還原類的對象,也不會調用構造函數。
16. ArrayList list = new ArrayList(20);中的list擴充幾回()
A. 0 B. 1 C. 2 D. 3
答案:A
[解析] 這裏有點迷惑人,你們都知道默認ArrayList的長度是10個,因此若是你要往list裏添加20個元素確定要擴充一次(擴充爲原來的1.5倍),可是這裏顯示指明瞭須要多少空間,因此就一次性爲你分配這麼多空間,也就是不須要擴充了。
17. 下面哪些是對稱加密算法()
A. DES B. AES C. DSA D. RSA
答案:AB
[解析] 經常使用的對稱加密算法有:DES、3DES、RC二、RC四、AES
經常使用的非對稱加密算法有:RSA、DSA、ECC
使用單向散列函數的加密算法:MD五、SHA
18. 新建一個流對象,下面哪一個選項的代碼是錯誤的?()
A)new BufferedWriter(new FileWriter("a.txt"));
B)new BufferedReader(new FileInputStream("a.dat"));
C)new GZIPOutputStream(new FileOutputStream("a.zip"));
D)new ObjectInputStream(new FileInputStream("a.dat"));
答案:B
[解析] 還記得13題的那個圖嗎?Reader只能用FileReader進行實例化。
19. 下面程序能正常運行嗎()
1 public class NULL { 2 3 public static void haha(){ 4 System.out.println("haha"); 5 } 6 public static void main(String[] args) { 7 ((NULL)null).haha(); 8 } 9 10 }
答案:能正常運行
[解析] 輸出爲haha,由於null值能夠強制轉換爲任何java類類型,(String)null也是合法的。但null強制轉換後是無效對象,其返回值仍是爲null,而static方法的調用是和類名綁定的,不借助對象進行訪問因此能正確輸出。反過來,沒有static修飾就只能用對象進行訪問,使用null調用對象確定會報空指針錯了。這裏和C++很相似。
20. 下面的方法,當輸入爲2的時候返回值是多少?()
1 public static int getValue(int i) { 2 int result = 0; 3 switch (i) { 4 case 1: 5 result = result + i; 6 case 2: 7 result = result + i * 2; 8 case 3: 9 result = result + i * 3; 10 } 11 return result; 12 }
A. 0 B. 2 C. 4 D. 10
答案:D
[解析] 注意這裏case後面沒有加break,因此從case 2開始一直往下運行。