Java面試題大全
Java 基礎
-
面向對象都有哪些特性以及你對這些特性的理解
面向對象有3大特性,即封裝、繼承、多態
封裝:封裝將複雜的功能封裝起來,對外開放一個接口,簡單調用即可。
繼承:繼承是從已有類得到繼承信息創建新類的過程,提供繼承信息的類被稱爲父類——又稱爲超類、基類,得到繼承信息的類被稱爲子類——又稱爲派生類
多態:多態性是指允許不同子類型的對象對同一種消息做出不同的響應,簡單來說就是同一個對象調用同樣的方法但是做了不同的事情。
多態性分爲編譯時的多態和運行的多態
編譯時的多態稱作重載
運行時的多態稱作重寫 -
訪問權限修飾符都有哪些?以及他們的區別
public > protected > default > private
public:當前類、同包、子類、其他包都可訪問
protected:當前類、同包、子類可以訪問
default:當前類、同包可以訪問
private:只有當前類可以訪問 -
Collection 和 Collections 的區別
java.util.Collection 是一個集合接口,它提供了對集合對象進行基本操作的通用接口方法,Collection 接口在 Java 類庫中有很多具體的實現,Collection 接口的意義是爲各種具體的集合提供了最大化的統一操作方式,其直接繼承接口有 List 和 Set
java.util.Collections 是一個包裝類,它包含有各種有關集合操作的靜態多態方法,此類不能實例化,就像一個工具類,用於對集合中元素進行排序、搜索以及線程安全等提供方法 -
String s = new String(“abc”) 創建了幾個對象?
兩個對象,第1個對象是字符串常量 abc,第二個對象是 new String() 產生的,在堆中分配內存給這個對象,該對象內容指向字符串常量 abc 還有一個引用 s 指向第2個對象 -
重寫(Overriding)和重載(OverLoading)的區別
方法的重寫和重載是多態性的不同表現,二者的差別在於:
1.重載是編譯時的多態,重寫是運行時的多態
2.重載的特點是:在同一類中,方法名相同,參數類型、參數順序、以及參數個數不同具有這些特點則稱爲重載方法
3.重寫的特點是:參數列表、返回類型都要和被重寫的方法相同,訪問修飾符權限不能大於被重寫方法的修飾符 -
& 和 && 的區別
1.&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲true時,整個運算結果才爲true,否則,只要有一方爲false,則結果爲false。
2.&&還具有短路的功能,即如果第一個表達式爲false,則不再計算第二個表達式
3.&還可以用作 位運算符,當&操作符兩邊的表達式不是boolean類型時,&表示按位與操作 -
String 是否可以被繼承
String 類是 final 類,不可以被繼承 -
char 型變量能不能存儲一箇中文漢字,爲什麼?
char 類型可以存儲一箇中文漢字,因爲 Java 中使用的編碼是 Unicode(不選擇任何特定的編碼,直接使用字符在字符集中的編號,這是統一的唯一方法),一個 char 類型佔 2 個字節(16 比特),所以放一箇中文是沒問題的 -
說出幾個常見的 runtime Exception
NullpointerException 空指針異常
ClassCastException 數據類型轉換異常
IllegalArgumentException 傳遞非法參數異常
ArithmeticException 算數運算異常
IndexOutOfBooundsException 下標越界異常
NumberFormatException 數字格式異常
SecurityException 安全異常
SQLException sql語句異常
IOException IO流異常 -
RunTimeException和其他Exception區分
其他Exception,受檢查異常,必須要開發者解決以後才能編譯通過,比如通過 try-catch 處理
RuntimeException,運行時異常 ,又稱爲不受檢查異常,編譯期間可以通過,但是在運行期間可能出錯,比如經典的空指針、1/0 算數異常等等 -
Erro 和 Exception 區分
Error 表示恢復起來很困難的一種嚴重問題,例如內存溢出,不可能指望程序處理這樣的情況
Exception 表示一種設計實現問題,他表示如果程序運行異常,從不會發生的情況 -
抽象類 abstract 和接口 interface 有什麼區別?
抽象類:
1.抽象類可以定義構造函數
2.可以有抽象方法和普通方法
3.接口中的成員全都是 public 的
4.抽象類中可以包含靜態方法
5.有抽象方法的類必須是抽象類,而抽象類中可有可不有抽象方法
7.一個類只能繼承一個抽象類
接口:
1.接口中不能定義構造函數
2.方法全部都是抽象方法
3.接口中定義的變量實際上都是常量,都由 public final 修改
4.接口中不能有靜態方法
5.一個類可以實現多個接口
二者相同點:
1.都不能被實例化
2.可以將抽象類和接口類型作爲引用類型
3.一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進行實現,否則該類仍然需要
被聲明爲抽象類 -
抽象的(abstract)方法是否可同時是靜態的(static), 是否可同時是本地方法(native),是否可同時被 synchronized?
都不能,抽象方法需要子類重寫,而靜態的方法是無法被重寫的,因此二者是矛盾的。本地方法是由本地代碼(如 C 代碼)實現的方法,而抽象方法是沒有實現的,也是矛盾的。synchronized 和方法的實現細節有關,抽象方法不涉及實現細節,因此也是相互矛盾的。 -
靜態變量和實例變量的區別?
靜態變量: 是被 static 修飾符修飾的變量,也稱爲類變量,它屬於類,不屬於類的任何一個對象,一個類不管創建多少個對象,靜態變量在內存中有且僅有一個拷貝;
實例變量: 必須依存於某一實例,需要先創建對象然後通過對象才能訪問到它。靜態變量可以實現讓多個對
象共享內存。 -
== 和 equals 的區別?
equals 和 == 最大的區別一個是方法一個是運算符
== :如果比較的對象是基本類型,則比較的是數值是否相等,如果比較的是引用數據類型,則比較的是對象的地址是否相等。
equals():用來比較方法兩個對象的內容是否相等
注意:equals 方法不能用於基本數據類型的變量,如果沒有對 equals 方法進行重寫,則比較的是引用類型的變
量所指向的對象的地址 -
break 和 continue 的區別?
break 和 continue 都是用來控制循環的語句。
break 用於完全結束一個循環,跳出循環執行循環後的語句。
continue 用於跳過本次循環,執行下次循環。 -
throw 和 throws 的區別?
throw:
1.throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理
2.throw 是具體向外拋出異常的動作,所以它拋出的是一個異常實例,執行 throw 一定是拋出了某種異常
throws:
1.throws 語句主要用在方法聲明後面,表示如果拋出異常,由該方法的調用者來進行異常處理
2.throws 主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。
3.throws 表示出現異常的一種可能性,並不一定會發生這種異常。 -
final、finally、finalize 的區別?
final:用於聲明屬性、方法和類,分別表示屬性不可變,方法不可覆蓋,類不可被繼承
finally:異常處理的一部分,表示總是執行
finalize: Object 類的一個方法,在垃圾回收器執行的時候會調用被回收對象的此方法,可以覆蓋此方法
提供垃圾收集時的其他資源回收,例如關閉文件等。該方法更像是一個對象生命週期的臨終方法,當該方法被系統調用則代表該對象即將“死亡”,但是需要注意的是,我們主動行爲上去調用該方法並不會導致該對象“死亡”,這是一個被動的方法(其實就是回調方法),不需要我們調用。 -
switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String上?
Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。從 Java 5 開始,Java 中引入了枚舉類型,expr 也可以是 enum 類型。從 Java 7 開始,expr 還可以是字符串(String),但是長整型(long)在目前所有的版本中都是不可以的。 -
數組有沒有 length() 方法?String 有沒有 length() 方法?
數組沒有 length() 方法,而是有 length 的屬性,String 有 length() 方法。 -
String 、StringBuilder 、StringBuffer 的區別?
String :是隻讀字符串,也就意味着 String 引用的字符串是不能改變的
StringBuffer:StringBuffer 速度沒有 StringBuilder 快,但是它安全性高
StringBuilder :它和 StringBuffer 的方法完全相同,區別在於它是在單線程環境下使用的,因爲它的所有方法都沒有被 synchronized 修飾,因此它的效率理論上也比 StringBuffer 要高。 -
Java 的基本數據類型都有哪些?各佔幾個字節?
整形:
byte 1字節
short 2字節
int 4字節
long 8字節
浮點型:
float 4字節
double 8字節
字符型:
char 2字節 -
String 是基本數據類型嗎?
String 是引用類型,底層用 char 數組實現的 -
short s1=1; s1 = s1 + 1; 有錯嗎?short s1 = 1; s1+=1有錯嗎?
前者不正確,後者正確。對於 short s1 = 1; s1 = s1 + 1;由於 1 是 int 類型,因此 s1+1 運算結果也是 int 型,需要強制轉換類型才能賦值給 short 型。而 short s1 = 1; s1 += 1;可以正確編譯,因爲 s1+= 1;相當於 s1 =(short)(s1 + 1);其中有隱含的強制類型轉換。 -
int 和 和 Integer 有什麼區別?
(1)Integer是int的包裝類;int是基本數據類型;
(2)Integer變量必須實例化後才能使用;int變量不需要;
(3)Integer實際是對象的引用,指向此new的Integer對象;int是直接存儲數據值 ;
(4)Integer的默認值是null;int的默認值是0。 -
如何實現字符串反轉?
通過 StringBuffer 或者 StringBuilder 中的reverse()方法即可完成
String str = "123456789qwertyuiop";
StringBuffer sBuffer = new StringBuffer(str);
StringBuilder sBuilder =new StringBuilder(str);
System.out.println(sBuffer.reverse());
System.out.println(sBuilder.reverse());
- 什麼是 java 序列化,如何實現 java 序列化?
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操作時所引發的問題。
實體類可以通過實現 Serializable 接口來實現 Java 實例化 - List 的三個子類的特點
ArrayList 底層結構是數組,底層查詢快,增刪慢
LinkedList 底層結構是鏈表型的,增刪快,查詢慢
Voctor 底層結構時數組,線程安全的,增刪慢,查詢慢 - List 和 Map、Set 的區別
結構特點:
List 和 Set 是存儲單列數據的集合,Map 是存儲鍵和值這樣的雙列數據的集合;List 中存儲的數據是有順序,並且允許重複;Map 中存儲的數據是沒有順序的,其鍵是不能重複的,它的值是可以有重複的,Set 中存儲的數據是無序的,且不允許有重複,但元素在集合中的位置由元素的 hashcode 決定,位置是固定的(Set 集合根據 hashcode 來進行數據的存儲,所以位置是固定的,但是位置不是用戶可以控制的,所以對於用戶來說 set 中的元素還是無序的
實現類:
List 接口
List 接口有三個實現類(LinkedList:基於鏈表實現,鏈表內存是散亂的,每一個元素存儲本身內存地址的同時還存儲下一個元素的地址。鏈表增刪快,查找慢;ArrayList:基於數組實現,非線程安全的,效率高,便於索引,但不便於插入刪除;Vector:基於數組實現,線程安全的,效率低)。
Map接口
Map 接口有三個實現類(HashMap:基於 hash 表的 Map 接口實現,非線程安全,高效,支持 null 值和 null鍵;HashTable:線程安全,低效,不支持 null 值和 null 鍵;LinkedHashMap:是 HashMap 的一個子類,保存了記錄的插入順序;SortMap 接口:TreeMap,能夠把它保存的記錄根據鍵排序,默認是鍵值的升序排序)。
Set接口
Set 接口有兩個實現類(HashSet:底層是由 HashMap 實現,不允許集合中有重複的值,使用該方式時需要重寫 equals()和 hashCode()方法;LinkedHashSet:繼承與 HashSet,同時又基於 LinkedHashMap 來進行實現,底層使用的是 LinkedHashMp)。
區別:
List 集合中對象按照索引位置排序,可以有重複對象,允許按照對象在集合中的索引位置檢索對象,例如通過list.get(i)方法來獲取集合中的元素;Map 中的每一個元素包含一個鍵和一個值,成對出現,鍵對象不可以重複,值對象可以重複;Set 集合中的對象不按照特定的方式排序,並且沒有重複對象,但它的實現類能對集合中的對象按照特定的方式排序,例如 TreeSet 類,可以按照默認順序,也可以通過實現 Java.util.Comparator< Type>接口來自定義排序方式。 - HashMap 和 HashTable 有什麼區別?
HashTable 線程安全,不允許鍵值對(key/value)有 null 值
HashMap 線程不安全,允許鍵值對(key/value)有 null 值
2020/3/7總結到這!!!