Java就業面試題大全
有些題來自網上搜集整理,有些題來自我面試經常遇到的,抽空全部整理一下,希望對有需要者給予協助和解答,說真的,很多所謂的面試題,我真懷疑其是否還有存在價值!
1、一個".java"源檔案中是否可以包括多個類(不是內部類)?有什麼限制?
可以有多個類,但只能有一個public的類,並且public的類名必須與檔案名稱相一致。
2、Java有沒有goto?
java中的保留字,現在沒有在java中使用。
3、說說&和&&的區別?
&和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的運算式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。
&&還具有短路的功能,即如果第一個運算式為false,則不再計算第二個運算式,例如,對於if(str != null && !str.equals(“”))運算式,當str為null時,後面的運算式不會執行,
所以不會出現NullPointerException如果將&&改為&,則會拋出NullPointerException異常。If(x==33 & ++y>0) y會增長,If(x==33 && ++y>0)不會增長
&還可以用作位元運算符,當&操作符兩邊的運算式不是boolean類型時,&表示按位與操作,我們通常使用0x0f來與一個整數進行&運算,來擷取該整數的最低4個bit位,
例如,0x31 & 0x0f的結果為0x01。備忘:這道題先說兩者的共同點,再說出&&和&的特殊之處,並列舉一些經典的例子來表明自己理解透徹深入、實際經驗豐富。
4、在JAVA中如何跳出當前的多重嵌套迴圈?
在Java中,要想跳出多重迴圈,可以在外面的迴圈語句前定義一個標號,然後在裡層迴圈體的代碼中使用帶有標號的break語句,即可跳出外層迴圈。
5、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1隻能是一個整數運算式或者枚舉常量(更大字型),整數運算式可以是int基本類型或Integer封裝類型,由於
byte,short,char都可以隱含轉換為int,所以,這些類型以及這些類型的封裝類型也是可以的。顯然,long和String類型都不符合switch的文法規定,
並且不能被隱式轉換成int類 型,所以,它們不能作用於swtich語句中。
6、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
對於short s1 = 1; s1 = s1 + 1;由於s1+1運算時會自動提升運算式的類型,所以結果是int型,再賦值給short類型s1時,編譯器將報告需要強制轉換類型的錯誤。
對於short s1 = 1; s1 += 1;由於 +=是java語言規定的運算子,java編譯器會對它進行特殊處理,因此可以正確編譯。
7、char型變數中能不能存貯一個中文漢字?為什麼?
char型變數是用來儲存Unicode編碼的字元的,unicode編碼字元集中包含了漢字,所以,char型變數中當然可以儲存漢字啦。
不過,如果某個特殊的漢字沒有被包含在unicode編碼字元集中,那麼,這個char型變數中就不能儲存這個特殊漢字。
補充說明:unicode編碼佔用兩個位元組,所以,char類型的變數也是佔用兩個位元組。
備忘:後面一部分回答雖然不是在正面回答題目,但是,為了展現自己的學識和表現自己對問題理解的透徹深入,可以回答一些相關的知識,做到知無不言,言無不盡。
8、用最有效率的方法算出2乘以8等於幾?
2 << 3,
因為將一個數左移n位,就相當於乘以了2的n次方,那麼,一個數乘以8隻要將其左移3位即可,而位元運算cpu直接支援的,效率最高,
所以,2乘以8等於幾的最效率的方法是2 << 3。
9、請設計一個一百億的計算機
首先,電腦中用固定數量的幾個位元組來儲存的數值,所以電腦中能夠表示的數值是有一定的範圍的,為了便於講解和理解,我們先以byte類型的整數為例,
它用1個位元組進行儲存,表示的最大數值範圍為-128到+127。-1在記憶體中對應的位元據為11111111,如果兩個-1相加,不考慮Java運算時的型別提升,
運算後會產生進位,二進位結果為1,11111110,由於進位後超過了byte類型的儲存空間,所以進位部分被捨棄,即最終的結果為11111110,也就是-2,
這正好利用溢位的方式實現了負數的運算。-128在記憶體中對應的位元據為10000000,如果兩個-128相加,不考慮Java運算時的型別提升,運算後會產生進位,
二進位結果為1,00000000,由於進位後超過了byte類型的儲存空間,所以進位部分被捨棄,即最終的結果為00000000,也就是0,這樣的結果顯然不是我們期望的,
這說明電腦中的算術運算是會發生越界情況的,兩個數值的運算結果不能超過電腦中的該類型的數值範圍。由於Java中涉及運算式運算時的類型自動提升,
我們無法用byte類型來做示範這種問題和現象的實驗,大家可以用下面一個使用整數做實驗的例子程式體驗一下:
inta = Integer.MAX_VALUE;
intb = Integer.MAX_VALUE;
intsum = a + b;
System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);
10、使用final關鍵字修飾一個變數時,是引用不能變,還是引用的對象不能變?
使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的對象中的內容還是可以改變的。例如,對於如下語句:
finalStringBuffera=newStringBuffer("immutable");
執行如下語句將報告編譯期錯誤:a=newStringBuffer("");
但是,執行如下語句則可以通過編譯:a.append("broken!");
有人在定義方法的參數時,可能想採用如下形式來阻止方法內部修改傳進來的參數對象:
publicvoid method(final StringBuffer param)
{
}
實際上,這是辦不到的,在該方法內部仍然可以增加如下代碼來修改參數對象:param.append("a");
11、"=="和equals方法究竟有什麼區別?
==操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本類型的資料或兩個引用變數是否相等,
只能用==操作符。
equals方法是用於比較兩個獨立對象的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。
12、靜態變數和執行個體變數的區別?
在文法定義上的區別:靜態變數前要加static關鍵字,而執行個體變數前則不加。
在程式運行時的區別:執行個體變數屬於某個對象的屬性,必須建立了執行個體對象,其中的執行個體變數才會被分配空間,才能使用這個執行個體變數。靜態變數不屬於某個執行個體對象,
而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何執行個體對象,靜態變數就會被分配空間,靜態變數就可以被使用了。
總之,執行個體變數必須建立對象後才可以通過這個對象來使用,靜態變數則可以直接使用類名來引用。
13、是否可以從一個static方法內部發出對非static方法的調用?
不可以。因為非static方法是要與對象關聯在一起的,必須建立一個對象後,才可以在該對象上進行方法調用,而static方法調用時不需要建立對象,可以直接調用。
也就是說,當一個static方法被調用時,可能還沒有建立任何執行個體對象,如果從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪個對象上的呢?
這個邏輯無法成立,所以,一個static方法內部發出對非static方法的調用。
14、Integer與int的區別?
int是java提供的8種未經處理資料類型之一。Java為每個原始類型提供了封裝類,Integer是java為int提供的封裝類。int的預設值為0,而Integer的預設值為null,
即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況。
15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math類中提供了三個與取整有關的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應,
例如,ceil的英文意義是天花板,該方法就表示向上取整,所以,Math.ceil(11.3)的結果為12,Math.ceil(-11.3)的結果是-11;
floor的英文意義是地板,該方法就表示向下取整,所以,Math.floor(11.6)的結果為11,Math.floor(-11.6)的結果是-12;
最難掌握的是round方法,它表示“四捨五入”,演算法為Math.floor(x+0.5),
即將原來的數字加上0.5後再向下取整,所以,Math.round(11.5)的結果為12,Math.round(-11.5)的結果為-11。
16、請說出範圍public,private,protected,以及不寫時的區別?
這四個範圍的可見範圍如下表所示。說明:如果在修飾的元素上面沒有寫任何存取修飾詞,則表示friendly。
範圍 當前類同一package子孫類其他package
public√√√√
protected√√√×
friendly√√××
private√×××
備忘:只要記住了有4種存取權限,4個存取範圍,然後將全選和範圍在水平和垂直方向上分別按排從小到大或從大到小的順序排列,就很容易畫出上面的圖了。
17、Overload和Override的區別。Overloaded的方法是否可以改變傳回值的類型?
Overload是重載的意思,Override是覆蓋的意思,也就是重寫。
重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。
重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類建立的執行個體對象調用這個方法時,將調用子類中的定義方法,
這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是物件導向編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,
或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的存取權限只能比父類的更大,不能更小。
如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。
至於Overloaded的方法是否可以改變傳回值的類型這個問題,要看你倒底想問什麼呢?這個題目很模糊。如果幾個Overloaded的方法的參數列表不一樣,
它們的返回者類型當然也可以不一樣。
18、構造器Constructor是否可被override?
構造器Constructor不能被繼承,因此不能重寫Override,但可以被重載Overload。
19、介面是否可繼承介面? 抽象類別是否可實現(implements)介面? 抽象類別是否可繼承具體類(concrete class)? 抽象類別中是否可以有靜態main方法?
介面可以繼承介面。抽象類別可以實現(implements)介面,抽象類別是可以繼承實體類,但前提是實體類必須有明確的建構函式。抽象類別中可以有靜態main方法。
只有記住抽象類別與普通類的唯一區別就是不能建立執行個體對象和允許有abstract方法。
20、寫clone()方法時,通常都有一行代碼,是什麼?
clone 有預設行為,super.clone();因為首先要把父類中的成員複製到位,然後才是複製自己的成員。
21、java中實現多態的機制是什麼?
靠的是父類或介面定義的引用變數可以指向子類或具體實作類別的執行個體對象,而程式調用的方法在運行期才動態綁定,就是引用變數所指向的具體執行個體對象的方法,
也就是記憶體裡正在啟動並執行那個對象的方法,而不是引用變數的類型中定義的方法。
22、abstract class和interface有什麼區別?
含有abstract修飾符的class即為抽象類別,abstract類不能建立的執行個體對象。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。
abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類中的所有抽象方法,
那麼子類也必須定義為abstract類型。
介面(interface)可以說成是抽象類別的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為public abstract類型,
介面中的成員變數類型預設為public static final。
下面比較一下兩者的文法區別:
1.抽象類別可以有構造方法,介面中不能有構造方法。
2.抽象類別中可以有普通成員變數,介面中沒有普通成員變數
3.抽象類別中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類別中的抽象方法的訪問類型可以是public,protected和(預設類型,雖然eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public類型的,
並且預設即為public abstract類型。
5. 抽象類別中可以包含靜態方法,介面中不能包含靜態方法
6. 抽象類別和介面中都可以包含靜態成員變數,抽象類別中的靜態成員變數的訪問類型可以任意,但介面中定義的變數只能是public static final類型,
並且預設即為public static final類型。
7. 一個類可以實現多個介面,但只能繼承一個抽象類別。
23、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?
abstract的method不可以是static的,因為抽象的方法是要被子類實現的,而static與子類扯不上關係!
native方法表示該方法要用另外一種依賴平台的程式設計語言實現的,不存在著被子類實現的問題,所以,它也不能是抽象的,不能與abstract混用。
關於synchronized與abstract合用的問題,我覺得也不行,因為在我幾年的學習和開發中,從來沒見到過這種情況,並且我覺得synchronized應該是作用在一個
具體的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上無法確定this是什麼。
24、什麼是內部類?StaticNested Class 和 Inner Class的不同。
內部類就是在一個類的內部定義的類,內部類中不能定義靜態成員(靜態成員不是對象的特性,只是為了找一個容身之處,所以需要放到一個類中而已,
這麼一點小事,你還要把它放到類內部的一個類中,過分了啊!提供內部類,不是為讓你幹這種事情,無聊,不讓你幹。
我想可能是既然靜態成員類似c語言的全域變數,而內部類通常是用於建立內部對象用的,所以,把“全域變數”放在內部類中就是毫無意義的事情,
既然是毫無意義的事情,就應該被禁止),內部類可以直接存取外部類中的成員變數,內部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中。
25、內部類可以引用它的包含類的成員嗎?有沒有什麼限制?
完全可以。如果不是靜態內部類,那沒有什麼限制!
26、Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?
可以繼承其他類或實現其他介面。不僅是可以,而是必須!
27、jdk中哪些類是不能繼承的?
不能繼承的是類是那些用final關鍵字修飾的類。一般比較基本的類型或防止擴充類無意間破壞原來方法的實現的類型都應該是final的,
在jdk中System,String,StringBuffer等都是基本類型。
28、String是最基本的資料類型嗎?
基礎資料型別 (Elementary Data Type)包括byte、int、char、long、float、double、boolean和short。
java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間的,我們應該用StringBuffer類
29、Strings="Hello";s=s+"world!";這兩行代碼執行後,原始的String對象中的內容到底變了沒有?
沒有。因為String被設計成不可變(immutable)類,所以它的所有對象都是不可變對象。
30、是否可以繼承String類?
String類是final類故不可以繼承。
31、String s = new String("xyz");建立了幾個String Object? 二者之間有什麼區別?
兩個,”xyz”對應一個對象,這個對象放在字串常數緩衝區,常量”xyz”不管出現多少遍,都是緩衝區中的那一個。New String每寫一遍,就建立一個新的對象,
它一句那個常量”xyz”對象的內容來建立出一個新String對象。如果以前就用過’xyz’,這句代表就不會建立”xyz”自己了,直接從緩衝區拿。
32、String 和StringBuffer的區別?
JAVA平台提供了兩個類:String和StringBuffer,它們可以儲存和操作字串,即包含多個字元的字元資料。String類表示內容不可改變的字串。
而StringBuffer類表示內容可以被修改的字串。當你知道字元資料要改變的時候你就可以使用StringBuffer
33、StringBuffer與StringBuilder的區別
StringBuffer和StringBuilder類都表示內容可以被修改的字串,StringBuilder是線程不安全的,運行效率高,如果一個字串變數是在方法裡面定義,
這種情況只可能有一個線程訪問它,不存在不安全的因素了,則用StringBuilder。如果要在類裡面定義成員變數,並且這個類的執行個體對象會在多線程環境下使用,
那麼最好用StringBuffer。
34、如何把一段逗號分割的字串轉換成一個數組?
如果不查jdk api,我很難寫出來!我可以說說我的思路:
用Regex,代碼大概為:String [] result = orgStr.split(“,”);
用StingTokenizer ,代碼為:StringTokenizertokener = StringTokenizer(orgStr,”,”);
String [] result = newString[tokener .countTokens()];
Int i=0;
while(tokener.hasNext(){result[i++]=toker.nextToken();}
35、數組有沒有length()這個方法? String有沒有length()這個方法?
資料沒有length()這個方法,有length這個屬性,String有length()這個方法。
36、try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?
會執行,return之前執行。
37、final, finally, finalize的區別?
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,
例如關閉檔案等。JVM不保證此方法總被調用
38、運行時異常與一般異常有何異同?
異常表示程式運行過程中可能出現的非正常狀態,運行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見運行錯誤。
java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。
39、error和exception有什麼區別?
error 表示恢複不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢出。不可能指望程式能處理這樣的情況。
exception 表示一種設計或實現問題。也就是說,它表示如果程式運行正常,從不會發生的情況。
40、請寫出你最常見到的5個runtime exception。
這道題主要考你的代碼量到底多大,如果你長期寫代碼的,應該經常都看到過一些系統方面的異常,你不一定真要回答出5個具體的系統異常,
但你要能夠說出什麼是系統異常,以及幾個系統異常就可以了,當然,這些異常完全用其英文名稱來寫是最好的,如果實在寫不出,那就用中文吧,有總比沒有強!
所謂系統異常,就是…..,它們都是RuntimeException的子類,在jdk doc中查RuntimeException類,就可以看到其所有的子類列表,也就是看到了所有的系統異常。
我比較有印象的系統異常有:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。
41、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以拋出異常嗎?
throws捕獲並向外拋出異常
throw拋出異常
try catch是內部捕獲異常並做自訂處理
finally是無論是否有異常都會被處理的語句,除非在finally前存在被執行的System.exit(int i)時除外
42、java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?
兩種實現方法,分別是繼承Thread類與實現Runnable介面
synchronized關鍵字修飾同步方法
反對使用stop(),是因為它不安全。suspend()方法容易發生死結。
43、sleep() 和 wait() 有什麼區別?
sleep()是讓線程指定休眠時間,然後繼續工作,
wait()是等待,直到有線程通知notify()喚醒他才會重新工作。
44、同步和非同步有何異同,在什麼情況下分別使用他們?舉例說明?
如果資料將線上程間共用。例如正在寫的資料以後可能被另一個線程讀到,或者正在讀的資料可能已經被另一個線程寫過了,那麼這些資料就是共用資料,
必須進行同步存取。當應用程式在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程式等待方法的返回時,就應該使用非同步編程,
在很多情況下採用非同步途徑往往更有效率。
45、啟動一個線程是用run()還是start()?
啟動一個線程是調用start()方法,使線程就緒狀態,以後可以被調度為運行狀態,一個線程必須關聯一些具體的執行代碼,run()方法是該線程所關聯的執行代碼。
46、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?
分幾種情況: 1.其他方法前是否加了synchronized關鍵字,如果沒加,則能。
2.如果這個方法內部調用了wait,則可以進入其他synchronized方法。
3.如果其他個方法都加了synchronized關鍵字,並且內部沒有調用wait,則不能。
4.如果其他方法是static,它用的同步鎖是當前類的位元組碼,與非靜態方法不能同步,因為非靜態方法用的是this。
47、簡述synchronized和java.util.concurrent.locks.Lock的異同 ?
主要相同點:Lock能完成synchronized所實現的所有功能
主要不同點:Lock有比synchronized更精確的線程語義和更好的效能。synchronized會自動釋放鎖,而Lock一定要求程式員手工釋放,並且必須在finally從句中釋放。
Lock還有更強大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。
48、ArrayList和Vector的區別?
(1)同步性: Vector是安全執行緒的,也就是說是它的方法之間是線程同步的,而ArrayList是線程式不安全的,它的方法之間是線程不同步的。
(2)資料增長:即Vector增長原來的一倍,ArrayList增加原來的0.5倍。
49、HashMap和Hashtable的區別?
就HashMap與HashTable主要從三方面來說:
(1)、曆史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現;
(2)、同步性:Hashtable是安全執行緒的,也就是說是同步的,而HashMap是線程式不安全的,不是同步的;
(3)、值:只有HashMap可以讓你將空值作為一個表的條目的key或valu。
50、List 和 Map 區別?
一個是儲存單列資料的集合,另一個是儲存鍵和值這樣的雙列資料的集合,List中儲存的資料是有順序,並且允許重複;
Map中儲存的資料是沒有順序的,其鍵是不能重複的,它的值是可以有重複的。
51、List, Set, Map是否繼承自Collection介面?
List、Set是,Map不是。
52、List、Map、Set三個介面,存取元素時,各有什麼特點?
List與Set具有相似性,它們都是單列元素的集合,所以,它們有一個功共同的父介面,叫Collection。Set裡面不允許有重複的元素,所謂重複,即不能有兩個相等。
List 以特定次序來持有元素,可有重複元素。Set 無法擁有重複元素,內部排序。Map 儲存key-value值,value可多值。
53、說出ArrayList,Vector,LinkedList的儲存效能和特性?
ArrayList和Vector都是使用數組方式儲存資料,此數組元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,
但是插入元素要涉及數組元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector由於使用了synchronized方法(安全執行緒),通常效能上較ArrayList差,
而LinkedList使用雙向鏈表實現儲存,按序號索引資料需要進行前向或後向遍曆,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。
LinkedList也是線程不安全的,LinkedList提供了一些方法,使得LinkedList可以被當作堆棧和隊列來使用。
54、Collection 和 Collections的區別?
Collection是集合類的上級介面,繼承與他的介面主要有Set 和List.
Collections是針對集合類的一個協助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、安全執行緒化等操作。
55、Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?
Set裡的元素是不能重複的,元素重複與否是使用equals()方法進行判斷的。
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。
56、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
不對,他們hash code必須相同。
57、說出一些常用的類,包,介面,請各舉5個 ?
常用的類:BufferedReader,BufferedWriter,FileReader,FileWirter,String Integer,java.util.Date,System,Class,List,HashMap
常用的包:java.lang,java.io,java.util,java.sql,javax.servlet,org.apache.strtuts.action,org.hibernate
常用的介面:Remote,List,Map,Document,NodeList,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession
58、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類別以供繼承,請說出他們分別是哪些類?
位元組流,字元流。位元組流繼承於InputStreamOutputStream,字元流繼承於InputStreamReaderOutputStreamWriter。
在java.io包中還有許多其他的流,主要是為了提高效能和使用方便。
59、什麼是java序列化,如何?java序列化?或者請解釋Serializable介面的作用?
我們有時候將一個java對象變成位元組流的形式傳出去或者從一個位元組流中恢複成一個java對象,例如,要將javaObject Storage Service到硬碟或者傳送給網路上的其他電腦,
這個過程我們可以自己寫代碼去把一個java對象變成某個格式的位元組流再傳輸,但是,jre本身就提供了這種支援,我們可以調用OutputStream的writeObject方法來做,
如果要讓java 幫我們做,要被傳輸的對象必須實現serializable介面,這樣,javac編譯時間就會進行特殊處理,編譯的類才可以被writeObject方法操作,
這就是所謂的序列化。需要被序列化的類必須實現Serializable介面,該介面是一個mini介面,其中沒有需要實現的方法,
implements Serializable只是為了標註該對象是可被序列化的。
60、描述一下JVM載入class檔案的原理機制?
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時尋找和裝入類檔案的類。
61、heap和stack有什麼區別?
java的記憶體分為兩類,一類是棧記憶體,一類是堆記憶體。棧記憶體是指程式進入一個方法時,會為這個方法單獨分配一塊私屬儲存空間,用於儲存這個方法內部的局部變數,
當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變數也將隨之釋放。堆是與棧作用不同的記憶體,一般用於存放不放在當前方法棧中的那些資料,
例如,使用new建立的對象都放在堆裡,所以,它不會隨方法的結束而消失。方法中的局部變數使用final修飾後,放在堆中,而不是棧中。
62、GC是什麼? 為什麼要有GC?
GC是垃圾收集的意思(Gabage Collection),記憶體處理是編程人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,
Java提供的GC功能可以自動監測對象是否超過範圍從而達到自動回收記憶體的目的,Java語言沒有提供釋放已指派記憶體的顯示操作方法。
63、什麼時候用assert?
assertion(斷言)在軟體開發中是一種常用的調試方式,很多開發語言中都支援這種機制。在實現中,assertion就是在程式中的一條語句,
它對一個boolean運算式進行檢查,一個正確程式必須保證這個boolean運算式的值為true;如果該值為false,說明程式已經處於不正確的狀態下,
assert將給出警告或退出。一般來說,assertion用於保證程式最基本、關鍵的正確性。assertion檢查通常在開發與測試時開啟。為了提高效能,
在軟體發布後,assertion檢查通常是關閉的。
64、Tomcat的最佳化經驗?
去掉對web.xml的監視,把jsp提前編輯成Servlet。有富餘實體記憶體的情況,加大tomcat使用的jvm的記憶體
65、HTTP請求的GET與POST方式的區別?
post傳遞資料量較大,較安全,用request.form("")取值。
get傳遞資料量較小,沒有post安全性強,用request.querystring("取值") 。
66、解釋一下什麼是servlet?
servlet有良好的生存期的定義,包括載入和執行個體化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet介面的init,service和destroy方法表達
67、說一說Servlet的生命週期?
Servlet被伺服器執行個體化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,
當伺服器決定將執行個體銷毀的時候調用其destroy方法。
web容器載入servlet,生命週期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。
結束服務,web容器調用servlet的destroy()方法。
68、forward() 與redirect()的區別?
forward是伺服器請求資源,伺服器直接存取目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,
瀏覽器根本不知道伺服器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。
redirect就是服務端根據邏輯,發送一個狀態代碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數重新請求,
所以session,request參數都可以擷取。
69、什麼情況下調用doGet()和doPost()?
Jsp頁面中的FORM標籤裡的method屬性為get時調用doGet(),為post時調用doPost()。
70、jsp有哪些內建對象?作用分別是什麼? 分別有什麼方法?
JSP共有以下9個內建的對象:
request 使用者端請求,此請求會包含來自GET/POST請求的參數
response 網頁傳回使用者端的回應
pageContext 網頁的屬性是在這裡管理
session 與請求有關的會話期
application servlet 正在執行的內容
out 用來傳送回應的輸出
config servlet的構架組件
page JSP網頁本身
exception 針對錯誤網頁,未捕捉的例外
71、jsp有哪些動作?作用分別是什麼?
JSP共有以下6種基本動作
jsp:include:在頁面被請求的時候引入一個檔案。
jsp:useBean:尋找或者執行個體化一個JavaBean。
jsp:setProperty:設定JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉到一個新的頁面。
jsp:plugin:根據瀏覽器類型為Java外掛程式產生OBJECT或EMBED標記
72、JSP中動態INCLUDE與靜態INCLUDE的區別?
動態INCLUDE用jsp:include動作實現
它總是會檢查所含檔案中的變化,適合用於包含動態網頁面,並且可以帶參數靜態INCLUDE用include偽碼實現,定
不會檢查所含檔案的變化,適用於包含靜態頁面
<%@ file="included.htm" include="">