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. 請寫出以下識別符號的命名規則
答案:包:全部小寫
單層包:小寫,舉例:itcast,com
多層包:小寫,并用 . 隔開,舉例:cn.itcast, com.baidu
類或者介面:
一個單詞:首字母大寫,舉例:Student,Demo
多個單詞:每個單詞首字母大寫,舉例:HelloWorld,StudentName
方法或者變數:
一個單詞:首字母小寫,舉例:name,main
多個單詞:從第二個單詞開始,每個單詞首字母大寫,舉例:studentAge,showStudentNames()
常量:全部大寫
一個單詞:大寫,舉例:PI
多個單詞:大寫,并用 _ 隔開,舉例:STUDENT_MAX_AGE
1.8. 請解釋Java語言的跨平臺特性?
答案:Java語言是跨平臺運行的,其實就是不同的作業系統,使用不同的JVM映射規則,讓其與作業系統無關,完成了跨平臺性,JVM對上層的Java源檔案是不關心的,它關注的只是由源檔案生成的類檔案(class file),
1.9. 請說明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的一部分,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實作的,
1.10. 注釋的分類及作用?
答案:單行注釋、多行注釋、檔案注釋
單行注釋:注釋單行代碼或為單行代碼添加描述的時候使用
多行注釋:注釋多行代碼或為代碼添加多行描述的時候使用
檔案注釋:生產java幫助檔案的時候使用,開發中常用來描述類、描述方法
1.11. 請說出Java中資料型別的分類?基本資料型別都有哪些?
答案:
基本資料型別
byte、short、int、long、float、double、char、boolean
參考資料型別
陣列、類、介面
1.12. 變數是什么?
答案:變數,在程式運行時,值可以被修改的量,
1.13. 變數的定義格式是什么?
答案:資料型別 變數名 = 變數值 ;
1.14. Java中資料的型別轉換有幾種?分別是什么?
答案:強制型別轉換:容量大的型別向容量小的型別轉換時使用
隱式型別轉換:容器小的型別向容量大的型別轉換時使用
1.15. Java語言中的字符char可以存盤一個中文漢字嗎?為什么呢?
答案:char型變數是用來存盤Unicode編碼的字符的,unicode編碼字符集中包含了漢字,所以,char型變數中可以存盤漢字,不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那么,這個char型變數中就不能存盤這個特殊漢字,補充說明:unicode編碼占用兩個位元組,所以,char型別的變數也是占用兩個位元組,
1.16. 請說明 && 和 & 的區別?
答案:&和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的運算式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false,
&&還具有短路的功能,即如果第一個運算式為false,則不再計算第二個運算式
&還可以用作位運算子,當&運算子兩邊的運算式不是boolean型別時,&表示按位與操作,
1.17. 請說明 == 與 = 的區別?
答案:==: 比較運算子,用來比較運算子兩邊的變數的值是否相等,
= : 賦值運算子,把運算子右邊的值,賦值給左邊的變數
1.18. 三元運算子的基本格式是什么?
答案: 三元運算子的格式是: 條件運算式 ? 運算式1 : 運算式2 ;
1.19. 三元運算子的執行流程是什么?
答案: 三元運算子的執行流程: 首先計算條件運算式的值看其回傳結果是true還是false,如果是true就執行運算式1,如果是false就執行運算式2
1.20. 使用鍵盤錄入資料的三個步驟是什么?
答案: 第一步導包:格式: import java.util.Scanner ;位置: 在class上邊
第二步創建Scanner物件,格式: Scanner sc = new Scanner(System.in) ;
第三步獲取鍵盤錄入資料:格式: int x = sc.nextInt() ;
1.21. 請說明for、while、do…while三種回圈的格式以及執行流程,以及它們的區別,
答案:for回圈陳述句格式:
for(初始化陳述句;判斷條件陳述句;控制條件陳述句) {
回圈體陳述句;
}
執行流程:
a) 執行初始化陳述句
b) 執行判斷條件陳述句,看其結果是true還是false,如果是false,回圈結束;如果是true,繼續執行,
c) 執行回圈體陳述句
d) 執行控制條件陳述句
e) 回到b繼續
while回圈陳述句格式:
while(判斷條件陳述句) {
回圈體陳述句;
}
執行流程:
a) 執行判斷條件陳述句,看其結果是true還是false
如果是false,回圈結束,
如果是true,繼續執行,
b) 執行回圈體陳述句
c) 回到a繼續
do…while回圈陳述句格式:
do {
回圈體陳述句;
}while((判斷條件陳述句);
執行流程:
a) 執行回圈體陳述句
b) 執行判斷條件陳述句,看其結果是true還是false,如果是false,回圈結束;如果是true,繼續執行,
c) 回到a繼續
三種回圈陳述句的區別:
a) do…while回圈至少會執行一次回圈體
b) for回圈和while回圈只有在條件成立的時候才會去執行回圈體
注意:寫程式優先考慮for回圈,再考慮while回圈,最后考慮do…while回圈
1.22. 定義一個方法的格式是什么,以及方法的注意事項?
答案:修飾符 回傳值型別 方法名(引數型別 引數名1, 引數型別 引數名2 ….){
方法體 ;
return 回傳值 ;
}
注意事項:
A: 方法不呼叫不執行
B: 方法與方法是平級關系,不能嵌套定義
C: 方法定義的時候引數之間用逗號隔開
D: 方法呼叫的時候不用在傳遞資料型別
E: 如果方法有明確的回傳值,一定要有return帶回一個值
1.23. 請解釋什么是方法的多載?
答案:方法多載指在同一個類中,允許存在一個以上的同名方法,只要它們的引數個數或者引數型別不同即可,
方法多載特點:
a) 與回傳值型別無關,只看方法名和引數串列
b) 在呼叫時,虛擬機通過引數串列的不同來區分同名方法
1.24. 陣列有幾種創建的方式?分別是什么?
答案:2種,動態創建和靜態創建,
2. 面向物件
2.1. 類是什么? 物件是什么?舉例說明
答案:類是一組相關屬性和行為的集合是一個抽象的東西,物件則是該類的一個具體的體現,
舉例: 學生就是一個類,然后每一個學生都是學生的一個個具體的體現,所以每一個學生就是一個學生,
2.2. 類由哪些內容組成?
答案:類由成員變數和成員方法組成
成員變數對應的就是事物的屬性(就是事物固有的資訊,比如: 人的屬性有身高 , 姓名 , 年齡 , 學歷…) , 成員方法對應的是行為(行為: 就是該事物可以做的事情,比如:人的行為有: 吃飯,睡覺…)
2.3. 成員變數與區域變數的區別?
答案:
A:在類中的位置不同
成員變數:在類中方法外
區域變數:在方法定義中或者方法宣告上
B:在記憶體中的位置不同
成員變數:在堆記憶體
區域變數:在堆疊記憶體
C:生命周期不同
成員變數:隨著物件的創建而存在,隨著物件的消失而消失
區域變數:隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失
D:初始化值不同
成員變數:有默認初始化值
區域變數:沒有默認初始化值,必須定義,賦值,然后才能使用,
2.4. 什么是匿名物件?什么時候使用匿名物件?
答案:匿名物件指:沒有起名字的物件
使用匿名物件:
a:呼叫方法,僅僅只呼叫一次的時候
b:匿名物件可以作為實際引數傳遞
2.5. 使用面向物件【封裝】的好處有哪些?
答案:隱藏實作細節,提供公共的訪問方式;
提高了代碼的復用性;
提高安全性,
2.6. private 關鍵字在哪里使用? 被 private 修飾的成員有什么特點?
答案:類中的成員需要私有的時候使用private關鍵字
特點:
是一個權限修飾符,
可以修飾成員(成員變數和成員方法)
被private修飾的成員只在本類中才能訪問
2.7. 為什么要有 this 關鍵字?this 關鍵字的含義?
答案:this用來解決成員變數與區域變數重名問題
this關鍵字代表的是本類物件參考;誰呼叫我,this就代表誰.
2.8. 構造方法的作用是什么?構造方法的特點是什么?構造方法的注意事項? 構造方法中可不可以寫return 陳述句呢?
答案:構造方法的作用是用于給類的成員變數賦值,完成類的初始化作業
構造方法的特點:
構造方法的名稱和類名相同
構造方法沒有回傳值型別,連void也沒有
構造方法沒有具體的回傳值
構造方法的注意事項:
a: 如果一個類沒有給出構造方法,系統將會提供一個默認無參的構造方法
b: 如果我們給出類構造方法,系統將不會提供默認無參的構造方法,這個時候如果我們還想使用無參的構造方法來創建物件,那么就需要我們給出無參的構造方法
可以寫空的return陳述句.
2.9. 一個類的預設構造方法可以有引數嗎?
答案: 一個類的預設構造方法沒有引數
2.10. 靜態變數與成員變數的區別?
答案:1:所屬不同
靜態變數屬于類,所以也稱為為類變數
成員變數屬于物件,所以也稱為實體變數(物件變數)
2:記憶體中位置不同
靜態變數存盤于方法區的靜態區
成員變數存盤于堆記憶體
3:記憶體出現時間不同
靜態變數隨著類的加載而加載,隨著類的消失而消失
成員變數隨著物件的創建而存在,隨著物件的消失而消失
4:呼叫不同
靜態變數可以通過類名呼叫,也可以通過物件呼叫
成員變數只能通過物件名呼叫
2.11. 請說明一個物件的創建程序做了哪些事情?
答案:Student s = new Student();
1:將Student.class 位元組碼檔案加載到記憶體
2: 在堆疊記憶體中,開辟一個空間存盤 s變數,用來記錄Student物件的參考
3: 在堆記憶體中,開辟一個空間存盤 new Student()物件的成員資訊
2:加載類中靜態成員
3:執行類中靜態代碼塊
4:加載物件中普通成員
5:執行構造代碼塊
6:執行構造方法
7:將new Student()的地址賦值給 s 變數
2.12. 繼承的好處是什么?
答案: A: 提高了代碼的維護型
B: 提供了代碼的復用性
C: 讓類與類之間產生了關系, 是多型的前提
2.13. Java 中的類的繼承特點是什么以及繼承的注意事項?
答案:繼承的特點: 在java語言中類的繼承只支持單繼承,不支持多繼承.但是可以多層繼承,
繼承的注意事項:
A: 子類只能繼承父類非私有的成員
B: 子類不能繼承父類的構造方法,但是可以通過super去訪問父類的構造方法
C: 不要為了某個功能去使用繼承
2.14. this 和 super 分別是什么,他們各自的應用場景是什么?
答案:this代表的是本類物件的參考 , 誰呼叫我這個方法,這個方法里邊的this就代表誰,一般的使用場景是,當區域變數隱藏了成員變數的時候,我們可以使用this去明確指定要訪問的是成員變數
super代表的是父類存盤空間的一個標志(可以理解為父類物件的參考),我們可以使用super來訪問父類的成員
2.15. 什么是方法重寫?需要注意哪些問題?
答案:方法重寫:指子類中出現了和父類中一模一樣的方法宣告,也被稱為方法覆寫,方法復寫
需要注意的問題:
父類中私有方法不能被重寫
子類重寫父類方法時,訪問權限不能更低
父類靜態方法,子類也必須通過靜態方法進行重寫,(其實這個算不上方法重寫,但是現象確實如此)
2.16. 方法重寫和多載有什么區別?
答案:多載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的引數串列各不相同(即引數個數或型別不同),與回傳值型別無關,
重寫Override是發生在子父類中的一個現象, 子類中出現了和父類中一模一樣的方法,與回傳值有關.
2.17. 子父類中構造方法的執行有什么特點?為什么要這樣?
答案:1、子類有所有的構造方法默認都會訪問父類中空引數的構造方法,
因為子類會繼承父類中的資料,可能還會使用父類的資料,所以,子類初始化之前,一定要先完成父類資料的初始化,每一個構造方法的第一條陳述句默認都是:super()
2、如果父類中沒有空引數的構造方法,通過下列方式解決
a) 子類通過super去顯示呼叫父類其他的帶參的構造方法
b) 子類通過this去呼叫本類的其他構造方法(本類其他構造也必須首先可以訪問了父類構造)
注意:super(…)或者this(…)必須出現在第一條陳述句上,否則,就會有父類資料的多次初始化
2.18. 靜態代碼塊,構造代碼塊,構造方法的執行順序是什么以及執行特點?
答案:A: 先執行所有的靜態代碼塊,再執行所有的構造代碼塊,最后執行構造方法
B: 靜態代碼塊只執行一次, 構造代碼塊和構造方法,每創建一次物件就執行一次
2.19. final 關鍵字是什么意思,可以修飾那些成員?被修飾的成員有哪些特點?
答案:final最終的意思,
final可以修飾類,成員變數,成員方法
final修飾類,此類不能被繼承,
final修飾變數,變數就成了常量,只能被賦值一次
final修飾方法,方法不能被重寫
2.20. 什么是多型,多型的前提是什么?
答案:一種事物在不同時刻表現出來的狀態就是多型
多型的前提:
a: 需要有繼承
b: 需要有方法重寫(其實沒有也是可以的,但是沒有意義),不同狀態的表現就是就是靠方法重寫體現的
c: 需要有父類的參考指向子類物件:Fu f = new 子類();
2.21. 多型中成員(成員變數,成員方法,靜態成員方法)的訪問特點是什么?
答案: 訪問成員變數: 編譯看左邊 , 運行看左邊 (因為成員變數其實就是屬性,屬性就是只該事物的描述資訊,所以使用父類在訪問的時候,訪問的就是父類的成員變數)
成員方法:編譯看左邊,運行看右邊(這個是多型的本質,存在動態系結的機制)
靜態成員方法: 編譯看左邊,運行看左邊 (所以說靜態算不上重寫)
2.22. 多型的好處?
答案: A:提供了代碼的維護性(通過繼承保證)
B:提供了代碼的擴展性(通過多型保證),這個特點也體現了多型的最常見的應用,作為引數傳遞.
2.23. 多型的弊端是什么,如果我們想訪問子類的特有的功能我們應該怎么辦?
答案: 多型的弊端,不能訪問子類中特有的功能
如果我們還想使用子類中特有的功能,我們需要使用向下轉型(向下轉型: 就是將父類的參考強制轉換成子類的參考,在向下轉型的程序中需要注意一個例外: ClassCastException)
2.24. 抽象類是什么,抽象類的特點?
答案:使用了關鍵字abstract宣告的類叫做“抽象類”,如果一個類里包含了一個或多個抽象方法,類就必須指定成abstract(抽象),“抽象方法”,屬于一種不完整的方法,只含有一個宣告,沒有方法主體,
抽象類的特點:
A: 抽象類的定義格式: abstract class 類名{}
抽象方法的定義格式: public abstract 回傳值型別 方法名();
B:抽象類中可以存在抽象方法,也可以存在非抽象方法
C:抽象類不能直接進行實體化,我們可以使用多型的形式進行進行間接實體化
D:抽象類的子類
可以是抽象類(沒有意思,如果子類還是抽象類,那么我們還是不能進行實體化,還需要一個子類去繼承),也可以是非抽象類(存在一個前提: 子類必須重寫父類的抽象方法)
2.25. 抽象類中有沒有構造方法,如果有它是用來做什么的?
答案: 抽象類雖然不能進行實體化,但是抽象類中是存在構造方法,該構造方法的作用是用于子類訪問父類資料是的初始化.
2.26. 介面中成員變數的特點,以及成員方法的特點?
答案:介面中的成員變數都是常量,存在默認的訪問修飾符:public static final
介面中的成員方法的特點: 都是抽象方法,存在默認的訪問修飾符: public abstract
2.27. 請說出類與類,類與介面,以及介面與介面的關系以及特點?
答案:類與類是繼承的關系,只支持單繼承,可以是多層繼承,
類與介面是實作的關系,可以是多實作
一個類可以繼承一個類的同時,還可以實作多個介面
介面與介面是繼承的關系,可以是單繼承也可以是多繼承
2.28. 抽象類和介面的區別?
答案:A:成員區別
抽象類:
成員變數:可以變數,也可以常量
構造方法:有
成員方法:可以抽象,也可以非抽象
介面:
成員變數:只可以常量
成員方法:只可以抽象
B:關系區別
類與類
繼承,單繼承
類與介面
實作,單實作,多實作
介面與介面
繼承,單繼承,多繼承
C:設計理念區別
抽象類 被繼承體現的是:”is a”的關系, 抽象類中定義的是該繼承體系的共性功能,
介面 被實作體現的是:”like a”的關系, 介面中定義的是該繼承體系的擴展功能,
2.29. 形式引數是基本型別要的是什么?是類名要的是什么?是抽象類名要的是什么?是介面名要的是什么?
答案: 形式引數是基本型別要的是一個基本型別的變數或者具體的常量值
是類名的時候要的是一個該類的物件
是抽象類名的時候的要的是一個繼承自該類的一個子類物件
是介面的時候要的是一個實作了該介面的子類物件
2.30. 回傳值型別是基本型別回傳的是什么?是類名回傳的是什么?是抽象類名回傳的是什么?是介面名回傳的是什么?
答案:回傳值是基本資料型別的時候回傳的是一個具體的值
是類名的時候,本質上回傳的是一個該類對應的子類物件
是抽象類名的時候回傳的應該是一個繼承自該類的子類物件
是介面名的時候回傳的是一個實作了該介面的子類物件
2.31. package它有什么作用?
答案:package,包的意思,其實就是檔案夾,它可以對類進行分類管理
2.32. import的作用?
答案:在不同包下的類之間相互訪問的時候,發現,每次使用不同包下的類的時候,都需要加包的全路徑,比較麻煩,這個時候,java就提供了( import )導包的功能,使用import可以將包中的類匯入進來,以后使用類的時候,不需導包,直接使用,簡化了書寫,
2.33. 內部類有哪些訪問特點?
答案:1. 內部類可以直接訪問外部類的成員,包括私有
2. 外部類要訪問內部類的成員,必須先創建內部類物件
2.34. 匿名內部類的格式是什么?其本質是什么?
答案: 匿名內部類的格式:
new 類名或者介面名() {
方法重寫 ;
} ;
本質: 匿名內部類本質是一個繼承了某一個類或者實作了某一個介面的子類物件
3. 常用API
3.1. 請解釋 ==與equals()方法的區別?
答案:== 號比較基本資料型別比較的是值,比較參考資料型別比較的是地址值
equals方法只能比較參考資料型別,默認比較的是地址值,如果我們想要建立自己的比較方式,我們就需要復寫equals方法
3.2. 下面這條陳述句一共創建了多少個物件:String s = “a”+“b”+”c”; 分別都是什么?
答案:5個物件,分別是 “a” , “b” , “c” , “ab” , “abc”,因為字串的特點是一旦被創建就不能被改變,所有在使用常量進行相加的時候,都是在創建新的字串物件,最后在把字串"abc"這個常量值賦值給參考變數s
3.3. 如何實作StringBuffer和String的相互轉換?
答案:StringBuffer 轉換到 String的方式:
- 通過String類的構造方法
- 通過StringBuffer類中的toString()方法
- 通過StringBuffer類中的substring()方法 (注:不常用)
String 轉換到 StringBuffer的方式: - 通過StringBuffer類的構造方法
- 通過StringBuffer類的append()、insert()方法
3.4. 如何實作String和int資料的相互轉換
答案:String 轉換到 int的方式:
- String – Integer – int通過Integer類的intValue()方法
- 通過Integer類的parseInt(String s)方法
Int 轉換到 String的方式: - Int – Integer – String Integer的toSting()
- 通過String類的valueOf()方法
- 通過Integer類的toSting(int i)方法
- 通過與字串""相連接
3.5. 如何實作 基本資料型別 與 基本資料封裝類 之間的相互轉換
答案:基本資料型別 轉換到 包裝類的方式:
- 通過包裝類的構造方法
- 通過包裝類的靜態方法valueOf()
包裝類 轉換到 基本資料型別的方式: - 通過包裝類的方法xxxValue()
3.6. 請說明String與StringBuffer二者之間的區別?
答案:Java平臺提供了兩個類:String和StringBuffer,他們可以存盤和操作字串,即包含多個字符的字符資料,String類表示內容不可以改變的字串;而StringBuffer類表示內容可以被修改的字串,
3.7. 請說明StringBuffer與StringBilder二者之間的區別?
答案:StringBuffer和StringBuilder類都表示內容可以被修改的字串,StringBilder是執行緒不安全的,運行效率高,如果一個字串變數是在方法里面定義,這種情況只可能有一個執行緒訪問它,不存在不安全的因素了,則用StringBuilder,如果要在類里面定義成員變數,并且這個類的實體物件會在多執行緒環境下使用,那么最好用StringBuffer,
3.8. 什么是正則運算式?
答案:正則運算式使用單個字串來描述、匹配一系列符合某個句法規則的字串,在很多文本編輯器里,正則達表示通常被用來檢索、替換那些符合某個模式的文本,
3.9. 如何實作Date與long相互轉換?
答案:Date 轉換到 long 的方式:通過Date類的getTime()方法
long 轉換到 Date的方式:通過Date類的構造方法
3.10. 如何實作Date與String相互轉換?
答案:Date 轉換到 String的方式:
1.Date類的toString()方法
2.DateFormat類的format()方法
String 轉換到 Date的方式:
1.Date類的構造方法(已過時,被DateFormat類的parse(String s)方法取代)
2.DateFormat類的parse()方法
4. 集合框架
4.1. 請簡述集合和陣列的異同點?
答案:集合:
可以存盤不同型別的元素(通常使用存盤一種型別元素)
集合的長度可以改變
陣列:
必須存盤相同一型別的元素
陣列的長度固定
4.2. 請簡述迭代器是一個什么玩意?
答案:迭代器就是對容器中的元素進行遍歷,每次取出一個元素,然后對元素進行操作,
4.3. 請簡述常見的資料結構有哪些?
答案:線性表、鏈表、堆疊、佇列、樹、哈希表
4.4. 請簡述ArrayList、Vector、LinkedList三者的特點?
答案:ArrayList:底層陣列結構;執行緒不同步,效率高;元素查找快、增刪慢;
Vector:底層陣列結構;執行緒同步,安全;元素查找快、增刪慢;
LinkedList:底層鏈表結構,執行緒不同步,效率高;元素增刪快、查找慢
4.5. 請簡述ArrayList、Vector、LinkedList,分別在什么時候使用?
答案:程式是否要考慮執行緒安全?
是: Vector
否: 查找操作多還是增刪操作多?
查找多:ArrayList
增刪多:LinkedList
4.6. 請簡述并發修改例外產生的原因?如何解決?
答案:ConcurrentModificationException并發修改例外,在迭代器迭代的程序中,集合中的元素個數發生了改變,此時導致并發修改例外,
解決方式:
- 通過串列迭代器自帶的方法完成元素增刪操作,
- 通過for回圈遍歷集合,使用集合中的方法完成元素增刪操作,
4.7. 請簡述泛型是什么?有什么用?在哪里用?
答案:泛型是一種特殊的型別,它把指定型別的作業推遲到客戶端代碼宣告并實體化類或方法的使用進行,也被稱為引數化型別,可以把型別當做引數一樣傳遞過來,在傳遞過來之前我不明確,但是在使用的時候就就明確了,
泛型的好處:
1.提高了程式的安全性
2.將運行期遇到的問題轉移到了編譯期
3.省去了型別強轉的麻煩
泛型的常見應用:
1.泛型類
2.泛型方法
3.泛型介面
4.8. 請簡述List<? extends T>和List<? super T>之間有什么區別?
答案:List<? extends T> :向下限制
List<? super T> :向上限制
? extends T : 代表接收的泛型型別為T型別或T子型別別
? super T :代表接收的泛型型別為T型別或T父型別別
4.9. 如何撰寫一個泛型方法,讓它能夠接受泛型引數并回傳泛型型別?并舉例
答案:泛型方法,指把泛型定義在方法上,使用泛型型別來替代原始型別
public static T[] sort(T[] t){
Arrays.sort(t);
return t;
}
4.10. 請簡述Java中如何使用泛型撰寫帶有引數的類?并舉例
答案:泛型類,指把泛型定義在類上,使用泛型型別來替代原始型別
class GenericClass {
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
4.11. 請簡述Set集合的特點?
答案:Set集合中不能存盤重復元素;
Set集合中的元素是按照某種排序規則存盤的
4.12. 請簡述HashSet是如何保證元素唯一性的?
答案:HashSet集合中存盤的元素,通過重寫hashCode() 與 equals()方法來保證元素唯一性
4.13. 請簡述TreeSet是如何保證元素唯一性與排序的?
答案:TreeSet集合中保證元素唯一性與排序有兩種方式:
方式1:實作自然排序介面 Comparable,重寫 compareTo(T t)方法
方式2:實作比較器排序介面 Comparator,重寫 compare(T t1, T t2)方法
4.14. 請說明Map介面和Collection介面的區別
答案:Map介面是雙列集合頂層介面,每個位置存盤一對元素(key, value)
Collection介面是單列集合頂層介面,每個位置存盤一個元素
4.15. 請說出Map集合的遍歷方式
答案:Map集合遍歷方式有兩種:
方式一: 鍵找值
方式二: 鍵值對物件,找鍵,找值
4.16. 請說明HashMap和Hashtable的區別
答案:HashMap:執行緒不同步,效率高;可以存盤null鍵null值
Hashtable:執行緒同步,資料安全;不可以存盤null鍵null值
4.17. 請解釋Collection與Collections的區別
答案:Collection:單列集合的頂層介面,包含集合中常用的方法,
Collections:集合工具類,包含獲取集合最大元素值、集合排序等方法,
5. IO流
5.1. 請說說什么是例外?例外的分類?
答案:Java例外是java提供的用于處理程式中錯誤的一種機制,
所謂錯誤是指在程式運行的程序中發生的一些例外事件(如:除0錯誤,陣列下標越界,所要讀取的檔案不存在),設計良好地程式應該在程式例外發生時提供處理這些錯誤的方法,使得程式不會因為例外的發送而阻斷或產生不可預見的結果,
Java程式的執行程序中如出現例外事件,可以生成一個例外類物件,該例外物件封裝了例外事件的資訊,并將被提交給java運行時系統,這個程序稱為拋出例外,
當java運行時系統接收到例外物件時,會尋找能處理這一例外的代碼并把當前例外物件交其處理,這一程序稱為捕獲例外,
例外的分類:
Error:稱為錯誤,由java虛擬機生成并拋出,包括動態鏈接失敗,虛擬機錯誤等,程式對其不做處理,
Exception:所有例外類的父類,其子類對應了各種各樣的可能出現的例外事件,一般需要用戶顯示的宣告或捕獲,
Runtime Exception:一類特殊的例外,如被0除、陣列下標超范圍等,其產生比較頻繁,處理麻煩,如果顯示的宣告或捕獲將會對程式可讀性和運行效率影響很大,因此由系統自動檢測并將它們交給預設的例外處理程式(用戶可不必對其處理),
5.2. 請說出例外處理的兩種方式?
答案:捕獲例外: try…catch…finally
拋出例外:throw \ throws()
其實體外部分主要講的就是五個關鍵字:try、catch、finally、throw、throws
try陳述句:
try{…}陳述句制定了一段代碼,這段代碼就是一次捕獲并處理例外的范圍,在執行程序中,這段代碼可能會產生并拋出一種或幾種型別的例外物件,它后面的catch陳述句要分別對這些例外做相應的處理,如果沒有例外發生,所有的catch代碼段都被略過不執行,
catch陳述句
在catch陳述句塊中是對例外進行處理的代碼,每個try陳述句塊可以伴隨一個或多個catch陳述句,用于處理可能產生的不同型別的例外物件,在catch中宣告的例外物件(catch(XxxException e))封裝了例外事件發生的資訊,在catch陳述句塊中可以使用這個物件的一些方法獲取這些資訊,
finally陳述句:
finally陳述句為例外處理提供一個統一的出口,使得在控制流程轉到程式的其他部分以前,能夠對程式的狀態做統一的管理,無論try所指定的程式塊中是否拋出例外,finally所指定的代碼都要執行,通常在finally陳述句中可以進行資源的清除作業,
throws關鍵字通常被應用在宣告方法時,用來指定可能拋出的例外,多個例外可以使用逗號隔開,當在主函式中呼叫該方法時,如果發生例外,就會將例外拋給指定例外物件,
throw關鍵字通常用在方法體中,并且拋出一個例外物件,程式在執行到throw陳述句時立即停止,它后面的陳述句都不執行,通常throw拋出例外后,如果想在上一級代碼中捕獲并處理例外,則需要在拋出例外的方法中使用throws關鍵字在方法宣告中指定要拋出的例外;如果要捕獲throw拋出的例外,則必須使用try{}catch{}陳述句,
5.3. 請說說編譯期例外和運行期例外的區別?
答案:編譯時例外:程式正確,但因為外在的環境條件不滿足引發,對商用軟體系統,程式開發者必須考慮并處理這類例外,Java編譯器強制要求處理這類例外,如果不捕獲這類例外,程式將不能被編譯,
運行期例外:這意味著程式存在bug,如陣列越界,0被除,傳入引數不滿足規則等,這類例外需要更改程式來避免,java編譯器強制要求處理這類例外,
錯誤:一般很少見,也很難通程序式解決,它可能源于程式的bug,但一般更可能源于環境問題,如記憶體耗盡,錯誤在程式中無須處理,而由運行環境處理,
5.4. 請說說throws與throw的區別?
答案:throws關鍵字通常被應用在宣告方法時,用來指定可能拋出的例外,多個例外可以使用逗號隔開,當在主函式中呼叫該方法時,如果發生例外,就會將例外拋給指定例外物件,
throw關鍵字通常用在方法體中,并且拋出一個例外物件,程式在執行到throw陳述句時立即停止,它后面的陳述句都不執行,通常throw拋出例外后,如果想在上一級代碼中捕獲并處理例外,則需要在拋出例外的方法中使用throws關鍵字在方法宣告中指定要拋出的例外;如果要捕獲throw拋出的例外,則必須使用try{}catch{}陳述句,
5.5. 請說說final、finally與finalize的區別?
答案:final用于宣告屬性,方法和類,分別表示屬性不可變,方法不可覆寫,類不可繼承,內部類要訪問區域變數,區域變數必須定義成final型別,
finally是例外處理陳述句結構的一部分,表示總是執行,
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆寫此方法提高垃圾收集時的其他資源回收,例如關閉檔案等,JVM不保證此方法總被呼叫,
5.6. 請說說例外的注意事項及如何使用例外處理?
答案:1. 子類重寫父類方法時,子類的方法必須拋出相同的例外或父類例外的子類,
2. 如果父類拋出了多個例外,子類重寫父類時,只能拋出相同的例外或者是他的子集,子類不能拋出父類沒有的例外,
3. 如果被重寫的方法沒有例外拋出,那么子類的方法絕對不可以拋出例外,如果子類方法內有例外發生,那么子類只能try…catch,不能throws
5.7. 請說說檔案名稱過濾器FilenameFilter的作用?
答案:FilenameFilter是檔案名過濾器,用來過濾不符合規則的檔案名,并回傳合格的檔案,
5.8. 請說出最常見到的RuntimeException例外,
答案:
NullPointerException - 空指標參考例外
ClassCastException - 型別強制轉換例外
IllegalArgumentException - 傳遞非法引數例外
ArithmeticException - 算術運算例外
ArrayStoreException - 向陣列中存放與宣告型別不兼容物件例外
IndexOutOfBoundsException - 下標越界例外
NumberFormatException - 數字格式例外
5.9. 請簡述遞回是什么?注意事項是什么?
答案:所謂遞回,是指程式呼叫自身,注意,遞回不會無休止地呼叫下去,它必然有一個出口,當滿足條件時程式也就結束了,不然的話,那就是死回圈了,
5.10. 請簡述IO流的分類
答案:IO流
|- 位元組流
|-位元組輸入流 InputStream
|-位元組輸出流 OutputStream
|- 字符流
|-字符輸入流 Reader
|-字符輸出流 Writer
5.11. 請簡述字符編碼是什么?請說出常見字符編碼表?
答案:字符編碼(英語: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個位元組就夠了,
5.12. 請說出學習過的IO流中的常用方法?
答案:位元組輸入流 InputStream
read() 讀取一個位元組
read(byte[]) 讀取一個位元組陣列
位元組輸出流
write(int) 寫入一個位元組
write(byte[]) 寫入一個位元組陣列
字符輸入流
read() 讀取一個字符
read(char[]) 讀取一個字符陣列
字符緩沖輸入流
readLine() 讀取一行字串
字符輸出流
write(int) 寫入一個字符
write(char[]) 寫入一個字符陣列
write(String) 寫入一個字串
字符緩沖輸出流
newLine() 寫入一個換行符
5.13. 請說出轉換流OutputStreamWriter與InputStreamReader 的作用?
答案:OutputStreamWriter:使用編碼表對位元組流的資料進行編碼
InputStreamReader:使用編碼表對位元組流中的資料進行解碼
5.14. 請簡述列印流(PrintStream、PrintWriter)的特點?
答案:PrintStream在OutputStream基礎之上提供了增強的功能,即可以方便地輸出各種型別的資料(而不僅限于byte型別)的格式化表示形式,PrintStream的方法從不拋出IOException
PrintWriter提供了PrintStream的所有列印方法,其方法也從不拋出IOException,
與PrintStream的區別:作為處理流使用時,PrintStream只能封裝OutputStream型別的位元組流,而PrintWriter既可以封裝OutputStream型別的位元組流,還能夠封裝Writer型別的字符輸出流并增強其功能,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/206169.html
標籤:其他
下一篇:SSM專案的dao層介面不加@Repository也不報錯,能夠實體化為bean?Could not autowire. No beans of ‘XxxDao‘ type found錯誤
