推薦使用小程式閱讀
為了能讓您更加方便的閱讀
本文所有的面試題目均已整理至下面的小程式《面試手冊》
可以通過微信掃描(或長按)下圖的二維碼享受更好的閱讀體驗!

目錄
- 推薦使用小程式閱讀
- 1. Java 基本概念
- 1.1 Java源程式的擴展名是什么?
- 1.2 什么是識別符號?
- 1.3 識別符號有哪些特點?
- 1.4 請說明環境變數Path 與 classpath 區別
- 1.5 java程式經編譯后產生的位元組碼檔案擴展名是什么?
- 1.6 請說出常用的DOS命令并解釋?
- 1.7 請解釋Java語言的跨平臺特性?
- 1.8 請說明JDK、JRE、JVM的區別?
- 2. Java 基礎
- 2.1 注釋的分類及作用?
- 2.2 請說出Java中資料型別的分類?基本資料型別都有哪些?
- 2.3 Java中資料的型別轉換有幾種?分別是什么?
- 2.4 Java語言中的字符char可以存盤一個中文漢字嗎?為什么呢?
- 2.5 請說明 && 和 & 的區別?
- 2.6 請說明 == 與 = 的區別?
- 2.7 三元運算子的基本格式是什么?
- 2.8 三元運算子的執行流程是什么?
- 2.9 使用鍵盤錄入資料的三個步驟是什么?
- 2.10 請說明for、while、do…while三種回圈的格式以及執行流程,以及它們的區別,
- 2.11 定義一個方法的格式是什么,以及方法的注意事項?
- 2.12 private 關鍵字在哪里使用? 被 private 修飾的成員有什么特點?
- 2.13 為什么要有 this 關鍵字?this 關鍵字的含義?
- 2.14 final 關鍵字是什么意思,可以修飾那些成員?被修飾的成員有哪些特點?
- 2.15 形式引數是基本型別要的是什么?是類名、抽象類名、介面名時分別要的是什么?
- 2.16 回傳值型別是基本型別回傳的是什么?是類名、抽象類名、介面名分別回傳的是什么?
- 2.17 package它有什么作用?
- 2.18 import的作用?
- 2.19 請解釋 ==與equals()方法的區別?
- == 解讀
- equals 解讀
- 2.20 請簡述泛型是什么?有什么用?在哪里用?
- 2.21 如何撰寫一個泛型方法,讓它能夠接受泛型引數并回傳泛型型別?并舉例
- 2.22 請簡述Java中如何使用泛型撰寫帶有引數的類?并舉例
- 2.23 請說說檔案名稱過濾器FilenameFilter的作用?
- 2.24 請簡述遞回是什么?注意事項是什么?
- 2.25 兩個物件的 hashCode() 相同,則 equals() 也一定為 true,對嗎?
- 2.26 Java 中的 Math. round(-1. 5) 等于多少?
- 3. Java 變數
- 3.1 請寫出Java識別符號的命名規則
- 3.2 變數是什么?
- 3.3 變數的定義格式是什么?
- 3.4 成員變數與區域變數的區別?
- 3.5 靜態變數與成員變數的區別?
- 4. Java String
- 4.1 String s = “a”+“b”+”c”; 創建了多少物件,分別是什么?
- 4.2 如何實作StringBuffer和String的相互轉換?
- 4.3 如何實作String和int資料的相互轉換
- 4.4 如何實作【基本資料型別】與【基本資料封裝類】之間的相互轉換
- 4.5 請說明String與StringBuffer二者之間的區別?
- 4.6 請說明StringBuffer與StringBilder二者之間的區別?
- 4.7 什么是正則運算式?
- 4.8 如何實作Date與long相互轉換?
- 4.9 如何實作Date與String相互轉換?
- 4.10 String 屬于基礎的資料型別嗎?
- 4.11 String str=“i” 與 String str=new String(“i”)一樣嗎?
- 4.12 如何將字串反轉?
- 4.13 String 類的常用方法都有那些?
- 5. Java 類、抽象類、介面、內部類、代碼塊
- 5.1 類是什么? 物件是什么?舉例說明
- 5.2 類由哪些內容組成?
- 5.3 什么是匿名物件?什么時候使用匿名物件?
- 5.4 構造方法的作用是什么?構造方法的特點是什么?構造方法的注意事項? 構造方法中可不可以寫return 陳述句呢?
- 5.5 一個類的預設構造方法可以有引數嗎?
- 5.6 請說明一個物件的創建程序做了哪些事情?
- 5.7 子父類中構造方法的執行有什么特點?為什么要這樣?
- 5.8 靜態代碼塊,構造代碼塊,構造方法的執行順序是什么以及執行特點?
- 5.9 抽象類是什么,抽象類的特點?
- 5.10 抽象類中有沒有構造方法,如果有它是用來做什么的?
- 5.11 介面中成員變數的特點,以及成員方法的特點?
- 5.12 請說出類與類,類與介面,以及介面與介面的關系以及特點?
- 5.13 抽象類和介面的區別?
- 成員區別
- 關系區別
- 設計理念區別
- 5.14 內部類有哪些訪問特點?
- 5.15 匿名內部類的格式是什么?其本質是什么?
- 5.16 抽象類必須要有抽象方法嗎?
- 5.17 抽象類能使用 final 修飾嗎?
- 6. 封裝、繼承、多型
- 6.1 請解釋什么是方法的多載?
- 6.2 使用面向物件【封裝】的好處有哪些?
- 6.3 Java 中的類的繼承特點是什么以及繼承的注意事項?
- 6.4 繼承的好處是什么?
- 6.5 this 和 super 分別是什么,他們各自的應用場景是什么?
- 6.6 什么是方法重寫?需要注意哪些問題?
- 6.7 方法重寫和多載有什么區別?
- 6.8 什么是多型,多型的前提是什么?
- 6.9 多型中成員(成員變數,成員方法,靜態成員方法)的訪問特點是什么?
- 6.10 多型的好處?
- 6.11 多型的弊端是什么,如果我們想訪問子類的特有的功能我們應該怎么辦?
- 7. Java 容器
- 7.1 陣列有幾種創建的方式?分別是什么?
- 7.2 請簡述集合和陣列的異同點?
- 集合:
- 陣列:
- 7.3 迭代器Iterator是什么?怎么使用?有什么特點?
- 7.4 請簡述常見的資料結構有哪些?
- 7.5 請簡述ArrayList、Vector、LinkedList三者的特點?
- ArrayList
- Vector
- LinkedList
- 7.6 請簡述ArrayList、Vector、LinkedList,分別在什么時候使用?
- 執行緒安全
- 非執行緒安全
- 7.7 請簡述并發修改例外產生的原因?如何解決?
- 例外
- 解決方式
- 7.8 請簡述List和List之間有什么區別?
- 7.9 請簡述Set集合的特點?
- 7.10 請簡述HashSet是如何保證元素唯一性的?
- 7.11 請簡述TreeSet是如何保證元素唯一性與排序的?
- 7.12 請說明Map介面和Collection介面的區別
- 7.13 請說出Map集合的遍歷方式
- 7.14 請說明HashMap和Hashtable的區別
- 7.15 請解釋Collection與Collections的區別
- 7.16 Java 容器都有哪些?
- 7.17 List、Set、Map 之間的區別是什么?
- 7.18 如何決定使用 HashMap 還是 TreeMap?
- 7.19 說一下 HashMap 的實作原理?
- 7.20 說一下 HashSet 的實作原理?
- 7.21 如何實作陣列和 List 之間的轉換?
- 7.22 Array 和 ArrayList 有何區別?
- 7.23 在 Queue 中 poll()和 remove()有什么區別?
- 7.24 Iterator 和 ListIterator 有什么區別?
- 7.25 怎么確保一個集合不能被修改?
- 8. Java 例外
- 8.1 請說說什么是例外?例外的分類?
- 8.2 請說出例外處理的方式?
- 8.3 請說說編譯期例外和運行期例外的區別?
- 8.4 請說說throws與throw的區別?
- 8.5 請說說final、finally與finalize的區別?
- 8.6 請說說例外的注意事項及如何使用例外處理?
- 8.7 請說出最常見到的RuntimeException例外
- 8.8 請簡述IO流的分類
- 9. Java IO
- 9.1 請簡述字符編碼是什么?請說出常見字符編碼表?
- 9.2 請說出學習過的IO流中的常用方法?
- 9.3 請說出轉換流OutputStreamWriter與InputStreamReader 的作用?
- 9.4 請簡述列印流(PrintStream、PrintWriter)的特點?
- 9.5 BIO、NIO、AIO 有什么區別?
- 9.6 Files的常用方法都有哪些?
1. Java 基本概念
1.1 Java源程式的擴展名是什么?
.java
1.2 什么是識別符號?
在java語言中能夠我們自己起名的都叫識別符號
1.3 識別符號有哪些特點?
識別符號是大小寫字母、數字字符、$和_組成,不能以數字開頭,也不能是java關鍵字,并且區分大小寫
1.4 請說明環境變數Path 與 classpath 區別
path是系統用來指定可指定檔案的完整路徑,Path是用來搜索所執行的可執行檔案路徑的,如果執行的可執行檔案不在當前目錄下,那就會依次搜索path中設定的路徑,
classpath是指定你在程式中所使用的類(.class)檔案所在的位置,
1.5 java程式經編譯后產生的位元組碼檔案擴展名是什么?
位元組碼檔案擴展名是 .class
1.6 請說出常用的DOS命令并解釋?
- d: 回車
盤符切換 - dir (directory)
列出當前目錄下的檔案以及檔案夾 - cd (change directory)
改變指定目錄(進入指定目錄) - cd..
退回到上一層目錄 - cd \
退回到跟目錄 - md (make directory)
創建目錄 - rd (remove directory)
洗掉目錄 - del (delete)
洗掉檔案,洗掉一堆后綴名一樣的檔案*.txt - cls (clear screen)
清屏 - exit
退出dos命令列
1.7 請解釋Java語言的跨平臺特性?
Java語言是跨平臺運行的,其實就是不同的作業系統,使用不同的JVM映射規則,讓其與作業系統無關,完成了跨平臺性,JVM對上層的Java源檔案是不關心的,它關注的只是由源檔案生成的類檔案(class file),
1.8 請說明JDK、JRE、JVM的區別?
- JDK
Java Development Kit(Java開發工具包),JDK是整個JAVA的核心,包括了Java運行環境(Java Runtime Environment),一堆Java工具(javac/java/javap等) - JRE
Java Runtime Environment(java運行時環境),也就是我們說的JAVA平臺,所有的Java程式都要在JRE下才能運行,包括JVM和JAVA核心類別庫和支持檔案,與JDK相比,它不包含開發工具(編譯器、除錯器和其他工具), - JVM
Java Virtual Mechinal(JAVA虛擬機),JVM是JRE的一部分,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實作的,
2. Java 基礎
2.1 注釋的分類及作用?
- 單行注釋
注釋單行代碼或為單行代碼添加描述的時候使用 - 多行注釋
注釋多行代碼或為代碼添加多行描述的時候使用 - 檔案注釋
生產java幫助檔案的時候使用,開發中常用來描述類、描述方法
2.2 請說出Java中資料型別的分類?基本資料型別都有哪些?
- 基本資料型別
- byte
- short
- int
- long
- float
- double
- char
- boolean
- 參考資料型別
- 陣列
- 類
- 介面
2.3 Java中資料的型別轉換有幾種?分別是什么?
- 強制型別轉換
容量大的型別向容量小的型別轉換時使用 - 隱式型別轉換
容器小的型別向容量大的型別轉換時使用
2.4 Java語言中的字符char可以存盤一個中文漢字嗎?為什么呢?
char型變數是用來存盤Unicode編碼的字符的,unicode編碼字符集中包含了漢字,所以,char型變數中可以存盤漢字,不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那么,這個char型變數中就不能存盤這個特殊漢字,
補充說明:unicode編碼占用兩個位元組,所以,char型別的變數也是占用兩個位元組,
2.5 請說明 && 和 & 的區別?
&和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的運算式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false,
&&還具有短路的功能,即如果第一個運算式為false,則不再計算第二個運算式
&還可以用作位運算子,當&運算子兩邊的運算式不是boolean型別時,&表示按位與操作,
2.6 請說明 == 與 = 的區別?
- ==
比較運算子,用來比較運算子兩邊的變數的值是否相等, - =
賦值運算子,把運算子右邊的值,賦值給左邊的變數
2.7 三元運算子的基本格式是什么?
三元運算子的格式是: 條件運算式 ? 運算式1 : 運算式2
2.8 三元運算子的執行流程是什么?
三元運算子的執行流程: 首先計算條件運算式的值看其回傳結果是true還是false,如果是true就執行運算式1,如果是false就執行運算式2
2.9 使用鍵盤錄入資料的三個步驟是什么?
- 第一步導包
格式: import java.util.Scanner ;位置: 在class上邊 - 第二步創建Scanner物件
格式: Scanner sc = new Scanner(System.in) ; - 第三步獲取鍵盤錄入資料
格式: int x = sc.nextInt() ;
2.10 請說明for、while、do…while三種回圈的格式以及執行流程,以及它們的區別,
- for回圈陳述句格式
for(初始化陳述句;判斷條件陳述句;控制條件陳述句) {
回圈體陳述句;
}- 執行流程:
- 執行初始化陳述句
- 執行判斷條件陳述句,看其結果是true還是false,如果是false,回圈結束;如果是true,繼續執行,
- 執行回圈體陳述句
- 執行控制條件陳述句
- 回到b繼續
- 執行流程:
- while回圈陳述句格式
while(判斷條件陳述句) {
回圈體陳述句;
}- 執行流程:
- 執行判斷條件陳述句,看其結果是true還是false
如果是false,回圈結束,
如果是true,繼續執行, - 執行回圈體陳述句
- 回到a繼續
- 執行判斷條件陳述句,看其結果是true還是false
- 執行流程:
- do…while回圈陳述句格式
do {
回圈體陳述句;
}while((判斷條件陳述句);- 執行流程:
- 執行回圈體陳述句
- 執行判斷條件陳述句,看其結果是true還是false,如果是false,回圈結束;如果是true,繼續執行,
- 回到a繼續
- 執行流程:
- 三種回圈陳述句的區別
- do…while回圈至少會執行一次回圈體
- for回圈和while回圈只有在條件成立的時候才會去執行回圈體
注意:寫程式優先考慮for回圈,再考慮while回圈,最后考慮do…while回圈
2.11 定義一個方法的格式是什么,以及方法的注意事項?
- 格式
修飾符 回傳值型別 方法名(引數型別 引數名1, 引數型別 引數名2 ….){
方法體 ;
return 回傳值 ;
} - 注意事項
A. 方法不呼叫不執行
B. 方法與方法是平級關系,不能嵌套定義
C. 方法定義的時候引數之間用逗號隔開
D. 方法呼叫的時候不用在傳遞資料型別
E. 如果方法有明確的回傳值,一定要有return帶回一個值
2.12 private 關鍵字在哪里使用? 被 private 修飾的成員有什么特點?
類中的成員需要私有的時候使用private關鍵字
特點:
是一個權限修飾符,
可以修飾成員(成員變數和成員方法)
被private修飾的成員只在本類中才能訪問
2.13 為什么要有 this 關鍵字?this 關鍵字的含義?
this用來解決成員變數與區域變數重名問題
this關鍵字代表的是本類物件參考;誰呼叫我,this就代表誰.
2.14 final 關鍵字是什么意思,可以修飾那些成員?被修飾的成員有哪些特點?
final最終的意思,
-
可修飾
- 類
- 成員變數
- 成員方法
-
特點
- final修飾類,此類不能被繼承,
- final修飾變數,變數就成了常量,只能被賦值一次
- final修飾方法,方法不能被重寫
2.15 形式引數是基本型別要的是什么?是類名、抽象類名、介面名時分別要的是什么?
形式引數是基本型別要的是一個基本型別的變數或者具體的常量值
- 類名時
要的是一個該類的物件 - 抽象類名時
要的是一個繼承自該類的一個子類物件 - 介面時
要的是一個實作了該介面的子類物件
2.16 回傳值型別是基本型別回傳的是什么?是類名、抽象類名、介面名分別回傳的是什么?
回傳值是基本資料型別的時候回傳的是一個具體的值
- 類名時
本質上回傳的是一個該類對應的子類物件 - 抽象類名時
回傳的應該是一個繼承自該類的子類物件 - 介面名的時
回傳的是一個實作了該介面的子類物件
2.17 package它有什么作用?
package,包的意思,其實就是檔案夾,它可以對類進行分類管理
2.18 import的作用?
在不同包下的類之間相互訪問的時候,發現,每次使用不同包下的類的時候,都需要加包的全路徑,比較麻煩,這個時候,java就提供了( import )導包的功能,
使用import可以將包中的類匯入進來,以后使用類的時候,不需導包,直接使用,簡化了書寫,
2.19 請解釋 ==與equals()方法的區別?
== 解讀
對于基本型別和參考型別 == 的作用效果是不同的,如下所示:
- 基本型別:比較的是值是否相同;
- 參考型別:比較的是參考是否相同;
代碼示例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
代碼解讀:因為 x 和 y 指向的是同一個參考,所以 == 也是 true,而 new String()方法則重寫開辟了記憶體空間,所以 == 結果為 false,而 equals 比較的一直是值,所以結果都為 true,
equals 解讀
equals 本質上就是 ==,只不過 String 和 Integer 等重寫了 equals 方法,把它變成了值比較,看下面的代碼就明白了,
首先來看默認情況下 equals 比較一個有相同值的物件,代碼如下:
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat("mbb");
Cat c2 = new Cat("mbb");
System.out.println(c1.equals(c2)); // false
輸出結果出乎我們的意料,竟然是 false?這是怎么回事,看了 equals 原始碼就知道了,原始碼如下:
public boolean equals(Object obj) {
return (this == obj);
}
原來 equals 本質上就是 ==,
那問題來了,兩個相同值的 String 物件,為什么回傳的是 true?代碼如下:
String s1 = new String("mbb");
String s2 = new String("mbb");
System.out.println(s1.equals(s2)); // true
同樣的,當我們進入 String 的 equals 方法,找到了答案,代碼如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
原來是 String 重寫了 Object 的 equals 方法,把參考比較改成了值比較,
總結 :== 對于基本型別來說是值比較,對于參考型別來說是比較的是參考;而 equals 默認情況下是參考比較,只是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等,
2.20 請簡述泛型是什么?有什么用?在哪里用?
- 泛型是什么?
泛型是一種特殊的型別,它把指定型別的作業推遲到客戶端代碼宣告并實體化類或方法的使用進行,也被稱為引數化型別,可以把型別當做引數一樣傳遞過來,在傳遞過來之前我不明確,但是在使用的時候就就明確了, - 泛型的好處
- 提高了程式的安全性
- 將運行期遇到的問題轉移到了編譯期
- 省去了型別強轉的麻煩
- 泛型的常見應用
- 泛型類
- 泛型方法
- 泛型介面
2.21 如何撰寫一個泛型方法,讓它能夠接受泛型引數并回傳泛型型別?并舉例
泛型方法,指把泛型定義在方法上,使用泛型型別來替代原始型別
public static T[] sort(T[] t){
Arrays.sort(t);
return t;
}
2.22 請簡述Java中如何使用泛型撰寫帶有引數的類?并舉例
泛型類,指把泛型定義在類上,使用泛型型別來替代原始型別
class GenericClass {
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
2.23 請說說檔案名稱過濾器FilenameFilter的作用?
FilenameFilter是檔案名過濾器,用來過濾不符合規則的檔案名,并回傳合格的檔案,
2.24 請簡述遞回是什么?注意事項是什么?
所謂遞回,是指程式呼叫自身,
注意,遞回不會無休止地呼叫下去,它必然有一個出口,當滿足條件時程式也就結束了,不然的話,那就是死回圈了,
2.25 兩個物件的 hashCode() 相同,則 equals() 也一定為 true,對嗎?
不對,兩個物件的 hashCode() 相同,equals() 不一定 true,
代碼示例:
String str1 = "通話";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));
執行的結果:
str1:1179395 | str2:1179395
false
代碼解讀:很顯然“通話”和“重地”的 hashCode() 相同,然而 equals() 則為 false,因為在散串列中,hashCode() 相等即兩個鍵值對的哈希值相等,然而哈希值相等,并不一定能得出鍵值對相等,
2.26 Java 中的 Math. round(-1. 5) 等于多少?
等于 -1,因為在數軸上取值時,中間值(0.5)向右取整,所以正 0.5 是往上取整,負 0.5 是直接舍棄,
3. Java 變數
3.1 請寫出Java識別符號的命名規則
- 包
全部小寫 - 單層包
小寫,舉例:itcast,com - 多層包
小寫,并用 . 隔開,舉例:cn.itcast, com.baidu - 類或者介面:
- 一個單詞
首字母大寫,舉例:Student,Demo - 多個單詞
每個單詞首字母大寫,舉例:HelloWorld,StudentName
- 一個單詞
- 方法或者變數:
- 一個單詞
首字母小寫,舉例:name,main - 多個單詞
從第二個單詞開始,每個單詞首字母大寫,舉例:studentAge,showStudentNames()
- 一個單詞
- 常量
全部大寫- 一個單詞
大寫,舉例:PI - 多個單詞
大寫,并用 _ 隔開,舉例:STUDENT_MAX_AGE
- 一個單詞
3.2 變數是什么?
變數,在程式運行時,值可以被修改的量,
3.3 變數的定義格式是什么?
資料型別 變數名 = 變數值
3.4 成員變數與區域變數的區別?
-
在類中的位置不同
成員變數:在類中方法外
區域變數:在方法定義中或者方法宣告上 -
在記憶體中的位置不同
成員變數:在堆記憶體
區域變數:在堆疊記憶體 -
生命周期不同
成員變數:隨著物件的創建而存在,隨著物件的消失而消失
區域變數:隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失 -
初始化值不同
成員變數:有默認初始化值
區域變數:沒有默認初始化值,必須定義,賦值,然后才能使用,
3.5 靜態變數與成員變數的區別?
-
所屬不同
靜態變數屬于類,所以也稱為為類變數
成員變數屬于物件,所以也稱為實體變數(物件變數) -
記憶體中位置不同
靜態變數存盤于方法區的靜態區
成員變數存盤于堆記憶體 -
記憶體出現時間不同
靜態變數隨著類的加載而加載,隨著類的消失而消失
成員變數隨著物件的創建而存在,隨著物件的消失而消失 -
呼叫不同
靜態變數可以通過類名呼叫,也可以通過物件呼叫
成員變數只能通過物件名呼叫
4. Java String
4.1 String s = “a”+“b”+”c”; 創建了多少物件,分別是什么?
- 5個物件
- a
- b
- c
- ab
- abc
因為字串的特點是一旦被創建就不能被改變,所有在使用常量進行相加的時候,都是在創建新的字串物件,最后在把字串"abc"這個常量值賦值給參考變數s
4.2 如何實作StringBuffer和String的相互轉換?
- 通過String類的構造方法
- 通過StringBuffer類中的toString()方法
- 通過StringBuffer類中的substring()方法 (注:不常用)
String 轉換到 StringBuffer的方式: - 通過StringBuffer類的構造方法
- 通過StringBuffer類的append()、insert()方法
4.3 如何實作String和int資料的相互轉換
- String – Integer – int通過Integer類的intValue()方法
- 通過Integer類的parseInt(String s)方法
Int 轉換到 String的方式: - Int – Integer – String Integer的toSting()
- 通過String類的valueOf()方法
- 通過Integer類的toSting(int i)方法
- 通過與字串""相連接
4.4 如何實作【基本資料型別】與【基本資料封裝類】之間的相互轉換
- 通過包裝類的構造方法
- 通過包裝類的靜態方法valueOf()
包裝類 轉換到 基本資料型別的方式: - 通過包裝類的方法xxxValue()
4.5 請說明String與StringBuffer二者之間的區別?
String類表示內容不可以改變的字串
StringBuffer類表示內容可以被修改的字串
4.6 請說明StringBuffer與StringBilder二者之間的區別?
-
StringBilder
是執行緒不安全的,運行效率高如果一個字串變數是在方法里面定義,這種情況只可能有一個執行緒訪問它,不存在不安全的因素了,則用StringBuilder,
-
StringBuffer
是執行緒安全的,運行要低于StringBilder如果要在類里面定義成員變數,并且這個類的實體物件會在多執行緒環境下使用,那么最好用StringBuffer,
4.7 什么是正則運算式?
正則運算式使用單個字串來描述、匹配一系列符合某個句法規則的字串,在很多文本編輯器里,正則達表示通常被用來檢索、替換那些符合某個模式的文本,
4.8 如何實作Date與long相互轉換?
- Date 轉 long
通過Date類的getTime()方法 - long 轉 Date
通過Date類的構造方法
4.9 如何實作Date與String相互轉換?
-
Date 轉 String
- Date類的toString()方法
- DateFormat類的format()方法
-
String 轉 Date
-
Date類的構造方法
已過時,被DateFormat類的parse(String s)方法取代
-
DateFormat類的parse()方法
-
4.10 String 屬于基礎的資料型別嗎?
String 不屬于基礎型別
基礎型別有 8 種:
- byte
- boolean
- char
- short
- int
- float
- long
- double
而 String 屬于物件
4.11 String str=“i” 與 String str=new String(“i”)一樣嗎?
不一樣,因為記憶體的分配方式不一樣,String str="i"的方式,Java 虛擬機會將其分配到常量池中;而 String str=new String(“i”) 則會被分到堆記憶體中,
4.12 如何將字串反轉?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法,
示例代碼:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System. out. println(stringBuilder.reverse()); // gfedcba
4.13 String 類的常用方法都有那些?
- indexOf():回傳指定字符的索引,
- charAt():回傳指定索引處的字符,
- replace():字串替換,
- trim():去除字串兩端空白,
- split():分割字串,回傳一個分割后的字串陣列,
- getBytes():回傳字串的 byte 型別陣列,
- length():回傳字串長度,
- toLowerCase():將字串轉成小寫字母,
- toUpperCase():將字串轉成大寫字符,
- substring():截取字串,
- equals():字串比較,
5. Java 類、抽象類、介面、內部類、代碼塊
5.1 類是什么? 物件是什么?舉例說明
是一組相關屬性和行為的集合是一個抽象的東西,物件則是該類的一個具體的體現,
舉例: 學生就是一個類,然后每一個學生都是學生的一個個具體的體現,所以每一個學生就是一個學生,
5.2 類由哪些內容組成?
類由成員變數和成員方法組成
成員變數對應的就是事物的屬性(就是事物固有的資訊,比如: 人的屬性有身高 , 姓名 , 年齡 , 學歷…) , 成員方法對應的是行為(行為: 就是該事物可以做的事情,比如:人的行為有: 吃飯,睡覺…)
5.3 什么是匿名物件?什么時候使用匿名物件?
匿名物件指:沒有起名字的物件
使用匿名物件:
a:呼叫方法,僅僅只呼叫一次的時候
b:匿名物件可以作為實際引數傳遞
5.4 構造方法的作用是什么?構造方法的特點是什么?構造方法的注意事項? 構造方法中可不可以寫return 陳述句呢?
構造方法的作用是用于給類的成員變數賦值,完成類的初始化作業
-
構造方法的特點:
構造方法的名稱和類名相同
構造方法沒有回傳值型別,連void也沒有
構造方法沒有具體的回傳值 -
構造方法的注意事項:
-
如果一個類沒有給出構造方法,系統將會提供一個默認無參的構造方法
-
如果我們給出類構造方法,系統將不會提供默認無參的構造方法,這個時候如果我們還想使用無參的構造方法來創建物件,那么就需要我們給出無參的構造方法
可以寫空的return陳述句.
-
5.5 一個類的預設構造方法可以有引數嗎?
一個類的預設構造方法沒有引數
5.6 請說明一個物件的創建程序做了哪些事情?
Student s = new Student();
- 將Student.class 位元組碼檔案加載到記憶體
- 在堆疊記憶體中,開辟一個空間存盤 s變數,用來記錄Student物件的參考
- 在堆記憶體中,開辟一個空間存盤 new Student()物件的成員資訊
- 加載類中靜態成員
- 執行類中靜態代碼塊
- 加載物件中普通成員
- 執行構造代碼塊
- 執行構造方法
- 將new Student()的地址賦值給 s 變數
5.7 子父類中構造方法的執行有什么特點?為什么要這樣?
- 子類有所有的構造方法默認都會訪問父類中空引數的構造方法,
因為子類會繼承父類中的資料,可能還會使用父類的資料,所以,子類初始化之前,一定要先完成父類資料的初始化,
每一個構造方法的第一條陳述句默認都是:super() - 如果父類中沒有空引數的構造方法,通過下列方式解決
- 子類通過super去顯示呼叫父類其他的帶參的構造方法
- 子類通過this去呼叫本類的其他構造方法(本類其他構造也必須首先可以訪問了父類構造)
注意:super(…)或者this(…)必須出現在第一條陳述句上,否則,就會有父類資料的多次初始化
5.8 靜態代碼塊,構造代碼塊,構造方法的執行順序是什么以及執行特點?
- 先執行所有的靜態代碼塊,再執行所有的構造代碼塊,最后執行構造方法
- 靜態代碼塊只執行一次, 構造代碼塊和構造方法,每創建一次物件就執行一次
5.9 抽象類是什么,抽象類的特點?
-
抽象類的定義
使用了關鍵字abstract宣告的類叫做“抽象類”,如果一個類里包含了一個或多個抽象方法,類就必須指定成abstract(抽象),“抽象方法”,屬于一種不完整的方法,只含有一個宣告,沒有方法主體, -
抽象類的特點:
-
抽象類的定義格式: abstract class 類名{}
-
抽象方法的定義格式: public abstract 回傳值型別 方法名();
-
抽象類中可以存在抽象方法,也可以存在非抽象方法
-
抽象類不能直接進行實體化,我們可以使用多型的形式進行進行間接實體化
-
抽象類的子類
-
可以是抽象類
如果子類還是抽象類,那么我們還是不能進行實體化,還需要一個子類去繼承
-
也可以是非抽象類
子類必須重寫父類的抽象方法
-
-
5.10 抽象類中有沒有構造方法,如果有它是用來做什么的?
抽象類雖然不能進行實體化,但是抽象類中是存在構造方法,該構造方法的作用是用于子類訪問父類資料時的初始化.
5.11 介面中成員變數的特點,以及成員方法的特點?
介面中的成員變數都是常量,存在默認的訪問修飾符:
public static final
介面中的成員方法都是抽象方法,存在默認的訪問修飾符:
public abstract
5.12 請說出類與類,類與介面,以及介面與介面的關系以及特點?
- 類與類
是繼承的關系,只支持單繼承,可以是多層繼承, - 類與介面
是實作的關系,可以是多實作 - 特點
- 一個類可以繼承一個類的同時,還可以實作多個介面
- 介面與介面是繼承的關系,可以是單繼承也可以是多繼承
5.13 抽象類和介面的區別?
成員區別
- 抽象類
- 成員變數
可以是變數,也可以是常量
- 成員變數
- 構造方法
有 - 成員方法
可以抽象,也可以非抽象 - 介面:
- 成員變數
只可以常量 - 成員方法
只可以抽象
- 成員變數
關系區別
- 類與類
繼承,單繼承 - 類與介面
實作,單實作,多實作 - 介面與介面
繼承,單繼承,多繼承
設計理念區別
- 抽象類
被繼承體現的是:“is a”的關系, 抽象類中定義的是該繼承體系的共性功能, - 介面
被實作體現的是:“like a”的關系, 介面中定義的是該繼承體系的擴展功能,
5.14 內部類有哪些訪問特點?
- 內部類可以直接訪問外部類的成員,包括私有
- 外部類要訪問內部類的成員,必須先創建內部類物件
5.15 匿名內部類的格式是什么?其本質是什么?
- 匿名內部類的格式
new 類名或者介面名() {
方法重寫 ;
} ; - 本質
匿名內部類本質是一個繼承了某一個類或者實作了某一個介面的子類物件
5.16 抽象類必須要有抽象方法嗎?
不需要,抽象類不一定非要有抽象方法,
示例代碼:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
上面代碼,抽象類并沒有抽象方法但完全可以正常運行,
5.17 抽象類能使用 final 修飾嗎?
不能,定義抽象類就是讓其他類繼承的,如果定義為 final 該類就不能被繼承,這樣彼此就會產生矛盾,所以 final 不能修飾抽象類
6. 封裝、繼承、多型
6.1 請解釋什么是方法的多載?
方法多載指在同一個類中,允許存在一個以上的同名方法,只要它們的引數個數或者引數型別不同即可,
方法多載特點:
a) 與回傳值型別無關,只看方法名和引數串列
b) 在呼叫時,虛擬機通過引數串列的不同來區分同名方法
6.2 使用面向物件【封裝】的好處有哪些?
隱藏實作細節,提供公共的訪問方式;
提高了代碼的復用性;
提高安全性,
6.3 Java 中的類的繼承特點是什么以及繼承的注意事項?
繼承的特點: 在java語言中類的繼承只支持單繼承,不支持多繼承.但是可以多層繼承,
繼承的注意事項:
- 子類只能繼承父類非私有的成員
- 子類不能繼承父類的構造方法,但是可以通過super去訪問父類的構造方法
- 不要為了某個功能去使用繼承
6.4 繼承的好處是什么?
- 提高了代碼的維護型
- 提供了代碼的復用性
- 讓類與類之間產生了關系, 是多型的前提
6.5 this 和 super 分別是什么,他們各自的應用場景是什么?
-
this
代表的是本類物件的參考 , 誰呼叫我這個方法,這個方法里邊的this就代表誰,一般的使用場景是,當區域變數隱藏了成員變數的時候,我們可以使用this去明確指定要訪問的是成員變數 -
super
代表的是父類存盤空間的一個標志(可以理解為父類物件的參考),我們可以使用super來訪問父類的成員
6.6 什么是方法重寫?需要注意哪些問題?
方法重寫:指子類中出現了和父類中一模一樣的方法宣告,也被稱為方法覆寫,方法復寫
需要注意的問題:
1. 父類中私有方法不能被重寫
2. 子類重寫父類方法時,訪問權限不能更低
3. 父類靜態方法,子類也必須通過靜態方法進行重寫,(其實這個算不上方法重寫,但是現象確實如此)
6.7 方法重寫和多載有什么區別?
- 多載Overload
表示同一個類中可以有多個名稱相同的方法,但這些方法的引數串列各不相同(即引數個數或型別不同),與回傳值型別無關, - 重寫Override
發生在子父類中的一個現象, 子類中出現了和父類中一模一樣的方法,與回傳值有關.
6.8 什么是多型,多型的前提是什么?
一種事物在不同時刻表現出來的狀態就是多型
多型的前提:
- 需要有繼承
- 需要有方法重寫(其實沒有也是可以的,但是沒有意義),不同狀態的表現就是就是靠方法重寫體現的
- 需要有父類的參考指向子類物件:Fu f = new 子類()
6.9 多型中成員(成員變數,成員方法,靜態成員方法)的訪問特點是什么?
-
訪問成員變數
編譯看左邊 , 運行看左邊因為成員變數其實就是屬性,屬性就是只該事物的描述資訊,所以使用父類在訪問的時候,訪問的就是父類的成員變數
-
成員方法
編譯看左邊,運行看右邊這個是多型的本質,存在動態系結的機制
-
靜態成員方法
編譯看左邊,運行看左邊所以說靜態算不上重寫
6.10 多型的好處?
- 提供了代碼的維護性(通過繼承保證)
- 提供了代碼的擴展性(通過多型保證),這個特點也體現了多型的最常見的應用,作為引數傳遞.
6.11 多型的弊端是什么,如果我們想訪問子類的特有的功能我們應該怎么辦?
多型的弊端,不能訪問子類中特有的功能
如果我們還想使用子類中特有的功能,我們需要使用向下轉型
向下轉型: 就是將父類的參考強制轉換成子類的參考,在向下轉型的程序中需要注意一個例外: ClassCastException
7. Java 容器
7.1 陣列有幾種創建的方式?分別是什么?
2種,動態創建和靜態創建,
7.2 請簡述集合和陣列的異同點?
集合:
- 可以存盤不同型別的元素(通常使用存盤一種型別元素)
- 集合的長度可以改變
陣列:
- 必須存盤相同一型別的元素
- 陣列的長度固定
7.3 迭代器Iterator是什么?怎么使用?有什么特點?
Iterator 介面提供遍歷任何 Collection 的介面,我們可以從一個 Collection 中使用迭代器方法來獲取迭代器實體,迭代器取代了 Java 集合框架中的 Enumeration,迭代器允許呼叫者在迭代程序中移除元素,
Iterator 使用代碼如下:
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()){
String obj = it.next();
System.out.println(obj);
}
Iterator的特點是更加安全,因為它可以確保,在當前遍歷的集合元素被更改的時候,就會拋出 ConcurrentModificationException 例外,
7.4 請簡述常見的資料結構有哪些?
- 線性表
- 鏈表
- 堆疊
- 佇列
- 樹
- 哈希表
7.5 請簡述ArrayList、Vector、LinkedList三者的特點?
ArrayList
底層陣列結構
- 特點
- 執行緒不同步
- 效率高
- 元素查找快
- 增刪慢;
Vector
底層陣列結構
- 特點
- 執行緒同步
- 安全
- 元素查找快
- 增刪慢
LinkedList
底層鏈表結構
- 特點
- 執行緒不同步
- 效率高
- 元素增刪快
- 查找慢
7.6 請簡述ArrayList、Vector、LinkedList,分別在什么時候使用?
執行緒安全
Vector
非執行緒安全
- 查找多
ArrayList - 增刪多
LinkedList
7.7 請簡述并發修改例外產生的原因?如何解決?
例外
ConcurrentModificationException
在迭代器迭代的程序中,集合中的元素個數發生了改變,此時導致并發修改例外,
解決方式
- 通過串列迭代器自帶的方法完成元素增刪操作,
- 通過for回圈遍歷集合,使用集合中的方法完成元素增刪操作,
7.8 請簡述List<? extends T>和List<? super T>之間有什么區別?
- List<? extends T>
向下限制
? extends T : 代表接收的泛型型別為T型別或T子型別別 - List<? super T>
向上限制
? super T :代表接收的泛型型別為T型別或T父型別別
7.9 請簡述Set集合的特點?
- 不能存盤重復元素;
- 元素是按照某種排序規則存盤的
7.10 請簡述HashSet是如何保證元素唯一性的?
HashSet集合中存盤的元素,通過重寫hashCode() 與 equals()方法來保證元素唯一性
7.11 請簡述TreeSet是如何保證元素唯一性與排序的?
- 實作自然排序介面 Comparable,重寫 compareTo(T t)方法
- 實作比較器排序介面 Comparator,重寫 compare(T t1, T t2)方法
7.12 請說明Map介面和Collection介面的區別
Map介面是雙列集合頂層介面,每個位置存盤一對元素(key, value)
Collection介面是單列集合頂層介面,每個位置存盤一個元素
7.13 請說出Map集合的遍歷方式
- 鍵找值
- 鍵值對物件,找鍵,找值
7.14 請說明HashMap和Hashtable的區別
- HashMap
- 執行緒不同步
- 效率高
- 可以存盤null鍵null值
- Hashtable
- 執行緒同步
- 資料安全
- 不可以存盤null鍵null值
7.15 請解釋Collection與Collections的區別
- Collection
單列集合的頂層介面,包含集合中常用的方法, - Collections
集合工具類,包含獲取集合最大元素值、集合排序等方法,
7.16 Java 容器都有哪些?
Java 容器分為 Collection 和 Map 兩大類,其下又有很多子類,如下所示:
- Collection
- List
- ArrayList
- LinkedList
- Vector
- Stack
- Set
- HashSet
- LinkedHashSet
- TreeSet
- Map
- HashMap
- LinkedHashMap
- TreeMap
- ConcurrentHashMap
- Hashtable
7.17 List、Set、Map 之間的區別是什么?
List、Set、Map 的區別主要體現在兩個方面:元素是否有序、是否允許元素重復,
三者之間的區別,如下表:

