Java基礎知識&Spring&Ajax面試題
1. Java平臺分為哪幾個版本?
Java平臺有3個版本:適合於小型裝置和智慧卡的JavaME(Java Platform Micro Edition,Java微型版)、適用於桌面系統的JavaSE(Java Platform Standar Edition,Java標準版)和適用於企業級應用的JavaEE(Java Platform Enterprise Edition,Java企業版)
2. 什麼是Java EE?它包含哪些技術?
JavaEE(Java Enterprise Edition)是Sun一個開發分散式企業級應用的規範和標準
它包含JavaBean,JNDI,
3. 試比較String、StringBuffer和StringBuilder的區別。
這三個類都可以儲存和操作字串,即包含多個字元的字元資料。對於String類,一個字串物件一旦被配置,它的內容是固定不變。而這個StringBuffer類提供的字串可進行修改。當你知道字元資料要改變的時候你就可以使用StringBuffer和StringBuilder。StringBuilder是JavaSE5.0中新增的類,它被設計為與StringBuffer具有相同的操作介面,在單機非多執行緒的情況下使用
4. 說出ArrayList,Vector, LinkedList的儲存效能和特性。
ArrayList和Vector都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector由於使用了synchronized方法(執行緒安全),通常效能上較
5. 試比較HashMap和Hashtable的區別。
HashMap是Hashtable的輕量級實現(非執行緒安全的實現),他們都實現了Map介面,HashMap效率上高於Hashtable。
HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
最大的不同是,Hashtable的方法是Synchronized的,而HashMap不是,在多個執行緒訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。
Hashtable和HashMap採用的hash/rehash演算法都大概一樣,所以效能不會有很大的差異。
6. 試比較Collection和Collections區別。
Collection是介面,是集合框架的根,它有兩個子介面:Set和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。
7. Java中有哪些資料型別?有哪幾種基本資料型別?
Java中有基本資料型別和引用資料型別。基本資料型別包括byte、int、char、long、float、double、boolean和short。
8. 執行時異常與一般異常有何異同?
異常是表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。
9. int和Integer有什麼區別?
Java提供兩種不同的型別:引用型別和原始型別(或內建型別)。int是java的原始資料型別,Integer是java為int提供的封裝類。int的預設值為0,Integer的預設值為null。
10. 面向物件有哪些特徵?
封裝、繼承、多型和抽象
11. 請寫出Java中與基本資料型別相對應的封裝類?
boolean Boolean 、 char Character、 byte Byte、 short Short、 int Integer 、 long Long 、 float Float 、double Double。
12. Java中的執行緒有哪幾種狀態?
Java中的執行緒有以下幾種狀態:執行、就緒、掛起、結束。
13. 如何比較兩個陣列中元素值是否全部相等?
用Arrays類中的equals()方法。
14. 有哪幾種狀況會讓執行緒進入Blocked狀態?
1)等待輸入輸出完成;2)呼叫sleep()方法;3)嘗試獲得物件鎖定;4)呼叫wait()方法。
15. 簡述邏輯操作(&,|,^)與條件操作(&&,||)的區別。
條件操作只能操作布林型的,而邏輯操作不僅可以操作布林型,而且可以運算元值型(位運算);邏輯操作不會產生短路。
16. final, finally, finalize的區別。
final用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可被繼承。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。
17. Overload和Override有什麼區別?Overload的方法是否可以改變返回值的型別? 構造器Constructor是否可被override?
方法的重寫Overriding和過載Overloading是Java多型性的不同表現。重寫Overriding是父類與子類之間多型性的一種表現,過載Overloading是一個類中多型性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被”遮蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overloading)。Overloading的方法是可以改變返回值的型別。
18. error和exception有什麼區別?
error表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位,不可能指望程式能處理這樣的情況。 exception表示一種設計或實現問題。也就是說,它表示如果程式執行正常,從不會發生的情況。
19. abstract class和interface有什麼異同?
相同點:都是引用資料型別,都不能被例項化,但都可以宣告該型別的引用;抽象類的引用指向實現了抽象方法的子類物件,介面的引用指向實現了該介面的類的物件。
不同點:抽象類裡可以有實現方法,也可以有抽象方法,也可以沒有抽象方法,抽象方法不可以用private修飾,而接口裡的所有方法都是抽象方法而且是public;介面只可以定義static final成員變數。抽象類供子類繼承,並提供自已實現了的方法以及子類要實現的方法,如果子類還是沒有實現抽象類的抽象方法,則該類還是要宣告為抽象類,而介面提供類要實現的方法,實現介面的類必須要把介面中的方法全部實現;此外,介面可以繼承介面,甚至還支援多繼承。
20. GC是什麼? 為什麼要有GC?
GC是垃圾收集的意思(Garbage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,Java語言沒有提供釋放已分配記憶體的顯式操作方法。
21. String s = new String(“xyz”);建立了幾個String Object?
2個
22. 實現執行緒有哪幾種方式?啟動執行緒呼叫什麼方法?
Java中實現執行緒有兩種方式:第一種是繼承Thread,第二種是實現Runnable介面。啟動執行緒用start()方法。
23. 介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類(concrete class)?
介面可以繼承介面,也可以繼承多個介面。抽象類可以實現(implements)介面,抽象類可繼承實體類。
24. 陣列有沒有length()這個方法? String有沒有length()這個方法?
陣列沒有length()這個方法, String有length()這個方法
25. 是否可以繼承String類?
不可以,它是final類
26. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一個整數表示式。因此傳遞給switch和case語句的引數應該是int、 short、 char或者byte。Long,String都不能作用於swtich。
27. try { }裡有一個return語句,那麼緊跟在這個try後的finally { }裡的code會不會被執行,什麼時候被執行,在return前還是後?
會執行,在return前執行。
28. 當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?
是值傳遞。Java程式語言只有值傳遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是對該物件的引用。物件的內容可以在被呼叫的方法中改變,但物件的引用是永遠不會改變的。
29. char型變數中能不能儲存一箇中文漢字?為什麼?
能夠儲存成為一箇中文的,因為java中以unicode編碼,一個char佔16個位元組,所以放一箇中文是沒問題的。
30. 請說出你所知道的執行緒同步的方法。
wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock。
sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由JVM確定喚醒哪個執行緒,而且不是按優先順序。
notityAll():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。
用最有效率的方法算出2乘以8等於幾?兩
31.
2 << 3
32. 兩個物件值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
對。可有相同的hashcode,也可以有不同的hashcode。
33. List, Set, Map是否繼承自Collection介面?
List,Set繼承Collection,而Map不繼承Colleciton。
34. 寫出最常見到的一些runtime exception。
ArithmeticException, classCastException, , IllegalArgumentException, IndexOutOfBoundsException,NullPointerException,SystemException等。
35. short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換型別)
short s1 = 1; s1 += 1;(可以正確編譯)
36. 什麼時候用assert?
assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語言中都支援這種機制。在實現中,assertion就是在程式中的一條語句,它對一個boolean表示式進行檢查,一個正確程式必須保證這個boolean表示式的值為true;如果該值為false,說明程式已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion用於保證程式最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為了提高效能,在軟體釋出後,assertion檢查通常是關閉的。
37. sleep() 和wait() 有什麼區別?
sleep是執行緒類(Thread)的方法,導致此執行緒暫停執行指定時間,把執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復。呼叫sleep不會釋放物件鎖。
wait是Object類的方法,對此物件呼叫wait方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件發出notify方法(或notifyAll)後本執行緒才進入物件鎖定池準備獲得物件鎖進入執行狀態。
38. Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12
Math.round(-11.5)==-11
round方法返回與引數最接近的長整數,引數加1/2後求其floor.
39. 說出資料連線池的工作機制。
J2EE伺服器啟動時會建立一定數量的池連線,並一直維持不少於此數目的池連線。客戶端程式需要連線時,池驅動程式會返回一個未使用的池連線並將其標記為忙。如果當前沒有空閒連線,池驅動程式就新建一定數量的連線,新建連線的數量有配置引數決定。當使用的池連線呼叫完成後,池驅動程式將此連線表記為空閒,其他呼叫就可以使用這個連線。
40. abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?
都不能
41. 寫一個Singleton示例
Singleton模式主要作用是保證在Java應用程式中,一個類Class只有一個例項存在。
一般Singleton模式通常有幾種形式:
第一種形式:
public class Singleton {
private Singleton(){ }
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)
instance=new Singleton();
return instance; }
}
42. 什麼是java序列化,如何實現java序列化?
序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題。
序列化的實現:將需要被序列化的類實現Serializable介面,該介面沒有需要實現的方法,implements Serializable只是為了標註該物件是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(物件流)物件,接著,使用ObjectOutputStream物件的writeObject(Object obj)方法就可以將引數為obj的物件寫出(即儲存其狀態),要恢復的話則用輸入流。
43. 是否可以從一個static方法內部發出對非static方法的呼叫?
不可以,如果其中包含物件的method();不能保證物件初始化.
44. 垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收記憶體嗎?有什麼辦法主動通知虛擬機器進行垃圾回收?
對於GC來說,當程式設計師建立物件時,GC就開始監控這個物件的地址、大小以及使用情況。通常,GC採用有向圖的方式記錄和管理堆(heap)中的所有物件。通過這種方式確定哪些物件是”可達的”,哪些物件是”不可達的”。當GC確定一些物件為”不可達”時,GC就有責任回收這些記憶體空間。可以。程式設計師可以手動執行System.gc(),通知GC執行,但是Java語言規範並不保證GC一定會執行。
45. java中會存在記憶體洩漏嗎?
Java也存在記憶體洩露問題,其原因主要是一些物件雖然不再被使用,但它們仍然被引用。
46. java中實現多型的機制是什麼?
方法的重寫Overriding和過載Overloading是Java多型性的不同表現。重寫Overriding是父類與子類之間多型性的一種表現,過載Overloading是一個類中多型性的一種表現。
47. 寫clone()方法時,通常都有一行程式碼,是什麼?
Clone有預設行為,super.clone();他負責產生正確大小的空間,並逐位複製。
48. List、Map、Set三個介面,存取元素時,各有什麼特點?
List以特定次序來持有元素,可有重複元素。Set無法擁有重複元素,內部排序。Map儲存key-value值,key不可重複,value可重複。
49. 說出一些常用的類、包和介面,請各舉5個。
常用的類:StringBuffer Scanner String Integer ArrayList
常用的包:java.lang java.text java.io java.util java.sql
常用的介面:Set List Map Collection Iterator
50. 請用LinkedList實現一個簡單的Queue。
public class StringQueue {
private LinkedList<String> linkedList;
public StringQueue() {
linkedList = new LinkedList<String>();
}
public void put(String name) {
linkedList.addFirst(name);
}
public String get() {
return linkedList.removeLast();
}
public boolean isEmpty() {
return linkedList.isEmpty();
}
}
51. 請用LinkedList實現一個簡單的堆疊。
public class StringStack {
private LinkedList<String> linkedList;
public StringStack() {
linkedList = new LinkedList<String>();
}
public void push(String name) {
// 將元素加入連結串列前端
linkedList.addFirst(name);
}
public String top() {
// 取得連結串列第一個元素
return linkedList.getFirst();
}
public String pop() {
// 移出第一個元素
return linkedList.removeFirst();
}
public boolean isEmpty() {
// 連結串列是否為空
return linkedList.isEmpty();
}
}
52. 一個”.java”原始檔中是否可以包括多個類(不是內部類)?有什麼限制?
可以。必須只有一個類名與檔名相同。
53. java中有幾種型別的流?JDK為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
位元組流和字元流。位元組流繼承於InputStream(輸入)或OutputStream(輸出),字元流繼承於Reader(輸入) 或Writer(輸出)。在java.io包中還有許多其他的流,主要是為了提高效能和使用方便。
54. JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?
Java通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在Java中,每個異常都是一個物件,它是Throwable類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行處理。Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程式,如果出現異常,系統會丟擲(throws)一個異常,這時候你可以通過它的型別來捕捉(catch)它,或最後(finally)由預設處理器來處理。
用try來指定一塊預防所有異常的程式。緊跟在try程式後面,應包含一個catch子句來指定你想要捕捉的”異常”的型別。
throw語句用來明確地丟擲一個異常物件。
throws用來標明一個成員函式可能丟擲的各種異常類。
finally為確保一段程式碼不管發生什麼異常都被執行一段程式碼。
可以在一個成員函式呼叫的外面寫一個try語句,在這個成員函式內部寫另一個try語句保護其他程式碼。每當遇到一個try語句,異常的框架就放到堆疊上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種”異常”進行處理,堆疊就會展開,直到遇到有處理這種異常的try語句。
55. 排序都有哪幾種方法?並用虛擬碼實現一個快速排序。
排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(氣泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排序、基數排序)。
快速排序的虛擬碼。
/ /使用快速排序方法對a[ 0 :n- 1 ]排序
從a[ 0 :n- 1 ]中選擇一個元素作為m i d d l e,該元素為支點
把餘下的元素分割為兩段left和r i g h t,使得l e f t中的元素都小於等於支點,而right中的元素都大於等於支點
遞迴地使用快速排序方法對left進行排序
遞迴地使用快速排序方法對right進行排序
所得結果為l e f t + m i d d l e + r i g h t
56. 簡述synchronized和java.util.concurrent.locks.Lock的異同 ?
主要相同點:Lock能完成synchronized所實現的所有功能
主要不同點:Lock有比synchronized更精確的執行緒語義和更好的效能。synchronized會自動釋放鎖,而Lock一定要求程式設計師手工釋放,並且必須在finally從句中釋放。
57. 在JAVA中,如何跳出當前的多重巢狀迴圈?
用break+lable、continue+lable或return。
58. Java中的關鍵字transient、Synchronized有什麼含義?
用synchronized關鍵字修飾同步方法;transient為變數修飾符。標記為transient的變數,在物件儲存時,這些變數狀態不會被持久化。當物件序列化時儲存在儲存器上時,不希望有些欄位資料被儲存,為了保證安全性,可以把這些欄位宣告為transient。
59. 同步和非同步有何異同,在什麼情況下分別使用他們?舉例說明。
如果資料將線上程間共享。例如正在寫的資料以後可能被另一個執行緒讀到,或者正在讀的資料可能已經被另一個執行緒寫過了,那麼這些資料就是共享資料,必須進行同步存取。
當應用程式在物件上呼叫了一個需要花費很長時間來執行的方法,並且不希望讓程式等待方法的返回時,就應該使用非同步程式設計,在很多情況下采用非同步途徑往往更有效率。
60. 內部類可以引用它包含類的成員嗎?有沒有什麼限制?
內部類可以引用它包含類的成員。 如果內部類是在方法中定義的,只能訪問方法中的final型別的區域性變數,因為用final定義的區域性變數相當於是一常量,它的生命週期超出方法執行的生命週期。
61. Java具有什麼特點?
簡單性、面向物件、分散式、健壯性、結構中立、安全性、與平臺無關、解釋執行、高效能、多執行緒以及動態性。
62. 談談你對PreparedStatement, CallableStatement和Statement的理解。
Statement: 主要用來執行一條單獨的sql語句,他主要有三個方法executeUpate(),executeQuery()和exceute()。
PreparedStatement: 它繼承Statement,主要用在多次執行一個sql語句,執行效率較高,還可以防止sql注入攻擊漏洞。
CallableStatement:它繼承PreparedStatement,主要用於執行儲存過程。主要有registerOutParamenter()等方法。
63. 寫一個方法用來把採用ISO-8859-1字元編碼的字串轉換成用GBK進行編碼的字串。
public String convertString(String str){
String result=null;
if(result==null)
return null;
else{
try {
result=new String(str.getBytes(“ISO-8859-1”),”GBK”);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
64. 簡述private、 protected、 public、 預設修飾符的訪問許可權。
public:表明該成員變數和方法是公共的,能在任何情況下被訪問。
protected:必須在同一包中才能被訪問,還可被其子類訪問
private: 只能在本類中訪問。
預設:只能在同一個包中被訪問
65. 請寫出JDK、JRE、JVM的全稱。
JDK(Java Development kits) ,JRE(Java Runtime Enviroment) ,JVM(Java Virtual Machine)
66. 你在編碼過程中,註釋一般佔程式碼多少比例?
至少15%以上。
67. 請寫出執行後x的結果:int x,a=2,b=3,c=4; x=++a+b+++c++;
結果為10。
68. 用applet編寫一個輸出hello的程式
//Firstapplet.java
import java.awt.*;
import java.applet.*;
public class Firstapplet extends Applet {
String s;
public void init() {
s= “hello”;
}
public void paint(Graphics g){
g.drawString(s, 70, 80);
}
}
//test.html
<html>
<applet code=Firstapplet width=200 height=200>
</applet>
</html>
69. 請寫一個程式,並計算1+2-3+4-5+6....+m的結果。
public int calSum(int n){
int result=1;
for (int i = 2; i <= n; i++) {
result+=(i%2==0:1:-1)*i;
}
return result;
}
70. A byte=128 B. boolean b=mull; C. long d=0xff2; D. double d=0.9239d哪種寫法是正確的?
cd
71. 請寫一段JDB(連下列任意資料庫:Oracle/sql server/my sql的程式)並實現資料查詢(略)
72. Java中連線資料庫有哪幾種方式?
JDBC-ODBC橋驅動,本地API部分呼叫驅動、JDBC-Net純Java驅動以及本地協議純Java驅動。
73. 計算1、1、2、3、5、8、13、21、34……..第n位的值是多少?(遞迴演算法實現)
public int fibnacci(int n){
if(n==1 ||n==2)
retu