Java面試題目
第一部分:問答題,每道題3分
1. Java基本的數據類型有哪些?
boolean ,byte ,char ,short ,int ,long ,float ,double
2. String 和StringBuffer的主要區別
String 的長度是不可變的,StringBuffer的長度是可變的。如果對字符串中的內容經常進行操作,特別是內容要修改時,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。
3. 運行時異常與一般異常有何異同?
異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。
一般異常是原代碼的問題,運行時異常是虛擬機的問題。
一般異常可以捕獲,運行時異常就管不了,無能為力(也可以捕獲)。
4. 說出Servlet的生命周期。
Servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。
5. 說出ArrayList, Vector, LinkedList的存儲性能和特性
ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。
6. Collection 和 Collections的區別。
Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
7. &和&&的區別。
&是位運算符。&&是布爾邏輯運算符。
8. HashMap和Hashtable的區別。
都屬于Map接口的類,實現了將惟一鍵映射到特定的值上。
HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。 Hashtable 類似于 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步的。
9. final, finally, finalize的區別。
final—修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
finally—在異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執行,然后控制就會進入 finally 塊(如果有的話)。
finalize—方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。
10. sleep() 和 wait() 有什么區別?
sleep()方法是使線程停止一段時間的方法。在sleep 時間間隔期滿后,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)“醒來”的線程具有更高的優先級 (b)正在運行的線程因為其它原因而阻塞。
wait()是線程交互時,如果線程對一個同步對象x 發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。
11. Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?
Overload是覆蓋,子類的方法跟父類方法名字一樣,子類的方法把父類的覆蓋了。
Override是重載,不同的方法參數、返回值不一樣,緊緊返回值不一樣的兩個函數不叫重載,編譯不會通過的。
Overloaded的方法是可以改變返回值的類型。
12. error和exception有什么區別?
Error表示系統級的錯誤和程序不必處理的異常,
Exception表示需要捕捉或者需要程序進行處理的異常。
13. abstract class和interface有什么區別?
1、接口可以多重implement(實現),抽象類只能單一extends(繼承)
2、接口內只能是功能的定義,抽象類中可以包括功能的定義和功能的實現。
3、接口字段定義默認為public static final,而抽象類的則默認為friendly。
14. Servlet中forward 和redirect的區別
Redirect()是向瀏覽器發送一個redirect通知,瀏覽器重定向到新的URL。
而forward是在服務器端直接轉到新的URL,對于瀏覽器是透明的。
前者瀏覽器的地址欄顯示的是新的URL,后者瀏覽器的地址欄顯示的是Servlet的URL。
因而當目標URL會自動刷新時,兩者會造成一些差別。
15. JSP中動態INCLUDE與靜態INCLUDE的區別?
動態INCLUDE用jsp:include動作實現它總是會檢查所含文件中的變化,適合用于包含動態頁面,并且可以帶參數。
靜態INCLUDE用include偽碼實現,定不會檢查所含文件的變化,適用于包含靜態頁面
16. short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1; 有什么錯?
short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。
17. Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)=12;
Math.round(-11.5)=-11;
18. 啟動一個線程是用run()還是start()?
啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。這并不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。
19. 應用服務器有那些(列出至少3個)?
WebLogic、WebSphere、Tomcat、Resin、JBoss
20. 給我一個你最常見到的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
21. 接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?
接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。
23. abstract的method是否可同時是static? 是否可同時是native? 是否可同時是synchronized?
都不能
24. 數組有沒有length()這個方法? String有沒有length()這個方法?
數組沒有length()這個方法,有length的屬性。
String有length()這個方法。
25. Set里的元素是不能重復的,那么用什么方法來區分重復與否呢?
Set里的元素是不能重復的,那么用iterator()方法來區分重復與否
26. 構造器Constructor是否可被override?
構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
27. 是否可以繼承String類?
String類是final類故不可以繼承
28. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
29. try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?
會執行,在return前執行。
30. 當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?
不能,一個對象的一個synchronized方法只能由一個線程訪問
31. Java中最頂層的集合接口有哪些?
接口有兩層,頂層接口有Collection,直接子接口有List,Set;Map沒有繼承Collection
32. 多線程有幾種實現方法,都是什么? 同步有幾種實現方法是什么?
多線程有3種方法:
1.
class mt implements Runnable
{
public void run(){...}//run()由Runnable定義,就是你要執行的代碼
}
new Thread(new mt()).start();
2.
class mt extends Thread
{
public void run(){...}
}
...
new mt().start();
3.
class mt extends TimerTask
{
public void run(){...}
}
...
new Timer().schedule(new mt(),1000,200);//等待1秒鐘后每2毫秒執行一次
后兩種方法在本質上和第一種一樣,因為Thread 和 TimerTask 都implements Runnable
但顯然第一種方法最好,因為mt 還可以extends其他類
至于同步,只要在你要同步的方法前加synchronized,然后適當用一下wait() 和 notify()
33. JSP的內置對象及方法。
request request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,并且提供了幾個用于獲取cookie, header, 和session數據的有用的方法。
response response表示HttpServletResponse對象,并提供了幾個用于設置送回瀏覽器的響應的方法(如cookies,頭信息等)
out out 對象是javax.jsp.JspWriter的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結果。
pageContext pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于方便存取各種范圍的名字空間、servlet相關的對象的API,并且包裝了通用的servlet相關功能的方法。
session session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態信息
application applicaton 表示一個javax.servle.ServletContext對象。這有助于查找有關servlet引擎和servlet環境的信息
config config表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet實例的初始化參數。
page page表示從該頁面產生的一個servlet實例
34. 什么情況下調用doGet()和doPost()?
form的method為get時調用doGet()方法,
form的method為post時調用doPost()方法。
35. 頁面間對象傳遞的方法
page,request,session,application.
36. JSP和Servlet有哪些相同點和不同點,他們之間的聯系是什么?
JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯后是"類servlet"。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側重于視圖,Servlet主要用于控制邏輯。
37. Servlet執行時一般實現哪幾個方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()
38.關鍵字:throws, throw, try, catch, finally分別代表什么意義?
try、catch、throw、throws和finally。一般情況下是用try來執行一段程序,如果出現異常,系統會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最后(finally)由缺省處理器來處理。
用try來指定一塊預防所有"異常"的程序。緊跟在try程序后面,應包含一個catch子句來指定你想要捕捉的"異常"的類型。
throw語句用來明確地拋出一個"異常"。
throws用來標明一個成員函數可能拋出的各種"異常"。
Finally為確保一段代碼不管發生什么"異常"都被執行一段代碼。
39. 靜態變量和實例變量的區別?
如static i = 10; //常量 class A a; a.i =10;//可變
40. 什么是java序列化,如何實現java序列化?
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。
序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
41. 是否可以從一個static方法內部發出對非static方法的調用?
不可以,如果其中包含對象的method();不能保證對象初始化.
42. 寫clone()方法時,通常都有一行代碼,是什么?
Clone 有缺省行為,super.clone();他負責產生正確大小的空間,并逐位復制。
43. 如何跳出當前的多重嵌套循環?
用break,return方法。
44. List、Map、Set三個接口,存取元素時,各有什么特點?
List 以特定次序來持有元素,可有重復元素。Set 無法擁有重復元素,內部排序。Map 保存key-value值,value可多值。
第二部分:JAVA代碼走查,每道題5分
1.
abstract class Name {
private String name;
public abstract boolean isStupidName(String name) { }
}
請問這有何錯誤?
答案:
有錯誤,抽象方法不能有方法體
2.
public class Something {
void doSomething () {
private String s = "";
int l = s.length();
}
}
有錯嗎?
答案:
有錯誤,變量s為空不能在方法內定義為private類型。
3.
abstract class Something {
private abstract String doSomething ();
}
這好像沒什么錯吧?
答案:
有錯誤,abstract的修飾符不能是private類型。
4.
public class Something {
public int addOne(final int x) {
return ++x;
}
}
這個比較明顯。
答案:
有錯,x為final類型。不能進行運算。
5.
public class Something {
public static void main(String[] args) {
Other o = new Other();
new Something().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}
class Other {
public int i;
}
和上面的很相似,都是關于final的問題,這有錯嗎?
答案:
沒有錯誤。
6.
class Something {
int i;
public void doSomething() {
System.out.println("i = " + i);
}
}
有什么錯呢? 看不出來啊。
答案:
沒有錯誤。
7.
class Something {
final int i;
public void doSomething() {
System.out.println("i = " + i);
}
}
和上面一題只有一個地方不同,就是多了一個final。這難道就錯了嗎?
答案:
有錯誤,i沒有初始化。
8.
public class Something {
public static void main(String[] args) {
Something s = new Something();
System.out.println("s.doSomething() returns " + this.doSomething() );
}
public String doSomething() {
return "Do something ...";
}
}
看上去很完美。
答案: main是個靜態方法,不能引用this,靜態方法可以通過類直接調用 不用初始化對象。
9.
此處,Something類的文件名叫OtherThing.java
class Something {
private static void main(String[] something_to_do) {
System.out.println("Do something ...");
}
}
這個好像很明顯。
答案:
在java中類名必須和文件名相同。
10.
interface A{
int x = 0;
}
class B{
int x =1;
}
class C extends B implements A {
public void pX(){
System.out.println(x);
}
public static void main(String[] args) {
new C().pX();
}
}
答案:
程序有錯誤,C如果引用了父類的變量x,應使用關鍵字super,