面試題5

ZHOU_VIP發表於2017-03-13

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則無法表達出未賦值的情況,例如,要想表達出沒有參
加考試和考試成績為0的區別,則只能使用Integer。在JSP開發中,Integer的預設為null
,所以用el表示式在文字框中顯示時,值為空白字串,而int預設的預設值為0,所以用
el表示式在文字框中顯示時,結果為0,所以,int不適合作為web層的表單資料的型別。
-------------------------------------------------------------------------------
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。
-------------------------------------------------------------------------------
8、abstract class和interface有什麼區別?
含有abstract修飾符的class即為抽象類,抽象類不能建立的例項物件。
含有abstract方法的類必須定義為abstract class,
abstract class類中的方法不必是抽象的。
abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,
所以,不能有抽象構造方法或抽象靜態方法。
如果的子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義為abstract型別。
介面(interface)可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的
。介面中的方法定義預設為public abstract型別,
介面中的成員變數型別預設為publicstatic final。
下面比較一下兩者的語法區別:
1.抽象類可以有構造方法,介面中不能有構造方法。
2.抽象類中可以有普通成員變數,介面中沒有普通成員變數
3.抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有
非抽象的普通方法。
4. 抽象類中的抽象方法的訪問型別可以是public,protected和(預設型別,雖然
eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public型別的,並且
預設即為public abstract型別。
5. 抽象類中可以包含靜態方法,介面中不能包含靜態方法
6.抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的訪問型別可以
任意,但介面中定義的變數只能是public static final型別,並且預設即為public
static final型別。
7. 一個類可以實現多個介面,但只能繼承一個抽象類。
-------------------------------------------------------------------------------
14. jdk中哪些類是不能繼承的?
不能繼承的是類是那些用final關鍵字修飾的類。一般比較基本的型別或防止擴充套件類無
意間破壞原來方法的實現的型別都應該是final的,在jdk中System,String,StringBuffer
等都是基本型別。
-------------------------------------------------------------------------------
11、String s = "Hello";s = s + " world!";這兩行程式碼執行
後,原始的String物件中的內容到底變了沒有?
沒有。因為String被設計成不可變(immutable)類,所以它的所有物件都是不可變對
象。在這段程式碼中,s原先指向一個String物件,內容是
"Hello",然後我們對s進行了+操作,那麼s所指向的那個物件是否發生了改變呢?
答案是沒有。這時,s不指向原來那個物件了,而指向了另一個
String物件,內容為"Hello world!",原來那個物件還存在於記憶體之中,只是s這個
引用變數不再指向它了。
-------------------------------------------------------------------------------
5、String 和StringBuffer的區別
JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字串,即包含
多個字元的字元資料。String類表示內容不可改變的字串。而StringBuffer類表示內容可
以被修改的字串。當你知道字元資料要改變的時候你就可以使用StringBuffer。典型地,
你可以使用StringBuffers來動態構造字元資料。
-------------------------------------------------------------------------------
8.StringBuffer與StringBuilder的區別
StringBuffer和StringBuilder類都表示內容可以被修改的字串,StringBuilder是執行緒
不安全的,執行效率高,如果一個字串變數是在方法裡面定義,這種情況只可能有一個
執行緒訪問它,不存在不安全的因素了,則用StringBuilder。如果要在類裡面定義成員變數
,並且這個類的例項物件會在多執行緒環境下使用,那麼最好用StringBuffer。
-------------------------------------------------------------------------------
38、陣列有沒有length()這個方法?String有沒有length()這個方法?
陣列沒有length()這個方法,有length的屬性。String有有length()這個方法。
-------------------------------------------------------------------------------
43、try{}裡有一個return語句,那麼緊跟在這個try後的finally{}裡的code會不會被執行,
什麼時候被執行,在return前還是後?
try中的return語句呼叫的函式先於finally中呼叫的函式執行,
也就是說return語句先執行,finally語句後執行
-------------------------------------------------------------------------------
12、final, finally, finalize的區別。
final
用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
內部類要訪問區域性變數,區域性變數必須定義成final型別,例如,一段程式碼……
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,
可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。JVM不保證此
方法總被呼叫
-------------------------------------------------------------------------------
33、請寫出你最常見到的5個runtime exception。
陣列指令碼越界(ArrayIndexOutOfBoundsException)
空指標異常(NullPointerException)
類轉換異常(ClassCastException)
-------------------------------------------------------------------------------
56、多執行緒有幾種實現方法?同步有幾種實現方法?
多執行緒有兩種實現方法,分別是繼承Thread類與實現Runnable介面
同步的實現方面有兩種,分別是synchronized,wait與notify
wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock。
sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉I
nterruptedException異常。
notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切
的喚醒某一個等待狀態的執行緒,而是由JVM確定喚醒哪個執行緒,而且不是按優先順序。
Allnotity():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的
鎖,而是讓它們競爭。
-------------------------------------------------------------------------------
30、啟動一個執行緒是用run()還是start()? .
啟動一個執行緒是呼叫start()方法,使執行緒就緒狀態,以後可以被排程為執行狀態,一
個執行緒必須關聯一些具體的執行程式碼,run()方法是該執行緒所關聯的執行程式碼。
-------------------------------------------------------------------------------
47、當一個執行緒進入一個物件的一個synchronized方法後,
其它執行緒是否可進入此物件的其它方法?
分幾種情況:
1.其他方法前是否加了synchronized關鍵字,如果沒加,則能。
2.如果這個方法內部呼叫了wait,則可以進入其他synchronized方法。
3.如果其他個方法都加了synchronized關鍵字,並且內部沒有呼叫wait,則不能。
4.如果其他方法是static,它用的同步鎖是當前類的位元組碼,與非靜態的方法不
能同步,因為非靜態的方法用的是this。
-------------------------------------------------------------------------------
4、HashMap和Hashtable的區別
就HashMap與HashTable主要從三方面來說。
一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java
1.2引進的Map介面的一個實現
二.同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒不安全的,不
是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value
-------------------------------------------------------------------------------
5、List 和 Map 區別?
一個是儲存單列資料的集合,另一個是儲存鍵和值這樣的雙列資料的集合,List中儲存的
資料是有順序,並且允許重複;Map中儲存的資料是沒有順序的,其鍵是不能重複的,它
的值是可以有重複的。
-------------------------------------------------------------------------------
7、說出ArrayList,Vector, LinkedList的儲存效能和特性
ArrayList和Vector都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增
加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等內
存操作,所以索引資料快而插入資料慢,Vector由於使用了synchronized方法(執行緒安全
),通常效能上較ArrayList差,而LinkedList使用雙向連結串列實現儲存,按序號索引資料需
要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較
快。
LinkedList也是執行緒不安全的,LinkedList提供了一些方法,使得LinkedList可以被當作
堆疊和佇列來使用。
-------------------------------------------------------------------------------
9、Collection 和 Collections的區別。
Collection是集合類的上級介面,繼承與他的介面主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、
排序、執行緒安全化等操作。
-------------------------------------------------------------------------------
39、Set裡的元素是不能重複的,那麼用什麼方法來區分重
復與否呢? 是用==還是equals()? 它們有何區別?
Set裡的元素是不能重複的,元素重複與否是使用equals()方法進行判斷的。
equals()和==方法決定引用值是否指向同一物件equals()在類中被覆蓋,為的是當兩個分
離的物件的內容和型別相配的話,返回真值。
-------------------------------------------------------------------------------
45、兩個物件值相同(x.equals(y) ==
true),但卻可有不同的hash code,這句話對不對?
對。
如果物件要儲存在HashSet或HashMap中,它們的equals相等,那麼,它們的hashcode值就
必須相等。
如果不是要儲存在HashSet或HashMap,則與hashcode沒有什麼關係了,這時候hashcode不
等是可以的,例如arrayList儲存的物件就不用實現hashcode,當然,我們沒有理由不實現
,通常都會去實現的。
-------------------------------------------------------------------------------
100、java中有幾種型別的流?JDK為每種型別的流提供了
一些抽象類以供繼承,請說出他們分別是哪些類?
位元組流,字元流。位元組流繼承於InputStream
OutputStream,字元流繼承於InputStreamReader
OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高效能和使用方
便。
-------------------------------------------------------------------------------
105、什麼是java序列化,如何實現java序列化?或者請解
釋Serializable介面的作用。
我們有時候將一個java物件變成位元組流的形式傳出去或者從一個位元組流中恢復成一個ja
va物件,例如,要將java物件儲存到硬碟或者傳送給網路上的其他計算機,這個過程我
們可以自己寫程式碼去把一個java物件變成某個格式的位元組流再傳輸,但是,jre本身就提
供了這種支援,我們可以呼叫OutputStream的writeObject方法來做,如果要讓java
幫我們做,要被傳輸的物件必須實現serializable介面,這樣,javac編譯時就會進行特殊
處理,編譯的類才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的
類必須實現Serializable介面,該介面是一個mini介面,其中沒有需要實現的方法,
implements Serializable只是為了標註該物件是可被序列化的。
例如,在web開發中,如果物件被儲存在了Session中,tomcat在重啟時要把Session物件
序列化到硬碟,這個物件就必須實現Serializable介面。如果物件要經過分散式系統進行
網路傳輸或通過rmi等遠端呼叫,這就需要在網路上傳輸物件,被傳輸的物件就必須實
現Serializable介面。


相關文章