培訓(xùn)班學(xué)習(xí)Java第一天
測試題講解之查缺補漏
選擇題
一、標識符

標識符的概念:給類、接口、方法變量取名字的字符序列。
組成:大小寫字母、數(shù)字、_、$、中文。
注意事項:
不能以數(shù)字開頭;
字母區(qū)分大小寫;
不能使用除$和_以外的特殊符號。
不能使用Java關(guān)鍵字
考慮編碼問題,盡量不使用中文
二、重載

重載的概念:方法與方法間的關(guān)系。
條件:
在同一個類中;
方法名相同;
參數(shù)列表的個數(shù)或者類型不一致;
與返回值無關(guān)
好處:系統(tǒng)會根據(jù)傳入的參數(shù)自動匹配相應(yīng)的重載方法。減少寫多個函數(shù)名的重復(fù)步驟。
三、數(shù)組初始化
分為靜態(tài)初始化和動態(tài)初始化。
靜態(tài)初始化:數(shù)據(jù)由程序員給定,數(shù)組長度由系統(tǒng)自動分配——String[] name = {"張三","李四","王五"};
動態(tài)初始化:數(shù)組長度由程序員給定,數(shù)據(jù)由系統(tǒng)自動分配——String[] names = new String[3];
不同類型的數(shù)組內(nèi)數(shù)據(jù)初始值:
整數(shù)類型---0;2.浮點類型---0.0;字符類型---‘ ’(空格);布爾類型---false;引用類型---null。
四、位運算

位運算:十進制數(shù)據(jù)轉(zhuǎn)換為二進制數(shù)據(jù),再做運算。
&:同位比較,兩者為1,結(jié)果才為1;
|:同位比較,兩者有1,結(jié)果就為1;
^:同位比較,兩者相同為0,不同為1;
<<:整體向左移動n位,就用n個0補位;
>>:整體向右移動n位,就用n個最高位(符號位)補位;
>>>?:整體向右移動n位,就用n個0補位。
(正數(shù)右移'>>',高位用0補,負數(shù)右移,高位用1補,當(dāng)負數(shù)使用無符號右移'>>>'時,用0進行部位(負數(shù)變?yōu)榱苏麛?shù)))
五、能供switch使用的數(shù)據(jù)類型:byte、short、int、char、字符串(JDK1.7)、枚舉(JDK1.5)。

六、構(gòu)造方法的概念:與類名相同且沒有返回項的方法;作用:創(chuàng)建對象、初始化數(shù)據(jù)。

七、final

