常見面試題之java基礎
1.java面向對象的三大特徵
- 封裝:將客觀事物抽象成類,每個類對自身的數據和方法進行保護;
- 繼承:對象的一個新類可從現有的一個類派生,這個過程被稱爲繼承(也就是一個新的類可以繼承原有類的屬性和方法);
- 多態:同一個行爲具有多個不同的表現形式或形態的能力(我的理解是不同子類繼承父類的方法後,各子類在方法中的實現是不同);
2.int與integer的區別
- int是java的一種基本數據類型,integer是int的包裝類;
- integer必須要實例化(實例化是指面向對象的編程中,類創建對象的過程稱爲實例化)後才能使用,而int不需要;
- integer實際是對象的引用,當new一個integer時,實際上是生成一個指針指向對象,而int則是直接存儲數據值;
- integer的默認值是null,int默認值是0;
3.String,StringBuffer,StringBuilder的區別
java中字符串屬於對象,java提供了String類來創建和操作字符串
(1)字符操作上的區別:
- String:不可變字符序列;
- StringBuffer:可變字符序列、效率低、線程安全;
- StringBuilder:可變字符序列、效率高、線程不安全;
(2)初始化上的區別,String可以賦值爲空,而StringBuffer和StringBuilder不行
小結:
- 如果操作少量的數據用String;
- 多線程操作字符串緩衝區下操作大量數據用StringBuffer;
- 單線程操作字符串緩衝區下操作大量數據用StringBuilder;
4.異常的種類
Exception:可捕獲異常,出現的問題是可以捕獲的;
Error:系統錯誤,通常有JVM處理;
可捕獲異常又分爲兩類:
- RuntimeException類及其子類異常,又被稱爲非強制性異常,通常可以由throw語句拋出這種異常(編譯時被檢查的異常);
- check異常,又被稱爲強制性異常,基本上由Exception類派生而來(編譯時不被檢查的異常,編譯通過)。
5.運行時異常和check異常的區別
- 運行時異常在定義方法是不需要聲明也會被拋出,不需要被捕獲;非運行時異常在調用這個方法時必須聲明捕獲這個check異常;
- 運行時異常通常是代碼編譯錯誤引起的,是一種調用方本身也無法處理的異常;非運行時異常是一種調用方法捕獲拋出就可以處理的情況。
6.final,finally,finalize的區別
- final聲明屬性、方法、類,分別表示屬性不可變,方法不可被覆蓋(即方法不可被重寫),類不可被繼承;
- finally是處理異常結構try/catch模塊的一部分,表示總是被執行;
- finallize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法。
7.轉發與重定向的區別
- 轉發url地址保持不變,只發送了一次請求(舉個例子,轉發就相當於甲託乙辦事,乙找到丙辦理此事,請求沒變化,只有一次);
- 重定向url地址發生變化,發送了兩次請求(重定向相當於甲託乙辦事,乙辦不成,甲又重新找到丙辦理的此事,甲相當於有了兩次請求);
8.方法重寫和方法重載的區別
(1)方法重載
- 方法重載在同一個類中,方法名相同
- 使用重載時只能通過不同的參數列表;
- 方法的異常類型和數目不會對重載造成影響;
- 與訪問修飾符,返回類型無關;
- 可以拋出不同的異常;
(2)方法重寫
- 方法重寫必須寫在繼承關係中,子類方法名和父類一樣
- 父類的參數列表和子類重寫方法的參數列表相同;
- 父類的返回類型和子類重寫方法的返回類型相同;
- 子類的訪問修飾符不能嚴於父類;
(3)構造函數不能被繼承,構造方法可以重載不能被重寫
9.抽象類與接口的區別
- 抽象類中可以有構造方法,接口中不能有構造方法;
- 抽象類中可以有普通成員變量,接口中沒有普通成員變量;
- 抽象類中可以包含非抽象的普通方法,接口中的所有方法必須是抽象的。
10.靜態方法與實例方法的區別
- 靜態方法用static修飾,實例方法沒有;
- 靜態方法在訪問本類的成員時,只允許訪問靜態成員(即本類中靜態成員變量和靜態方法),實例方法沒有限制條件;
- 在訪問外部類時,調用靜態方法可以用“類名.方法名”,也可以用"對象名.方法名",而實例方法調用只能用後面那種形式。
11.List和Set的區別
- List存儲數據是有序的隊列,允許有重複的元素(有序不唯一);
- Set存儲數據是無序的隊列,不允許有重複的元素(無序不唯一),Set一般對基本數據類型的數據會自動去重,對象不可以;
- Map存儲鍵值對的數據;
- List和Set是繼承Collection接口的,而Map不是。
12.ArraryList、LinkedList、HashSet、Vector比較
- ArraryList是數組結構,增刪慢,查找快,非線程安全;
- LinkedList是鏈表結構,增刪快,查找慢,非線程安全;
- HashSet是非線程安全;
- Vector是線程安全的。
13.HashMap和HashTable比較
- HashMap是非線程安全的,HashTable是線程安全的,HashMap的效率要高於HashTable;
- HashMap允許將null作爲key或value,HashTable則不允許。
14.訪問修飾符比較
作用域 | 當前類 | 同一包中 | 子類 | 其他 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
15.運算符i++和++i的區別
- i++是先賦值再加,++i是先加再賦值;
- ++i的效率要高於i++;
- ++i可以左值,i++不可以。