- 相關(guān)推薦
java基礎筆試題及答案
Java看起來(lái)設計得很像C++,但是為了使語(yǔ)言小和容易熟悉,設計者們把C++語(yǔ)言中許多可用的特征去掉了,這些特征是一般程序員很少使用的。下面是關(guān)于java基礎筆試題及答案,希望大家認真閱讀!
1. 下面哪些是Thread類(lèi)的方法()
A start() B run() C exit() D getPriority()
答案:ABD
解析:看Java API docs吧:http://docs.oracle.com/javase/7/docs/api/,exit()是System類(lèi)的方法,如System.exit(0)。
2. 下面關(guān)于java.lang.Exception類(lèi)的說(shuō)法正確的是()
A 繼承自Throwable B Serialable CD 不記得,反正不正確
答案:A
解析:Java異常的基類(lèi)為java.lang.Throwable,java.lang.Error和java.lang.Exception繼承 Throwable,RuntimeException和其它的Exception等繼承Exception,具體的RuntimeException繼承RuntimeException。
擴展:錯誤和異常的區別(Error vs Exception)
1) java.lang.Error: Throwable的子類(lèi),用于標記嚴重錯誤。合理的應用程序不應該去try/catch這種錯誤。絕大多數的錯誤都是非正常的,就根本不該出現的。
java.lang.Exception: Throwable的子類(lèi),用于指示一種合理的程序想去catch的條件。即它僅僅是一種程序運行條件,而非嚴重錯誤,并且鼓勵用戶(hù)程序去catch它。
2) Error和RuntimeException 及其子類(lèi)都是未檢查的異常(unchecked exceptions),而所有其他的Exception類(lèi)都是檢查了的異常(checked exceptions).
checked exceptions: 通常是從一個(gè)可以恢復的程序中拋出來(lái)的,并且最好能夠從這種異常中使用程序恢復。比如FileNotFoundException, ParseException等。
unchecked exceptions: 通常是如果一切正常的話(huà)本不該發(fā)生的異常,但是的確發(fā)生了。比如ArrayIndexOutOfBoundException, ClassCastException等。從語(yǔ)言本身的角度講,程序不該去catch這類(lèi)異常,雖然能夠從諸如RuntimeException這樣的異常中catch并恢復,但是并不鼓勵終端程序員這么做,因為完全沒(méi)要必要。因為這類(lèi)錯誤本身就是bug,應該被修復,出現此類(lèi)錯誤時(shí)程序就應該立即停止執行。 因此,面對Errors和unchecked exceptions應該讓程序自動(dòng)終止執行,程序員不該做諸如try/catch這樣的事情,而是應該查明原因,修改代碼邏輯。
RuntimeException:RuntimeException體系包括錯誤的類(lèi)型轉換、數組越界訪(fǎng)問(wèn)和試圖訪(fǎng)問(wèn)空指針等等。
處理RuntimeException的原則是:如果出現 RuntimeException,那么一定是程序員的錯誤。例如,可以通過(guò)檢查數組下標和數組邊界來(lái)避免數組越界訪(fǎng)問(wèn)異常。其他(IOException等等)checked異常一般是外部錯誤,例如試圖從文件尾后讀取數據等,這并不是程序本身的錯誤,而是在應用環(huán)境中出現的外部錯誤。
3. 下面程序的運行結果是()
String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);
答案:false
解析:因為str2中的llo是新申請的內存塊,而==判斷的是對象的地址而非值,所以不一樣。如果是String str2 = str1,那么就是true了。
4. 下列說(shuō)法正確的有()
A. class中的constructor不可省略
B. constructor必須與class同名,但方法不能與class同名
C. constructor在一個(gè)對象被new時(shí)執行
D.一個(gè)class只能定義一個(gè)constructor
答案:C
解析:這里可能會(huì )有誤區,其實(shí)普通的類(lèi)方法是可以和類(lèi)名同名的,和構造方法唯一的區分就是,構造方法沒(méi)有返回值。
5. 具體選項不記得,但用到的知識如下:
String []a = new String[10];
則:a[0]~a[9] = null
a.length = 10
如果是int []a = new int[10];
則:a[0]~a[9] = 0
a.length = 10
6. 下面程序的運行結果:()
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
}
static void pong() {
System.out.print("pong");
}
A pingpong B pongping C pingpong和pongping都有可能 D 都不輸出
答案:B
解析:這里考的是Thread類(lèi)中start()和run()方法的區別了。start()用來(lái)啟動(dòng)一個(gè)線(xiàn)程,當調用start方法后,系統才會(huì )開(kāi)啟一個(gè)新的線(xiàn)程,進(jìn)而調用run()方法來(lái)執行任務(wù),而單獨的調用run()就跟調用普通方法是一樣的,已經(jīng)失去線(xiàn)程的特性了。因此在啟動(dòng)一個(gè)線(xiàn)程的時(shí)候一定要使用start()而不是run()。
7. 下列屬于關(guān)系型數據庫的是()
A. Oracle B MySql C IMS D MongoDB
答案:AB
解答:IMS(Information Management System )數據庫是IBM公司開(kāi)發(fā)的兩種數據庫類(lèi)型之一;
一種是關(guān)系數據庫,典型代表產(chǎn)品:DB2;
另一種則是層次數據庫,代表產(chǎn)品:IMS層次數據庫。
非關(guān)系型數據庫有MongoDB、memcachedb、Redis等。
8. GC線(xiàn)程是否為守護線(xiàn)程?()
答案:是
解析:線(xiàn)程分為守護線(xiàn)程和非守護線(xiàn)程(即用戶(hù)線(xiàn)程)。
只要當前JVM實(shí)例中尚存在任何一個(gè)非守護線(xiàn)程沒(méi)有結束,守護線(xiàn)程就全部工作;只有當最后一個(gè)非守護線(xiàn)程結束時(shí),守護線(xiàn)程隨著(zhù)JVM一同結束工作。
守護線(xiàn)程最典型的應用就是 GC (垃圾回收器)
9. volatile關(guān)鍵字是否能保證線(xiàn)程安全?()
答案:不能
解析:volatile關(guān)鍵字用在多線(xiàn)程同步中,可保證讀取的可見(jiàn)性,JVM只是保證從主內存加載到線(xiàn)程工作內存的值是最新的讀取值,而非cache中。但多個(gè)線(xiàn)程對
volatile的寫(xiě)操作,無(wú)法保證線(xiàn)程安全。例如假如線(xiàn)程1,線(xiàn)程2 在進(jìn)行read,load 操作中,發(fā)現主內存中count的值都是5,那么都會(huì )加載這個(gè)最新的值,在線(xiàn)程1堆count進(jìn)行修改之后,會(huì )write到主內存中,主內存中的count變量就會(huì )變?yōu)?;線(xiàn)程2由于已經(jīng)進(jìn)行read,load操作,在進(jìn)行運算之后,也會(huì )更新主內存count的變量值為6;導致兩個(gè)線(xiàn)程及時(shí)用volatile關(guān)鍵字修改之后,還是會(huì )存在并發(fā)的情況。
10. 下列說(shuō)法正確的是()
A LinkedList繼承自L(fǎng)ist
B AbstractSet繼承自Set
C HashSet繼承自AbstractSet
D WeakMap繼承自HashMap
答案:AC
11. 存在使i + 1 < i的數嗎()
答案:存在
解析:如果i為int型,那么當i為int能表示的最大整數時(shí),i+1就溢出變成負數了,此時(shí)不就
擴展:存在使i > j || i <= j不成立的數嗎()
答案:存在
解析:比如Double.NaN或Float.NaN,感謝@BuilderQiu網(wǎng)友指出。
12. 0.6332的數據類(lèi)型是()
A float B double C Float D Double
答案:B
解析:默認為double型,如果為float型需要加上f顯示說(shuō)明,即0.6332f
13. 下面哪個(gè)流類(lèi)屬于面向字符的輸入流( )
A BufferedWriter B FileInputStream C ObjectInputStream D InputStreamReader
答案:D
14. Java接口的修飾符可以為()
A private B protected C final D abstract
答案:CD
解析:接口很重要,為了說(shuō)明情況,這里稍微啰嗦點(diǎn):
(1)接口用于描述系統對外提供的所有服務(wù),因此接口中的成員常量和方法都必須是公開(kāi)(public)類(lèi)型的,確保外部使用者能訪(fǎng)問(wèn)它們;
(2)接口僅僅描述系統能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;
(3)接口不涉及和任何具體實(shí)例相關(guān)的細節,因此接口沒(méi)有構造方法,不能被實(shí)例化,沒(méi)有實(shí)例變量,只有靜態(tài)(static)變量;
(4)接口的中的變量是所有實(shí)現類(lèi)共有的,既然共有,肯定是不變的東西,因為變化的東西也不能夠算共有。所以變量是不可變(final)類(lèi)型,也就是常量了。
(5) 接口中不可以定義變量?如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無(wú)法通過(guò)行為來(lái)修改屬性。有的人會(huì )說(shuō)了,沒(méi)有關(guān)系,可以通過(guò) 實(shí)現接口的對象的行為來(lái)修改接口中的屬性。這當然沒(méi)有問(wèn)題,但是考慮這樣的情況。如果接口 A 中有一個(gè)public 訪(fǎng)問(wèn)權限的靜態(tài)變量 a。按照 Java 的語(yǔ)義,我們可以不通過(guò)實(shí)現接口的對象來(lái)訪(fǎng)問(wèn)變量 a,通過(guò) A.a = xxx; 就可以改變接口中的變量 a 的值了。正如抽象類(lèi)中是可以這樣做的,那么實(shí)現接口 A 的所有對象也都會(huì )自動(dòng)擁有這一改變后的 a 的值了,也就是說(shuō)一個(gè)地方改變了 a,所有這些對象中 a 的值也都跟著(zhù)變了。這和抽象類(lèi)有什么區別呢,怎么體現接口更高的抽象級別呢,怎么體現接口提供的統一的協(xié)議呢,那還要接口這種抽象來(lái)做什么呢?所以接口中 不能出現變量,如果有變量,就和接口提供的統一的抽象這種思想是抵觸的。所以接口中的屬性必然是常量,只能讀不能改,這樣才能為實(shí)現接口的對象提供一個(gè)統 一的屬性。
通俗的講,你認為是要變化的東西,就放在你自己的實(shí)現中,不能放在接口中去,接口只是對一類(lèi)事物的屬性和行為更高層次的抽象。對修改關(guān)閉,對擴展(不同的實(shí)現 implements)開(kāi)放,接口是對開(kāi)閉原則的一種體現。
所以:
接口的方法默認是public abstract;
接口中不可以定義變量即只能定義常量(加上final修飾就會(huì )變成常量)。所以接口的屬性默認是public static final 常量,且必須賦初值。
注意:final和abstract不能同時(shí)出現。
15. 不通過(guò)構造函數也能創(chuàng )建對象嗎()
A 是 B 否
答案:A
解析:Java創(chuàng )建對象的幾種方式(重要):
(1) 用new語(yǔ)句創(chuàng )建對象,這是最常見(jiàn)的創(chuàng )建對象的方法。
(2) 運用反射手段,調用java.lang.Class或者java.lang.reflect.Constructor類(lèi)的newInstance()實(shí)例方法。
(3) 調用對象的clone()方法。
(4) 運用反序列化手段,調用java.io.ObjectInputStream對象的 readObject()方法。
(1)和(2)都會(huì )明確的顯式的調用構造函數 ;(3)是在內存上對已有對象的影印,所以不會(huì )調用構造函數 ;(4)是從文件中還原類(lèi)的對象,也不會(huì )調用構造函數。
16. ArrayList list = new ArrayList(20);中的list擴充幾次()
A 0 B 1 C 2 D 3
答案:A
解析:這里有點(diǎn)迷惑人,大家都知道默認ArrayList的長(cháng)度是10個(gè),所以如果你要往list里添加20個(gè)元素肯定要擴充一次(擴充為原來(lái)的1.5倍),但是這里顯示指明了需要多少空間,所以就一次性為你分配這么多空間,也就是不需要擴充了。
17. 下面哪些是對稱(chēng)加密算法()
A DES B AES C DSA D RSA
答案:AB
解析:常用的對稱(chēng)加密算法有:DES、3DES、RC2、RC4、AES
常用的非對稱(chēng)加密算法有:RSA、DSA、ECC
使用單向散列函數的加密算法:MD5、SHA
18.新建一個(gè)流對象,下面哪個(gè)選項的代碼是錯誤的?()
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題的那個(gè)圖嗎?Reader只能用FileReader進(jìn)行實(shí)例化。
19. 下面程序能正常運行嗎()
public class NULL {
public static void haha(){
System.out.println("haha");
}
public static void main(String[] args) {
((NULL)null).haha();
}
}
答案:能正常運行
解析:輸出為haha,因為null值可以強制轉換為任何java類(lèi)類(lèi)型,(String)null也是合法的。但null強制轉換后是無(wú)效對象,其返回值還是為null,而static方法的調用是和類(lèi)名綁定的,不借助對象進(jìn)行訪(fǎng)問(wèn)所以能正確輸出。反過(guò)來(lái),沒(méi)有static修飾就只能用對象進(jìn)行訪(fǎng)問(wèn),使用null調用對象肯定會(huì )報空指針錯了。這里和C++很類(lèi)似。
【java基礎筆試題及答案】相關(guān)文章:
經(jīng)典的Java基礎面試題03-07
java考試試題及答案10-25
sun認證java基礎模擬試題03-30
java基礎面試題201703-30
NIIT認證Java基礎全真模擬試題03-08
java面試題2017及答案03-06
2016年Java筆試題及答案03-12
2017年Java筆試題及答案03-09