1. 程式人生 > >JAVA面試 之 簡答題

JAVA面試 之 簡答題

(一)override與overload有何異同?

Override(重寫):是指子類重新定義了父類同名的方法,方法重寫也叫方法覆蓋。
Overload(過載):是在一個類中,多個方法具有相同的方法名稱,但卻具有不同的引數列表。
相同點:
	它們存在的形式都是方法名相同。
不同點:
	1)重寫是要求子類重新定義的方法與父類的方法名稱相同、引數列表相同、返回值型別相同、訪問修飾符許可權要大於等於、丟擲的異常型別要小於等於父類的。
	2)過載是在一個類中有兩個或兩個以上的方法名稱相同、引數列表(引數個數、引數型、引數順序) 不相同,與引數名稱、返回值型別、訪問修飾符許可權、丟擲的異常類無關。 

(二)抽象類與介面有什麼區別?

相同點:
	兩者都不能例項化、都可以包含抽象方法。
不同點:
	1)子類只能繼承一個直接抽象類、子類可以實現多個介面。
	2)抽象類中可以有例項成員(例項變數、例項方法)、靜態成員(靜態變數、靜態方法)、抽象方法、內部類。抽象類中的成員方法不能用default關鍵字修符。
	介面中只能有常量、抽象方法、內部類、jdk8.0新增特性後,介面中可以有實現體的靜態方法以及用default關鍵字修飾符的實現體方法。
	3)介面中成員的訪問修飾符許可權必須都是public,抽象類中沒有此要求。
	4)抽象類中可以定義構造方法,介面沒有構造方法。
	5)抽象類的最高父類是Object,介面沒有最高父類。

(三)類變數和例項變數有何區別?

相同點:
	都是類內的成員變數。
不同點:
	1)類變數也叫做靜態變數,屬於類的成員,可以直接用類名去呼叫,也可以用物件名去呼叫。例項變數屬於類建立的例項物件,可以用例項名去呼叫。
	2)它們初始的時機不同,類變數在類名出現的第一次就被初始化。例項變數是在建立例項時進行初始化,隨著例項物件的銷燬而釋放記憶體。
	3)類變數是所有的例項物件共享一個類變數資料,例項變數只屬於建立它的這個例項物件。

(四)ArrayList,Vector, LinkedList的區別?

相同點:
	它們都是List介面的實現子類,它們都可以用下標索引去獲得元素。
不同點:
	1)ArrayList、Vector都是線性表,它們本質還是陣列。
	2)ArrayList是非執行緒安全,Vector是執行緒安全。查詢資料效率高,速度快。新增、刪除資料效率低,速度慢。
	3)LinkedList是鏈性表。元素儲存空間地址不連續。查詢資料效率低,速度慢。新增、刪除資料效率高,速度快。

(五)HashMap和Hashtable的區別?

相同點:
	它們都是Map介面實現子類,它們儲存方式都是以鍵值對的形式儲存。
不同點:
	1)HashMap是非執行緒安全,Hashtable是執行緒安全。所以HashMap比Hashtable的效能更高。
	2)HashMap它的鍵或value可以用null,Hashtable它的鍵和值不可以為null。
	3)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。 
	4)Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
	5)最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個執行緒訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。

(六)sleep()和wait()的區別?

1)sleep()的父類為Thread;wait的父類為Object。
2)sleep()休眠一段時間會自動的醒來而wait()需要notify()或者notifyAll()才會醒來。
3)sleep()休眠時不會放棄鑰匙;wait()會放棄鑰匙。
4)sleep()在鎖池;wait()在等待池。

(七)Lock和synchronized的異同?

相同點:
	都可以使多個執行緒實現同步,Lock能完成synchronized所實現的所有功能。
不同點:
	1)lock是介面,而synchronized是關鍵字
	2)Lock有比synchronized更精確的執行緒語義和更好的效能。
	synchronized如果出現異常就會扔掉鎖(釋放鎖);lock在出現異常時不會不會釋放鎖只有手動在finally裡用unlock釋放鎖
	3)lock讓執行緒中斷去幹別的事,而synchronized不可以
	4)lock可以知道有沒有成功獲取鎖,而synchronized無法辦到

(八)執行緒與程序的區別?

程序:
	每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換會有較大的開銷,一個程序包含1——n個執行緒。
執行緒:
	同一類執行緒共享程式碼和資料空間,每個執行緒有獨立的執行棧和程式計數器(PC),執行緒切換開銷小。
執行緒和程序一樣分為五個階段:
	建立、就緒、執行、阻塞、終止。
多程序:
	是指作業系統能同時執行多個任務(程式)。
多執行緒:
	是指在同一程式中有多個順序流在執行。
在java中要想實現多執行緒,有三種手段,:
	一種是繼承Thread類,重寫run方法;另外一種是實現Runable介面,重寫run方法;還有就是實現Callable介面,重寫call方法。

(九)簡述oracle中 dml、ddl、dcl的使用?

Dml 資料操縱語言,如select、update、delete,insert 
Ddl 資料定義語言,如create table 、drop table 等等 
Dcl 資料控制語言, 如 commit、 rollback、grant、 invoke等 

(十)String 和StringBuffer的區別?

相同點:
	JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字串,即包含多個字元的字元資料。
不同點:
	String類提供了內容不可改變的字串,字串常量,儲存在記憶體的常量池中。
	而StringBuffer類提供的字串進行修改,字串變數,儲存在記憶體的堆中。
當字元資料要改變的時候可以使用StringBuffer。也可以使用 StringBuffer來動態構造字元資料。

(十一)JDBC中的Statement 和PreparedStatement的區別?

相同點:
	PreparedStatement是Statement的子介面。Statement PreparedStatement都可以向資料庫傳送並執行SQL語句。
不同點:
	1).PreparedStatement是預編譯的SQL語句,效率高於Statement。 
	2).PreparedStatement支援?操作符,相對於Statement更加靈活。 
	3).PreparedStatement可以防止SQL注入,安全性高於Statement。

(十二)int和integer的區別?

最基本的區別:
	Ingeter是int的包裝類,Integer是引用資料型別,int就基本資料型別。 Integer可以賦值為null,int不可以,宣告陣列時int的初值為0,Ingeter的初值為null。
具體區別如下:
	1).無論如何,Integer與new Integer不會相等。不會經歷拆箱過程,new出來的物件存放在堆,而非new的Integer常量則在常量池(在方法區),他們的記憶體地址不一樣,所以為false。
	2).兩個都是非new出來的Integer,如果數在-128到127之間,則是true,否則為false。因為java在編譯Integer i2 = 128的時候,被翻譯成:Integer i2 = Integer.valueOf(128);而valueOf()函式會對-128到127之間的數進行快取。
	3).兩個都是new出來的,都為false。還是記憶體地址不一樣。
	4).int和Integer(無論new否)比,都為true,因為會把Integer自動拆箱為int再去比。