- 相關推薦
Java軟件工程師綜合面試題
1.重寫和重載的區(qū)別:
方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調(diào)用子類中的定義,對它而言,父類中的定義如同被”屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
2.代碼查錯:
a)注意考慮,聲明在接口中的對象是靜態(tài)常量,不允許被修改。所以如果在繼承接口的子類中,修改了引用,則會報錯
b)在一個類中,文件名可以與類名不一樣,但是這個類必須是非public的.
3.面象對象三大特征。
1.抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節(jié)。抽象包括兩個方面,一是過程抽象,二是數(shù)據(jù)抽象。
2.繼承:繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現(xiàn)有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。
3.封裝:封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面。面向?qū)ο笥嬎闶加谶@個基本概念,即現(xiàn)實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。
4.多態(tài)性:多態(tài)性是指允許不同類的對象對同一消息作出響應。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,很好的解決了應用程序函數(shù)同名問題。
4.hashMap和hashtable的區(qū)別:
HashMap是Hashtable的輕量級實現(xiàn)(非線程安全的實現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable。
HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現(xiàn)。(繼承自AbstractMap類).
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現(xiàn)同步,而HashMap 就必須為之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。
5.啟動線程用什么方法?
start();
6.畫出模版模式圖
7.寫一段jdbc查詢代碼:
private Connection con = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
public void getQuery(){
try{
Class.forName(“com.jdbc.mysql.Driver”);
con = (Connection) DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”,“root”,“root”);
pstmt = (PreparedStatement) con.prepareStatement(“select * form tabName”);
rs = (ResultSet) pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getObject(1));
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (rs != null) {rs.close();}
if (pstmt != null) {pstmt.close();}
if(con != null){if (!con.isClosed()) {con.close();}con = null;}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
8.索引的優(yōu)缺點:
這是因為,創(chuàng)建索引可以大大提高系統(tǒng)的性能。
第一,通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
第二,可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
第四,在使用分組和排序子句進行數(shù)據(jù)檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
二、建立方向索引的不利因素(缺點)
也許會有人要問:增加索引有如此多的優(yōu)點,為什么不對表中的每一個列創(chuàng)建一個索引呢?這種想法固然有其合理性,然而也有其片面性。雖然,索引有許多優(yōu)點,但是,為表中的每一個列都增加索引,是非常不明智的。這是因為,增加索引也有許多不利的一個方面。
第一,創(chuàng)建索引和維護索引要耗費時間,這種時間隨著數(shù)據(jù)量的增加而增加。
第二,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
第三,當對表中的數(shù)據(jù)進行增加、刪除和修改的時候,索引也要動態(tài)的維護,這樣就降低了數(shù)據(jù)的維護速度。
三、創(chuàng)建方向索引的準則
索引是建立在數(shù)據(jù)庫表中的某些列的上面。因此,在創(chuàng)建索引的時候,應該仔細考慮在哪些列上可以創(chuàng)建索引,在哪些列上不能創(chuàng)建索引。
一般來說,應該在這些列上創(chuàng)建索引。
第一,在經(jīng)常需要搜索的列上,可以加快搜索的速度;
第二,在作為主鍵的列上,強制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構;
第三,在經(jīng)常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;
第四,在經(jīng)常需要根據(jù)范圍進行搜索的列上創(chuàng)建索引,因為索引已經(jīng)排序,其指定的范圍是連續(xù)的;
第五,在經(jīng)常需要排序的列上創(chuàng)建索引,因為索引已經(jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
第六,在經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度。
同樣,對于有些列不應該創(chuàng)建索引。一般來說,不應該創(chuàng)建索引的的這些列具有下列特點:
第一,對于那些在查詢中很少使用或者參考的列不應該創(chuàng)建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統(tǒng)的維護速度和增大了空間需求。
第二,對于那些只有很少數(shù)據(jù)值的列也不應該增加索引。這是因為,由于這些列的取值很少,例如人事表的性別列,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大。增加索引,并不能明顯加快檢索速度。
第三,對于那些定義為text, image和bit數(shù)據(jù)類型的列不應該增加索引。這是因為,這些列的數(shù)據(jù)量要么相當大,要么取值很少。
第四,當修改性能遠遠大于檢索性能時,不應該創(chuàng)建索引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改性能遠遠大于檢索性能時,不應該創(chuàng)建索引。
四、創(chuàng)建索引的方法
創(chuàng)建索引有多種方法,這些方法包括直接創(chuàng)建索引的方法和間接創(chuàng)建索引的方法。
第一,直接創(chuàng)建索引,例如使用CREATE INDEX語句或者使用創(chuàng)建索引向?qū)А?/p>
第二,間接創(chuàng)建索引,例如在表中定義主鍵約束或者唯一性鍵約束時,同時也創(chuàng)建了索引。
9.truncate和delete,drop的區(qū)別:
不同點:
1.truncate和 delete只刪除數(shù)據(jù)不刪除表的結(jié)構(定義)
drop語句將刪除表的結(jié)構被依賴的約束(constrain),觸發(fā)器(trigger),索引(index); 依賴于該表的存儲過程/函數(shù)將保留,但是變?yōu)閕nvalid狀態(tài).
2.delete語句是dml,這個操作會放到rollback segement中,事務提交之后才生效;如果有相應的trigger,執(zhí)行的時候?qū)⒈挥|發(fā).
truncate,drop是ddl, 操作立即生效,原數(shù)據(jù)不放到rollback segment中,不能回滾. 操作不觸發(fā)trigger.
3.delete語句不影響表所占用的extent, 高水線(high watermark)保持原位置不動
顯然drop語句將表所占用的空間全部釋放
truncate 語句缺省情況下見空間釋放到 minextents個 extent,除非使用reuse storage; truncate會將高水線復位(回到最開始).
4.速度,一般來說: drop>; truncate >; delete
5.安全性:小心使用drop 和truncate,尤其沒有備份的時候.否則哭都來不及
使用上,想刪除部分數(shù)據(jù)行用delete,注意帶上where子句. 回滾段要足夠大.
想刪除表,當然用drop
想保留表而將所有數(shù)據(jù)刪除. 如果和事務無關,用truncate即可. 如果和事務有關,或者想觸發(fā)trigger,還是用delete.
如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導入/插入數(shù)據(jù)
【Java軟件工程師綜合面試題】相關文章:
java面試題及答案10-03
軟件測試面試題07-18
軟件測試面試題06-27
軟件測試的面試題04-20
外企軟件測試面試題08-23
iPhone軟件開發(fā)面試題10-23
Android工程師的面試題08-07
Android工程師面試題10-24
前端工程師面試題10-20