7.18 如何決定使用 HashMap 還是 TreeMap?
對于在 Map 中插入、洗掉、定位一個元素這類操作,HashMap 是最好的選擇,因為相對而言 HashMap 的插入會更快,但如果你要對一個 key 集合進行有序的遍歷,那 TreeMap 是更好的選擇,
7.19 說一下 HashMap 的實作原理?
HashMap 基于 Hash 演算法實作的,我們通過 put(key,value)存盤,get(key)來獲取,當傳入 key 時,HashMap 會根據 key. hashCode() 計算出 hash 值,根據 hash 值將 value 保存在 bucket 里,當計算出的 hash 值相同時,我們稱之為 hash 沖突,HashMap 的做法是用鏈表和紅黑樹存盤相同 hash 值的 value,當 hash 沖突的個數比較少時,使用鏈表否則使用紅黑樹,
7.20 說一下 HashSet 的實作原理?
HashSet 是基于 HashMap 實作的,HashSet 底層使用 HashMap 來保存所有元素,因此 HashSet 的實作比較簡單,相關 HashSet 的操作,基本上都是直接呼叫底層 HashMap 的相關方法來完成,HashSet 不允許重復的值,
7.21 如何實作陣列和 List 之間的轉換?
-
陣列轉 List
使用 Arrays.asList(array) 進行轉換, -
List 轉陣列
使用 List 自帶的 toArray() 方法, -
代碼示例:
// list to array List<String> list = new ArrayList<String>(); list.add("這個"); list.add("小程式"); list.add("很贊"); list.toArray(); // array to list String[] array = new String[]{"這個","小程式","很贊"}; Arrays.asList(array);
7.22 Array 和 ArrayList 有何區別?
- Array 可以存盤基本資料型別和物件,ArrayList 只能存盤物件,
- Array 是指定固定大小的,而 ArrayList 大小是自動擴展的,
- Array 內置方法沒有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有,
7.23 在 Queue 中 poll()和 remove()有什么區別?
-
相同點:都是回傳第一個元素,并在佇列中洗掉回傳的物件,
-
不同點:如果沒有元素 poll()會回傳 null,而 remove()會直接拋出 NoSuchElementException 例外,
-
代碼示例:
Queue<String> queue = new LinkedList<String>(); queue.offer("string"); // add System.out.println(queue.poll()); System.out.println(queue.remove()); System.out.println(queue.size());
7.24 Iterator 和 ListIterator 有什么區別?
- Iterator 可以遍歷 Set 和 List 集合,而 ListIterator 只能遍歷 List,
- Iterator 只能單向遍歷,而 ListIterator 可以雙向遍歷(向前/后遍歷),
- ListIterator 從 Iterator 介面繼承,然后添加了一些額外的功能,比如添加一個元素、替換一個元素、獲取前面或后面元素的索引位置,
7.25 怎么確保一個集合不能被修改?
可以使用 Collections.unmodifiableCollection(Collection c) 方法來創建一個只讀集合,這樣改變集合的任何操作都會拋出 Java. lang. UnsupportedOperationException 例外,
示例代碼如下:
List<String> list = new ArrayList<>();
list. add("x");
Collection<String> clist = Collections.unmodifiableCollection(list);
clist.add("y"); // 運行時此行報錯
System.out.println(list.size());
8. Java 例外
8.1 請說說什么是例外?例外的分類?
-
什么是例外?
Java例外是java提供的用于處理程式中錯誤的一種機制,
所謂錯誤是指在程式運行的程序中發生的一些例外事件(如:除0錯誤,陣列下標越界,所要讀取的檔案不存在),設計良好地程式應該在程式例外發生時提供處理這些錯誤的方法,使得程式不會因為例外的發送而阻斷或產生不可預見的結果,Java程式的執行程序中如出現例外事件,可以生成一個例外類物件,該例外物件封裝了例外事件的資訊,并將被提交給java運行時系統,這個程序稱為拋出例外,
當java運行時系統接收到例外物件時,會尋找能處理這一例外的代碼并把當前例外物件交其處理,這一程序稱為捕獲例外,
-
例外的分類
- Exception
所有例外類的父類,其子類對應了各種各樣的可能出現的例外事件,一般需要用戶顯示的宣告或捕獲, - Error
稱為錯誤,由java虛擬機生成并拋出,包括動態鏈接失敗,虛擬機錯誤等,程式對其不做處理, - Runtime Exception
一類特殊的例外,如被0除、陣列下標超范圍等,其產生比較頻繁,處理麻煩,如果顯示的宣告或捕獲將會對程式可讀性和運行效率影響很大,因此由系統自動檢測并將它們交給預設的例外處理程式(用戶可不必對其處理),
- Exception
8.2 請說出例外處理的方式?
-
捕獲例外
try{ }catch(XxxException e){ }finally{ } -
拋出例外
throw \ throws() -
例外五個關鍵字
- try
try{…}陳述句制定了一段代碼,這段代碼就是一次捕獲并處理例外的范圍,在執行程序中,這段代碼可能會產生并拋出一種或幾種型別的例外物件,它后面的catch陳述句要分別對這些例外做相應的處理,如果沒有例外發生,所有的catch代碼段都被略過不執行, - catch
在catch陳述句塊中是對例外進行處理的代碼,每個try陳述句塊可以伴隨一個或多個catch陳述句,用于處理可能產生的不同型別的例外物件,在catch中宣告的例外物件(catch(XxxException e))封裝了例外事件發生的資訊,在catch陳述句塊中可以使用這個物件的一些方法獲取這些資訊, - finally
finally陳述句為例外處理提供一個統一的出口,使得在控制流程轉到程式的其他部分以前,能夠對程式的狀態做統一的管理,無論try所指定的程式塊中是否拋出例外,finally所指定的代碼都要執行,通常在finally陳述句中可以進行資源的清除作業, - throw
throws關鍵字通常被應用在宣告方法時,用來指定可能拋出的例外,多個例外可以使用逗號隔開,當在主函式中呼叫該方法時,如果發生例外,就會將例外拋給指定例外物件, - throws
throw關鍵字通常用在方法體中,并且拋出一個例外物件,程式在執行到throw陳述句時立即停止,它后面的陳述句都不執行,通常throw拋出例外后,如果想在上一級代碼中捕獲并處理例外,則需要在拋出例外的方法中使用throws關鍵字在方法宣告中指定要拋出的例外;如果要捕獲throw拋出的例外,則必須使用try{}catch{}陳述句,
- try
8.3 請說說編譯期例外和運行期例外的區別?
- 編譯時例外
程式正確,但因為外在的環境條件不滿足引發,對商用軟體系統,程式開發者必須考慮并處理這類例外,Java編譯器強制要求處理這類例外,如果不捕獲這類例外,程式將不能被編譯, - 運行期例外
這意味著程式存在bug,如陣列越界,0被除,傳入引數不滿足規則等,這類例外需要更改程式來避免,java編譯器強制要求處理這類例外, - 錯誤
一般很少見,也很難通程序式解決,它可能源于程式的bug,但一般更可能源于環境問題,如記憶體耗盡,錯誤在程式中無須處理,而由運行環境處理,
8.4 請說說throws與throw的區別?
- throws
通常被應用在宣告方法時,用來指定可能拋出的例外,多個例外可以使用逗號隔開,當在主函式中呼叫該方法時,如果發生例外,就會將例外拋給指定例外物件, - throw
通常用在方法體中,并且拋出一個例外物件,程式在執行到throw陳述句時立即停止,它后面的陳述句都不執行,通常throw拋出例外后,如果想在上一級代碼中捕獲并處理例外,則需要在拋出例外的方法中使用throws關鍵字在方法宣告中指定要拋出的例外;如果要捕獲throw拋出的例外,則必須使用try{}catch{}陳述句,
8.5 請說說final、finally與finalize的區別?
- final
用于宣告屬性,方法和類,分別表示屬性不可變,方法不可覆寫,類不可繼承,內部類要訪問區域變數,區域變數必須定義成final型別, - finally
是例外處理陳述句結構的一部分,表示總是執行, - finalize
是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆寫此方法提高垃圾收集時的其他資源回收,例如關閉檔案等,JVM不保證此方法總被呼叫,
8.6 請說說例外的注意事項及如何使用例外處理?
- 子類重寫父類方法時,子類的方法必須拋出相同的例外或父類例外的子類,
- 如果父類拋出了多個例外,子類重寫父類時,只能拋出相同的例外或者是他的子集,子類不能拋出父類沒有的例外,
- 如果被重寫的方法沒有例外拋出,那么子類的方法絕對不可以拋出例外,如果子類方法內有例外發生,那么子類只能try…catch,不能throws
8.7 請說出最常見到的RuntimeException例外
- NullPointerException
空指標參考例外 - ClassCastException
型別強制轉換例外 - IllegalArgumentException
傳遞非法引數例外 - ArithmeticException
算術運算例外 - ArrayStoreException
向陣列中存放與宣告型別不兼容物件例外 - IndexOutOfBoundsException
下標越界例外 - NumberFormatException
數字格式例外
8.8 請簡述IO流的分類
- 位元組流
- 位元組輸入流 InputStream
- 位元組輸出流 OutputStream
- 字符流
- 字符輸入流 Reader
- 字符輸出流 Writer
9. Java IO
9.1 請簡述字符編碼是什么?請說出常見字符編碼表?
- 字符編碼是什么?
字符編碼(英語:Character encoding)也稱字集碼,是把字符集中的字符編碼為指定集合中某一物件,以便文本在計算機中存盤和通過通信網路的傳遞,常見的例子包括將拉丁字母表編碼成摩斯電碼和ASCII,其中,ASCII將字母、數字和其他符號編號,并用7位元的二進制來表示這個整數,通常會額外使用一個擴充的位元,以便以1個位元組的方式存盤, - 常見的字符編碼表如下
- ASCII
- GB2312
是一個簡體中文字符集,由6763個常用漢字和682個全角的非漢字字符組成, - GBK
GBK編碼標準兼容GB2312,共收錄漢字21003個、符號883個,并提供1894個造字碼位,簡、繁體字融于一庫 - GB18030
是在GBK基礎上增加了一部分漢字
Big5:在臺灣、香港與澳門地區,使用的是繁體中文字符集 - Unicode
將世界上所有的符號都納入其中,無論是英文、日文、還是中文等,大家都使用這個編碼表,這樣就利于同一的管理,在這個編碼表中每一個字符占兩個位元組 - UTF-8
為了提高Unicode的編碼效率,于是就出現了UTF-8編碼,UTF-8可以根據不同的符號自動選擇編碼的長短,比如英文字母可以只用1個位元組就夠了,
9.2 請說出學習過的IO流中的常用方法?
- 位元組輸入流 InputStream
- read()
讀取一個位元組 - read(byte[])
讀取一個位元組陣列
- read()
- 位元組輸出流
- write(int)
寫入一個位元組 - write(byte[])
寫入一個位元組陣列
- write(int)
- 字符輸入流
- read()
讀取一個字符 - read(char[])
讀取一個字符陣列
- read()
- 字符緩沖輸入流
- readLine()
讀取一行字串
- readLine()
- 字符輸出流
- write(int)
寫入一個字符 - write(char[])
寫入一個字符陣列 - write(String)
寫入一個字串
- write(int)
- 字符緩沖輸出流
- newLine()
寫入一個換行符
- newLine()
9.3 請說出轉換流OutputStreamWriter與InputStreamReader 的作用?
- OutputStreamWriter
使用編碼表對位元組流的資料進行編碼 - InputStreamReader
使用編碼表對位元組流中的資料進行解碼
9.4 請簡述列印流(PrintStream、PrintWriter)的特點?
- PrintStream的特點
在OutputStream基礎之上提供了增強的功能,即可以方便地輸出各種型別的資料(而不僅限于byte型別)的格式化表示形式,PrintStream的方法從不拋出IOException - PrintWriter的特點
提供了PrintStream的所有列印方法,其方法也從不拋出IOException, - 區別
作為處理流使用時,PrintStream只能封裝OutputStream型別的位元組流,而PrintWriter既可以封裝OutputStream型別的位元組流,還能夠封裝Writer型別的字符輸出流并增強其功能,
9.5 BIO、NIO、AIO 有什么區別?
- BIO
Block IO 同步阻塞式 IO,就是我們平常使用的傳統 IO,它的特點是模式簡單使用方便,并發處理能力低, - NIO
New IO 同步非阻塞 IO,是傳統 IO 的升級,客戶端和服務器端通過 Channel(通道)通訊,實作了多路復用, - AIO
Asynchronous IO 是 NIO 的升級,也叫 NIO2,實作了異步非堵塞 IO ,異步 IO 的操作基于事件和回呼機制,
9.6 Files的常用方法都有哪些?
- Files.exists():檢測檔案路徑是否存在,
- Files.createFile():創建檔案,
- Files.createDirectory():創建檔案夾,
- Files.delete():洗掉一個檔案或目錄,
- Files.copy():復制檔案,
- Files.move():移動檔案,
- Files.size():查看檔案個數,
- Files.read():讀取檔案,
- Files.write():寫入檔案,
感謝您的點贊、評論、關注;
您還可以掃碼關注“公眾號”獲取粉絲福利,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254667.html
標籤:Java
