- 相關(guān)推薦
J2EE筆試題目及答案
在社會(huì )的各個(gè)領(lǐng)域,我們最離不開(kāi)的就是試題了,試題可以幫助參考者清楚地認識自己的知識掌握程度。大家知道什么樣的試題才是好試題嗎?以下是小編收集整理的J2EE筆試題目及答案,希望對大家有所幫助。
J2EE筆試題目及答案 1
1、heap和stack有什么區別?
答:棧是一種線(xiàn)形集合,其添加和刪除元素的操作應在同一段完成。棧按照后進(jìn)先出的方式進(jìn)行處理。堆是棧的一個(gè)組成元素
2、Java中的異常處理機制的簡(jiǎn)單原理和應用
答:當JAVA程序違反了JAVA的語(yǔ)義規則時(shí),JAVA虛擬機就會(huì )將發(fā)生的錯誤表示為一個(gè)異常。違反語(yǔ)義規則包括2種情況。一種是JAVA類(lèi)庫 內置的語(yǔ)義檢查。例如數組下標越界,會(huì )引發(fā)IndexOutOfBoundsException;訪(fǎng)問(wèn)null的對象時(shí)會(huì )引發(fā) NullPointerException。另一種情況就是JAVA允許程序員擴展這種語(yǔ)義檢查,程序員可以創(chuàng )建自己的異常,并自由選擇在何時(shí)用 throw關(guān)鍵字引發(fā)異常。所有的異常都是java.lang.Thowable的子類(lèi)。
3、垃圾回收的優(yōu)點(diǎn)和原理。并考慮2種回收機制
答:Java語(yǔ)言中一個(gè)顯著(zhù)的特點(diǎn)就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問(wèn)題迎刃而解,它使得Java程序員在編寫(xiě)程序的時(shí) 候不再需要考慮內存管理。由于有個(gè)垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用才有"作用域"。垃圾回收可以有效的防止內存泄 露,有效的使用可以使用的內存。垃圾回收器通常是作為一個(gè)單獨的低級別的線(xiàn)程運行,不可預知的情況下對內存堆中已經(jīng)死亡的或者長(cháng)時(shí)間沒(méi)有使用的對象進(jìn)行清 楚和回收,程序員不能實(shí)時(shí)的調用垃圾回收器對某個(gè)對象或所有對象進(jìn)行垃圾回收;厥諜C制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。
4、你所知道的集合類(lèi)都有哪些?主要方法?
答:最常用的集合類(lèi)是 List 和 Map。 List 的具體實(shí)現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、存儲和操作任何類(lèi)型對象的元素列表。 List 適用于按數值索引訪(fǎng)問(wèn)元素的情形。
Map 提供了一個(gè)更通用的元素存儲方法。 Map 集合類(lèi)用于存儲元素對(稱(chēng)作"鍵"和"值"),其中每個(gè)鍵映射到一個(gè)值。
5、描述一下JVM加載class文件的原理機制?
答:JVM中類(lèi)的裝載是由ClassLoader和它的子類(lèi)來(lái)實(shí)現的,Java ClassLoader 是一個(gè)重要的Java運行時(shí)系統組件。它負責在運行時(shí)查找和裝入類(lèi)文件的類(lèi)。
6、排序都有哪幾種方法?請列舉
答: 排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸并排序,分配排序(箱排序、基數排序)
快速排序的偽代碼。
/ /使用快速排序方法對a[ 0 :n- 1 ]排序
從a[ 0 :n- 1 ]中選擇一個(gè)元素作為m i d d l e,該元素為支點(diǎn)
把余下的元素分割為兩段left 和r i g h t,使得l e f t中的元素都小于等于支點(diǎn),而right 中的元素都大于等于支點(diǎn)
遞歸地使用快速排序方法對left 進(jìn)行排序
遞歸地使用快速排序方法對right 進(jìn)行排序
所得結果為l e f t + m i d d l e + r i g h t
7、JAVA語(yǔ)言如何進(jìn)行異常處理,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以?huà)伋霎惓幔?/p>
答:Java通過(guò)面向對象的方法進(jìn)行異常處理,把各種不同的異常進(jìn)行分類(lèi),并提供了良好的接口。在Java中,每個(gè)異常都是一個(gè)對象,它是 Throwable類(lèi)或其它子類(lèi)的實(shí)例。當一個(gè)方法出現異常后便拋出一個(gè)異常對象,該對象中包含有異常信息,調用這個(gè)對象的方法可以捕獲到這個(gè)異常并進(jìn)行 處理。Java的異常處理是通過(guò)5個(gè)關(guān)鍵詞來(lái)實(shí)現的:try、catch、throw、throws和finally。一般情況下是用try來(lái)執行一段程 序,如果出現異常,系統會(huì )拋出(throws)一個(gè)異常,這時(shí)候你可以通過(guò)它的類(lèi)型來(lái)捕捉(catch)它,或最后(finally)由缺省處理器來(lái)處 理。
用try來(lái)指定一塊預防所有"異常"的程序。緊跟在try程序后面,應包含一個(gè)catch子句來(lái)指定你想要捕捉的"異常"的類(lèi)型。
throw語(yǔ)句用來(lái)明確地拋出一個(gè)"異常"。
throws用來(lái)標明一個(gè)成員函數可能拋出的各種"異常"。
Finally為確保一段代碼不管發(fā)生什么"異常"都被執行一段代碼。
可以在一個(gè)成員函數調用的外面寫(xiě)一個(gè)try語(yǔ)句,在這個(gè)成員函數內部寫(xiě)另一個(gè)try語(yǔ)句保護其他代碼。每當遇到一個(gè)try語(yǔ)句,"異常"的框架就 放到堆棧上面,直到所有的try語(yǔ)句都完成。如果下一級的try語(yǔ)句沒(méi)有對某種"異常"進(jìn)行處理,堆棧就會(huì )展開(kāi),直到遇到有處理這種"異常"的try語(yǔ) 句。
8、一個(gè)".java"源文件中是否可以包括多個(gè)類(lèi)(不是內部類(lèi))?有什么限制?
答:可以。必須只有一個(gè)類(lèi)名與文件名相同。
9、java中有幾種類(lèi)型的流?JDK為每種類(lèi)型的流提供了一些抽象類(lèi)以供繼承,請說(shuō)出他們分別是哪些類(lèi)?
答:字節流,字符流。字節流繼承于InputStream OutputStream,字符流繼承于InputStreamReader OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。
10、java中會(huì )存在內存泄漏嗎,請簡(jiǎn)單描述。
答:會(huì )。自己實(shí)現堆載的數據結構時(shí)有可能會(huì )出現內存泄露
11、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內存嗎?有什么辦法主動(dòng)通知虛擬機進(jìn)行垃圾回收
答:對于GC來(lái)說(shuō),當程序員創(chuàng )建對象時(shí),GC就開(kāi)始監控這個(gè)對象的地址、大小以及使用情況。通常,GC采用有向圖的`方式記錄和管理堆(heap) 中的所有對象。通過(guò)這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象為"不可達"時(shí),GC就有責任回收這些內存空間? 以。程序員可以手動(dòng)執行System.gc(),通知GC運行,但是Java語(yǔ)言規范并不保證GC一定會(huì )執行。
12、靜態(tài)變量和實(shí)例變量的區別?
答:static i = 10; //常量 class A a; a.i =10;//可變
13、什么是java序列化,如何實(shí)現java序列化?
答:序列化就是一種用來(lái)處理對象流的機制,所謂對象流也就是將對象的內容進(jìn)行流化?梢詫α骰蟮膶ο筮M(jìn)行讀寫(xiě)操作,也可將流化后的對象傳輸于網(wǎng)絡(luò )之間。序列化是為了解決在對對象流進(jìn)行讀寫(xiě)操作時(shí)所引發(fā)的問(wèn)題。
序列化的實(shí)現:將需要被序列化的類(lèi)實(shí)現Serializable接口,該接口沒(méi)有需要實(shí)現的方法,implements Serializable只是為了標注該對象是可被序列化的,然后使用一個(gè)輸出流(如:FileOutputStream)來(lái)構造一個(gè) ObjectOutputStream(對象流)對象,接著(zhù),使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫(xiě)出(即保存其狀態(tài)),要恢復的話(huà)則用輸入流。
14、是否可以從一個(gè)static方法內部發(fā)出對非static方法的調用?
答:不可以,如果其中包含對象的method();不能保證對象初始化.
15、寫(xiě)clone()方法時(shí),通常都有一行代碼,是什么?
答:Clone 有缺省行為,super.clone();他負責產(chǎn)生正確大小的空間,并逐位復制。
16、在JAVA中,如何跳出當前的多重嵌套循環(huán)?
答:用break; return 方法。
17、List、Map、Set三個(gè)接口,存取元素時(shí),各有什么特點(diǎn)?
答:List 以特定次序來(lái)持有元素,可有重復元素。Set 無(wú)法擁有重復元素,內部排序。Map 保存key-value值,value可多值。
18、說(shuō)出一些常用的類(lèi),包,接口,請各舉5個(gè)
答:常用的類(lèi):BufferedReader BufferedWriter FileReader FileWirter String Integer
常用的包:java.lang java.awt java.io java.util java.sql
常用的接口:Remote List Map Document NodeList
19、描述使用JDBC連接數據庫的過(guò)程
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:obdc:mydb";
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
ResultSet rs = stmt.execte("select * from mytable");
20、什么是JNDI?
java命名目錄接口
J2EE筆試題目及答案 2
1、在java中如果聲明一個(gè)類(lèi)為final,表示什么意思?
答:final是最終的意思,final可用于定義變量、方法和類(lèi)但含義不同,聲明為final的類(lèi)不能被繼承。
2、父類(lèi)的構造方法是否可以被子類(lèi)覆蓋(重寫(xiě))?
答:父類(lèi)的構造方法不可以被子類(lèi)覆蓋,因為父類(lèi)和子類(lèi)的類(lèi)名是不可能一樣的。
3、請講述String 和StringBuffer的`區別。
答:String 類(lèi)所定義的對象是用于存放“長(cháng)度固定”的字符串。
StringBuffer類(lèi)所定義的對象是用于存放“長(cháng)度可變動(dòng)”的字符串。
4、如果有兩個(gè)類(lèi)A、B(注意不是接口),你想同時(shí)使用這兩個(gè)類(lèi)的功能,那么你會(huì )如何編寫(xiě)這個(gè)C類(lèi)呢?
答:因為類(lèi)A、B不是接口,所以是不可以直接繼承的,但可以將A、B類(lèi)定義成父子類(lèi),那么C類(lèi)就能實(shí)現A、B類(lèi)的功能了。假如A為B的父類(lèi),B為C的父類(lèi),此時(shí)C就能實(shí)現A、B的功能。
5、結合Java視頻Lesson5(多線(xiàn)程),分析sleep()和wait()方法的區別。
答: Sleeping睡眠的意思 : sleep() 方法用來(lái)暫時(shí)中止執行的線(xiàn)程。在睡眠后,線(xiàn)程將進(jìn)入就緒狀態(tài)。
waiting等待的意思: 如果調用了 wait() 方法,線(xiàn)程將處于等待狀態(tài)。用于在兩個(gè)或多個(gè)線(xiàn)程并發(fā)運行時(shí)。
6、談?wù)勀銓Τ橄箢?lèi)和接口的理解。
答:定義抽象類(lèi)的目的是提供可由其子類(lèi)共享的一般形式、子類(lèi)可以根據自身需要擴展抽象類(lèi)、抽象類(lèi)不能實(shí)例化、抽象方法沒(méi)有函數體、抽象方法必須在子類(lèi)中給出具體實(shí)現。他使用extends來(lái)繼承。
接口:一個(gè)接口允許一個(gè)類(lèi)從幾個(gè)接口繼承而來(lái),Java 程序一次只能繼承一個(gè)類(lèi)但可以實(shí)現幾個(gè)接口,接口不能有任何具體的方法,接口也可用來(lái)定義可由類(lèi)使用的一組常量。其實(shí)現方式是interface來(lái)實(shí)現。
J2EE筆試題目及答案 3
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等。檢查了的異常發(fā)生在編譯階段,必須要使用try…catch(或者throws)否則編譯不通過(guò)。
unchecked exceptions: 通常是如果一切正常的話(huà)本不該發(fā)生的異常,但是的確發(fā)生了。發(fā)生在運行期,具有不確定性,主要是由于程序的邏輯問(wèn)題所引起的。比如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");
}
#FormatImgID_0#
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
解析:下面是一張下載的Java中的集合類(lèi)型的繼承關(guān)系圖,一目了然。
#FormatImgID_1#
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
解析:Java的IO操作中有面向字節(Byte)和面向字符(Character)兩種方式。
面向字節的操作為以8位為單位對二進(jìn)制的數據進(jìn)行操作,對數據不進(jìn)行轉換,這些類(lèi)都是InputStream和OutputStream的子類(lèi)。
面向字符的操作為以字符為單位對數據進(jìn)行操作,在讀的時(shí)候將二進(jìn)制數據轉為字符,在寫(xiě)的時(shí)候將字符轉為二進(jìn)制數據,這些類(lèi)都是Reader和Writer的子類(lèi)。
總結:以InputStream(輸入)/OutputStream(輸出)為后綴的是字節流;
以Reader(輸入)/Writer(輸出)為后綴的是字符流。
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ì )調用構造函數。
坐完筆試后,很多人都希望能提前預知面試題目,最好的方法就是整理一些經(jīng)典的面試題,java面試的專(zhuān)業(yè)性比較強,如果你的基礎不夠扎實(shí),那么最好找些經(jīng)典的java面試題及答案分析,提前參透一下吧!
java面試題1、說(shuō)說(shuō)HashMap和Hashtable的差別
答案分析:
都屬于Map接口的類(lèi),實(shí)現了將惟一鍵映射到特定的值上。
HashMap類(lèi)沒(méi)有分類(lèi)或排序。他允許一個(gè)null鍵和多個(gè)null值。
Hashtable類(lèi)似于HashMap,不過(guò)不允許null鍵和null值。他也比HashMap慢,因為他是同步的。
java面試題2、Anonymous Inner Class (匿名內部類(lèi))是否能extends(繼承)其他類(lèi),是否implements(實(shí)現)interface(接口)?
答案分析:
匿名的內部類(lèi)是沒(méi)有名字的內部類(lèi)。不能extends(繼承)其他類(lèi),但一個(gè)內部類(lèi)能作為一個(gè)接口,由另一個(gè)內部類(lèi)實(shí)現。
java面試題3、STRING與STRINGBUFFER的區別是什么?
答案分析:
STRING的長(cháng)度是不可變的,STRINGBUFFER的長(cháng)度是可變的。如果你對字符串中的內容經(jīng)常進(jìn)行操作,特別是內容要修改時(shí),那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。
java面試題4、什么時(shí)候用assert
答案分析:
斷言是個(gè)包含布爾表達式的語(yǔ)句,在執行這個(gè)語(yǔ)句時(shí)假定該表達式為true。如果表達式計算為false,那么系統會(huì )報告一個(gè)AssertionError,他用于調試目的。
java面試題5、Set里的元素是不能重復的,那么用什么方法來(lái)區分重復和否呢?是用==還是equals()?他們有何差別?
答案分析:
Set里的元素是不能重復的,那么用iterator()方法來(lái)區分重復和否。equals()是判讀兩個(gè)Set是否相等。
equals()和==方法決定引用值是否指向同一對象equals()在類(lèi)中被覆蓋,為的是當兩個(gè)分離的對象的內容和類(lèi)型相配的話(huà),返回真值。
java面試題6、List, Set, Map是否繼承自Collection接口?
答案分析:
List,Set是
Map不是
J2EE筆試題目及答案 4
1)Java 中能創(chuàng )建 Volatile 數組嗎?
能,Java 中可以創(chuàng )建 volatile 類(lèi)型數組,不過(guò)只是一個(gè)指向數組的引用,而不是整個(gè)數組。我的意思是,如果改變引用指向的數組,將會(huì )受到 volatile 的保護,但是如果多個(gè)線(xiàn)程同時(shí)改變數組的元素,volatile 標示符就不能起到之前的保護作用了。
2)volatile 能使得一個(gè)非原子操作變成原子操作嗎?
一個(gè)典型的例子是在類(lèi)中有一個(gè) long 類(lèi)型的成員變量。如果你知道該成員變量會(huì )被多個(gè)線(xiàn)程訪(fǎng)問(wèn),如計數器、價(jià)格等,你最好是將其設置為 volatile。為什么?因為 Java 中讀取 long 類(lèi)型變量不是原子的,需要分成兩步,如果一個(gè)線(xiàn)程正在修改該 long 變量的值,另一個(gè)線(xiàn)程可能只能看到該值的一半(前 32 位)。但是對一個(gè) volatile 型的 long 或 double 變量的讀寫(xiě)是原子。
3)volatile 修飾符的有過(guò)什么實(shí)踐?
一種實(shí)踐是用 volatile 修飾 long 和 double 變量,使其能按原子類(lèi)型來(lái)讀寫(xiě)。double 和 long 都是64位寬,因此對這兩種類(lèi)型的讀是分為兩部分的,第一次讀取第一個(gè) 32 位,然后再讀剩下的 32 位,這個(gè)過(guò)程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫(xiě)是原子的。volatile 修復符的另一個(gè)作用是提供內存屏障(memory barrier),例如在分布式框架中的應用。簡(jiǎn)單的說(shuō),就是當你寫(xiě)一個(gè) volatile 變量之前,Java 內存模型會(huì )插入一個(gè)寫(xiě)屏障(write barrier),讀一個(gè) volatile 變量之前,會(huì )插入一個(gè)讀屏障(read barrier)。意思就是說(shuō),在你寫(xiě)一個(gè) volatile 域時(shí),能保證任何線(xiàn)程都能看到你寫(xiě)的值,同時(shí),在寫(xiě)之前,也能保證任何數值的`更新對所有線(xiàn)程是可見(jiàn)的,因為內存屏障會(huì )將其他所有寫(xiě)的值更新到緩存。
4)volatile 類(lèi)型變量提供什么保證?(答案)
volatile 變量提供順序和可見(jiàn)性保證,例如,JVM 或者 JIT為了獲得更好的性能會(huì )對語(yǔ)句重排序,但是 volatile 類(lèi)型變量即使在沒(méi)有同步塊的情況下賦值也不會(huì )與其他語(yǔ)句重排序。 volatile 提供 happens-before 的保證,確保一個(gè)線(xiàn)程的修改能對其他線(xiàn)程是可見(jiàn)的。某些情況下,volatile 還能提供原子性,如讀 64 位數據類(lèi)型,像 long 和 double 都不是原子的,但 volatile 類(lèi)型的 double 和 long 就是原子的。
5) 10 個(gè)線(xiàn)程和 2 個(gè)線(xiàn)程的同步代碼,哪個(gè)更容易寫(xiě)?
從寫(xiě)代碼的角度來(lái)說(shuō),兩者的復雜度是相同的,因為同步代碼與線(xiàn)程數量是相互獨立的。但是同步策略的選擇依賴(lài)于線(xiàn)程的數量,因為越多的線(xiàn)程意味著(zhù)更大的競爭,所以你需要利用同步技術(shù),如鎖分離,這要求更復雜的代碼和專(zhuān)業(yè)知識。
6)你是如何調用 wait()方法的?使用 if 塊還是循環(huán)?為什么?(答案)
wait() 方法應該在循環(huán)調用,因為當線(xiàn)程獲取到 CPU 開(kāi)始執行的時(shí)候,其他條件可能還沒(méi)有滿(mǎn)足,所以在處理前,循環(huán)檢測條件是否滿(mǎn)足會(huì )更好。下面是一段標準的使用 wait 和 notify 方法的代碼:
// The standard idiom for using the wait method
參見(jiàn) Effective Java 第 69 條,獲取更多關(guān)于為什么應該在循環(huán)中來(lái)調用 wait 方法的內容。
【J2EE筆試題目及答案】相關(guān)文章:
JAVA經(jīng)典筆試題目及答案(精選7套)08-03
J2EE經(jīng)典面試題及答案01-21
J2EE面試題及答案「精選」03-17
PHOTOSHOP認證題目及答案01-22
java基礎筆試題及答案03-03
cad筆試試題及答案10-19
excel選擇題目及答案05-26
2016年J2EE認證試題(附答案)03-28
2016年J2EE面試題及答案「精選」03-18