final的含義:被稱為最終方法。
final修飾類:類不能被繼承;
final修飾方法:方法不能被重寫;
final修飾變量:常量。
簡答題
1.論述面向?qū)ο蟮娜筇卣骷捌涫褂脠鼍埃?/p>
封裝、繼承、多態(tài)
封裝:一般類的屬性都必須封裝(私有化屬性+get/set),保證了屬性的安全性
繼承:多個類有共同的屬性和方法,就抽取出放在父類中,減少代碼的冗余,增加了程序的復(fù)雜度和可維護性
多態(tài):編寫方法,參數(shù)盡可能選擇接口或者父類類型,提高了程序的可擴展性
2.?多態(tài)的優(yōu)缺點?
優(yōu)點:提高了程序的可擴展性,不違反OCP原則
缺點:不能使用子類獨有的屬性和方法(多態(tài)主要作用?:調(diào)用子類重寫父類的方法)
3.?抽象類和接口的區(qū)別?
抽象類:單繼承,抽象類中可以有屬性、構(gòu)造方法、成員方法、靜態(tài)方法、抽象方法
接口:多實現(xiàn),接口中只能有靜態(tài)常量、抽象方法、靜態(tài)方法(JDK1.8)、默認方法(JDK1.8)
4.?Java類加載機制的步驟?
含義:JVM會將該類的class文件加載到方法區(qū)中的過程
什么時候JVM會將該類的class文件加載到方法區(qū)中?
1.?第一次創(chuàng)建該類的對象
2.?第一次調(diào)用該類的靜態(tài)方法
3.?第一次獲取該類的class對象 -- Class<?> clazz = Class.forName("com.qf.test01.A");
class文件加載幾次?
1次
class文件里的內(nèi)容有什么?
class文件中包含了該類所有的信息,屬性、構(gòu)造方法、成員方法、靜態(tài)方法、抽象方法...
class對象的作用是什么?
class對象作為class文件的訪問入口
加載步驟:
1.?加載(獲取類的全限定名生成字節(jié)流,讀取到方法區(qū)中,并在堆中創(chuàng)建該類的class對象)
2.?連接
2.1驗證(驗證class文件是否合法 - 是否符合class文件規(guī)范、語法/數(shù)據(jù)、符號引用是否正確)
2.2 準備(類變量開辟空間,給類變量賦系統(tǒng)初始值,但是靜態(tài)常量直接賦值)
2.3 解析(符號引用,轉(zhuǎn)換為直接引用)
3.?初始化(將代碼中的靜態(tài)值賦值給靜態(tài)變量)
?
5.?Switch的表達式類型,底層原理?
表達式類型:byte、short、int、char、枚舉(JDK1.5)、字符串(JDK1.7)
底層原理:
byte、short自動向上轉(zhuǎn)型成int
char獲取對應(yīng)的Unicode碼
枚舉獲取的是對象編號
字符串獲取的hash碼+equals
總結(jié):表達式的類型最終都會轉(zhuǎn)換為int,去做識別
6.?內(nèi)部類分類及區(qū)別?
成員內(nèi)部類:內(nèi)部類可以調(diào)動外部類所有的屬性
靜態(tài)內(nèi)部類:內(nèi)部類只能調(diào)用外部類的靜態(tài)屬性
接口內(nèi)部類:相當(dāng)于靜態(tài)內(nèi)部類
局部內(nèi)部類:方法中聲明的類,可以調(diào)用外部類的方法中的局部變量,局部變量自動使用final修飾(JDK1.8)
匿名內(nèi)部類:抽象類子類的對象或接口實現(xiàn)類的對象只使用一次,就使用匿名內(nèi)部類去替代
7.?ArrayList與Vector的區(qū)別?
ArrayList:線程不安全,擴容機制(原來的1.5倍)
Vector:線程安全,擴容機制(判斷容量增量,如果容量增量為0,原來長度的2倍;如果容量增量不為0,原來長度+容量增量)
8.?LinkedList刪除元素的過程
1.?判斷元素是否為空,如果為空,判斷條件使用元素==null,如果不為空,判斷條件使用equals,直到找到該元素或者遍歷到最后一個元素
2.?加入A、B、C三個節(jié)點,刪除的是B節(jié)點,通過B節(jié)點找到A節(jié)點,將A節(jié)點下一個位置指向C節(jié)點,通過B節(jié)點找到C節(jié)點,將C節(jié)點上一個位置指向A節(jié)點?-- 斷鏈
9.?什么叫做Hash碰撞
多個元素的hash值一樣造成Hash碰撞(將數(shù)據(jù)存入到HashMap或者ConcurrentHashMap,一般會重寫Key元素所屬類的hashCode()和equals(),從而降低Hash碰撞,因為hash碰撞會損耗性能,因為HashMap或ConcurrentHashMap的數(shù)據(jù)結(jié)構(gòu)為一維數(shù)組+單向鏈表,數(shù)據(jù)直接存在數(shù)組中的效率勝過存在單向鏈表中)
?
10.?JDK1.7 和 1.8下HashMap的區(qū)別?
HashMap - JDK1.7:一維數(shù)組+單向鏈表,頭插法
HashMap - JDK1.8:一維數(shù)組+單向鏈表+紅黑樹,尾插法,計算hash值高16位^低16位
JDK1.8的HashMap什么時候做到一維數(shù)組+單向鏈表 和 一維數(shù)組 + 紅黑樹的轉(zhuǎn)換?
一維數(shù)組+單向鏈表 -->?一維數(shù)組 + 紅黑樹:數(shù)組長度大于64,鏈表長度大于8
一維數(shù)組 + 紅黑樹 --> 一維數(shù)組+單向鏈表:紅黑樹節(jié)店小于6
JDK1.8的HashMap數(shù)據(jù)結(jié)構(gòu)為什么加上了紅黑樹?
提高了查詢效率
11.?論述多線程的生命周期?
?

12.?Java線程安全的幾種方式?
1.?synchronized
2.?lock
?
15.線程池的運行流程?
1. 核心線程
2. 任務(wù)隊列
3.普通線程
4. 拒絕策略
?
16創(chuàng)建自定義線程池的參數(shù)有哪些?
核心線程數(shù)、最大線程數(shù)、任務(wù)隊列、線程工廠、閑置時間、時間單位、拒絕策略
?
17.TCP連接機制和斷連機制是什么?
三次握手
四次揮手
?
18.?異常的處理機制是什么?
1.?程序中出現(xiàn)的異常,會創(chuàng)建異常對象交給JVM -- 拋出異常
2.?JVM會循環(huán)是否有處理異常的代碼
2.1 有 - 就將異常對象交給其處理 -- 捕獲異常+處理異常
2.2 沒有 - 程序就終止運行
?
19.?什么叫做序列化接口?有什么作用?
Serializable為序列化接口
ObjecOutputStream將對象寫入到文件,該對象所屬的類必須實現(xiàn)序列化接口,序列化接口作為寫入文件的憑證
鈍化/序列化:將程序中的對象寫入到文件中
活化/反序列化:將文件中的對象讀取到程序中
?
20.?字節(jié)流和字符流的區(qū)別?
字節(jié)流以字節(jié)為單位去傳輸數(shù)據(jù)
字符流以字符為單位去傳輸數(shù)據(jù),字符流底層由字節(jié)流+編譯器實現(xiàn),編譯器會根據(jù)編碼格式去操作數(shù)據(jù)?