寫作前面
本書內容摘自《Java程式設計師面試筆試寶典》
很多同學在面試時其實有個誤區,認為準備的東西越詳細越好
其實不是,就和批試卷一樣,寫長篇大論其實並不會必然加分
老師閱卷時間有限只會抓關鍵詞,面試官也是一樣的道理
加上面試官每天面試的人有很多,不可能在你身上浪費大量的時間,更不可能有時間聽你背書
工作不是要一個背書機器,加上計算機語言晦澀難懂,要想把整本書背下來基本不可能
那麼為什麼有時候我們聽大佬說話句句都是重點
因為他拋棄了所有的贅述,只留下了關鍵詞和框架
但是這本書怎麼說呢,回答問題的邏輯稍微有點亂,有時候看著看著就把問題忘了,所以有些擴充內容就刪掉了,留到別的頁面去單獨和大家討論
面試的時候除非面試官追問,否則一般兩三句話可以搞定了
所以這篇博文的回答都會很短,但是不是直接靠這個回答就可以了,大家要根據關鍵詞將語言用自己的話組織起來
Java基礎知識
Java語言有哪些優點
純物件導向,平臺無關,有內建類,支援Web應用開發,安全和健壯,規避了C++的弊端
Java和C++有什麼區別和相同
Java編譯成位元組碼JVM解釋,C++經過編譯生成二進位制程式碼
Java純物件導向,C++兼具物件導向過程
Java沒有指標更安全
Java不支援多重繼承
Java自帶回收功能
Java語言不支援運算子過載,C++支援
Java和平臺無關,C++有關
Java提供對註釋文件內建支援
Java包含了標準庫
為什麼需要public static void main (String[] args) 這個方法
main是JVM識別的特殊方法名,是程式的入口方法
如何實現在Main方法執行前輸出hello world
main方法不一定是第一個被執行的,在前面利用靜態塊實現輸出語句
Java程式初始化的順序是怎麼樣的
靜態物件優於非靜態物件
父類優於子類
按照成員變數定義順序
Java中的作用域有哪些
Java的變數有三種:成員變數,靜態變數【全域性變數】,區域性變數
成員變數還有四種:public,private,protected,default
一個Java檔案中是否可以定義多個類
可以定義,但只有一個類被public修飾,且必須與檔名相同,沒有public類檔名隨便一個類的名字
什麼是建構函式
用來在物件例項化時初始化物件的成員變數的函式
- 建構函式必須與類的名字相同
- 每個類可以有多個建構函式
- 引數不限制
- 總是伴隨著new操作一起呼叫,且不能直接呼叫,必須系統呼叫
- 主要作用完成初始化工作
- 不能被繼承
- 子類可以通過super來呼叫父類建構函式
- 父類和子類都沒有定義,編譯器自動為兩個類生成無引數建構函式
為什麼Java中有些介面沒有任何方法
Java不支援多重繼承,Java一個類可以實現多個介面,間接達到多重介面的目的
Java中的clone方法有什麼作用
為了解決引用傳遞中,修改一個值會影響到另一個值的問題
什麼是反射機制
允許程式執行時自我檢查,增加程式的靈活性
功能主要有
- 得到一個物件所屬的類
- 獲取一個類的所有成員變數和方法
- 在執行時建立物件
- 在執行時呼叫物件的方法
package有什麼作用
- 解決明明衝突
- 對類按照功能分類,專案組織更加清晰
如何實現類似於C語言中函式指標的功能
定義一個介面,在介面中生命呼叫的方法,實現這個介面,最後把實現類的一個物件作為引數傳遞給呼叫程式
物件導向和麵向過程有什麼區別
出發點不同:前者用常規思維的方式處理問題,後者強調過程的抽象化與模組化
層次邏輯關係不同:前者用計算機邏輯來模擬客觀世界,後者把客觀世界的問題抽象成計算機可以處理的過程
資料處理方式與控制程式方式不同:前者將對應的程式碼封裝成一個整體,後者是直接通過程式來處理資料處理完畢即可顯示結果
分析設計與編碼轉換方式不同:前者從分析、設計到編碼採用一致性模型,後者從分析、設計到編碼之間按規則進行轉換
物件導向有哪些特徵
抽象、繼承、封裝、多型
採用物件導向的開發方式有什麼特點
較高的開發效率
保證軟體的魯棒性
保證軟體的高可維護性
什麼是繼承
子類適用父類的一些成員變數與方法,提高程式碼的複用性,提高開發效率
組合和繼承有什麼區別
組合相當於【Has】
繼承相當於【Is】,在這種情況下才使用繼承
多型的實現機制是什麼
多型是指同一個操作對於不同的物件,會有不同的語義
有兩種表現方式
方法的過載【同名方法,不同引數】
方法的覆蓋【子類覆蓋父類】
過載和覆蓋有什麼區別
過載是同一個類中的方法之間的關係,覆蓋是父類和子類的關係
覆蓋只能一個方法或者一對方法產生關係,過載是多個方法之間的關係
覆蓋引數列表相同,過載引數列表不同
覆蓋呼叫根據物件的型別,過載呼叫根據實參和形參的方法體
抽象類和介面有什麼異同
相同點
- 都不能被例項化
- 只有實現了其中的方法才能被例項化
不同點
- 介面只有定義,只有實現介面的類才能實現介面中定義的方法,抽象類可以有定義和實現,其方法可以再抽象類中被實現
- 介面需要實現【implements】,但抽象類只能被繼承【entends】,一個類可以實現多個介面,但一個類只能繼承一個抽象類
- 介面理念是has關係,抽象類是is關係
- 介面中定義的成員變數預設為public static final,抽象類可以有自己的資料成員變數,也可以由非抽象的成員方法
- 介面被運用與實現比較常用的功能,抽象類更傾向於充當公共類的角色
介面是一種特殊形式的抽象類,但抽象類多用於同類食物中無法具體描述的方法的場景,僅限於子類和父類有邏輯關係才使用
內部類有哪些
靜態內部類,成員內部類,區域性內部類,匿名內部類
如何獲取父類的類名
getClass().getSuperclass().getName()
this與super有什麼區別
this用來指向當前例項物件,super用來訪問父類
變數命名有哪些規則
只能由字母,數字,下劃線和美元符號組成,第一個字元不能是數字,識別符號不能包含空白字元
break,continue以及return有什麼區別
break直接結束當前迴圈
continue結束此次迴圈,進入下一次迴圈
return是一個跳轉語句,是的程式返回到呼叫該方法的地方
final,finally和finallize有什麼區別
final宣告屬性、方法和類
finally是異常處理一部分
finalize是覆蓋此方法來實現對其他資源的回收
assert有什麼作用
對bollean表示式進行檢查,用來保證程式的正確性,在開發和測試使用
static關鍵字有哪些作用
為某特定資料型別或物件分類單一的儲存空間,預建立物件個數無關
實現某個方法或屬性與類而不是物件關聯在一起
適用switch時有哪些注意事項
switch表示式只能是int
省略了break,匹配語句後面所有的情況包括default都會被執行
volatile有什麼作用
修飾被不同執行緒訪問和修改的變數,系統直接從對應記憶體提取,不會利用快取
instanceof有什麼作用
判斷一個引用型別的變數所指向的物件是否是一個類的例項,即它左邊的物件是否是它右邊的類的例項【boolean型別】
strictfp有什麼作用
全稱strict float point,指的是精確浮點,確保浮點數運算
Java提供了哪些基本資料型別
8種,byte,short,int,long,float,double,char,boolean
什麼是不可變類
建立類的例項後,不允許修改它的值,類似於const,一般情況下封裝類都是不可變類,包括String
建立不可邊類的原則
- 成員變數private修飾
- 一般沒有set方法
- 確保類中所有方法不會被子類覆蓋
- 如果一個類成員不是不可變數,需要通過clone方法來保證
- 如果有必要,可以使用equals方法和hashCode方法
值傳遞與引用傳遞有哪些區別
值傳遞形參的改變不會影響實參的值,引用傳遞形參的修改就會影響實參的值
不同資料型別的轉換有哪些規則
型別自動轉換,強制型別轉換
強制型別轉換注意事項有哪些
涉及byte、short和char型別的運算,會強制轉換為int
需要得到short型別的結果,需要顯示地轉換
運算子優先順序是什麼
Math類中round、ceil和floor方法的功能各是什麼
round方法表示四捨五入
ceil方法表示向上取整
floor方法表示向下取整
++i與i++有什麼區別
前者程式開始前自增,後者程式執行完畢後自增
如何實現無符號數的右移運算
>>被稱為有符號右移運算【為正數高位補0,負數時高位補1】
>>>被稱為無符號右移運算【執行運算時,都會在高位補0】
char型變數中是否可以儲存一箇中文漢字
可以,不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變數中就不能儲存這個特殊漢字
字串建立與儲存的機制是什麼
①建立物件
String s1 = new String("abc");
String s2 = new String("abc");
②宣告物件
String s1 = "abc";
String s2 = "abc";
==、equals和hashCode有什麼區別
==用來比較兩個變數的值是否相等
equals在沒有被覆蓋的情況下和==運算子一樣,覆蓋以後可以比較資料內容而不是引用
hashCode用來鑑定兩個物件是否相等,返回物件地址是否相等
equals方法用於比較物件的內容是否相等(覆蓋以後)
hashcode方法只有在集合中用到
當覆蓋了equals方法時,比較物件是否相等將通過覆蓋後的equals方法進行比較(判斷物件的內容是否相等)。
將物件放入到集合中時,首先判斷要放入物件的hashcode值與集合中的任意一個元素的hashcode值是否相等,如果不相等直接將該物件放入集合中。如果hashcode值相等,然後再通過equals方法判斷要放入物件與集合中的任意一個物件是否相等,如果equals判斷不相等,直接將該元素放入到集合中,否則不放入。
String、StringBuffer、StringBuilder和StringTokenizer有什麼區別
1)String、StringBuffer、StringBuilder都用於字串操作,其中,String是不可變類,即String物件一旦被建立,其值不能被修改,而StringBuffer和StringBuilder都是可變類,物件被建立以後仍然可以對其值進行修改。
2)在字串需要共享的場合中使用String合適,而當一個字串經常需要被修改時,最好使用StringBuffer或者StringBuilder,具體看是否多執行緒
3)String類例項化物件有兩種方式:可以利用構造方法的方式(String str = new String("Hello"))來進行初始化,也可以用賦值的方式(String str = “Hello”)進行初始化。而StringBuffer和StringBuilder只能通過構造方法的方式(StringBuffer sb = new StringBuffer(“Hello”))來初始化。
4)StringBuffer是執行緒安全的,StringBuilder不是執行緒安全的。
5)在執行效率方面,StringBuilder最高,StringBuffer次之,String最低。一般而言,如果要操作的資料量比較小,應優先使用String;如果在單執行緒下操作大量資料,應優先選擇StringBuilder;如果是在多執行緒下操作大量資料,應優先考慮StringBuffer
6)StringTokenizer是用來分割字串的工具類。
Java中陣列是不是物件
物件的特點是封裝了一些資料,同時提供一些屬性和方法,所以陣列是物件
有自己的屬性【如何length】,也有一些方法被呼叫【clone】
陣列的初始化方式有哪幾種
一維陣列兩種
type arrayName[ ]或者type[ ]arrayName
二維陣列三種
type arrayName[ ][ ] ;
type[ ][ ] arrayName;
type[ ] arrayName[ ];
length屬性與length()方法有什麼區別
前一個是陣列長度,後一個是字串長度
return後的finally塊中的程式碼什麼時候被執行
一定會執行,並且在return前執行
異常處理的原理是什麼
把異常當做物件來處理,並定義了一個基類java.lang.Throwable作為所有異常的父類
執行時異常和普通異常有什麼區別
一般異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見的執行錯誤
java編譯器要求方法宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未捕獲執行時異常。
Java IO流的實現機制是什麼
輸入和輸出都被稱為抽象的流,流可以被看做一組有序的位元組集合,即資料在兩裝置之間的傳輸
流可以分為兩大類:位元組流和字元流
管理檔案和目錄的類是什麼
File類管理檔案和資料夾,通過類不僅能夠檢視檔案或目錄的屬性,而且還可以實現對檔案或目錄的建立、刪除與重新命名等操作。
Java Web
頁面請求的工作流程是怎樣的
- 使用者輸入網址
- 把使用者請求傳送給伺服器
- 伺服器查詢請求的網頁
- 找到使用者請求的頁面
- 傳送相應訊息
- 瀏覽器顯示返回結果
HTTP中GET語POST方法有什麼區別
GET是一種最簡單的請求方法,其主要功能是從伺服器端獲取使用者所需資源,並將其作為相應返回給客戶端
GET方法的作用主要用來獲取伺服器端資源資訊,不會影響到資源自身的狀態
POST方法在這個基礎上還可以向伺服器上傳資料
什麼是Servlet
Servlet 是採用Java語言編寫的伺服器端程式,它執行於Web伺服器中的Servlet容器中,其主要功能是提供請求/響應的Web服務模式,可以生成動態的Web內容,而這正是HTML所不具備的功能。
與其他生成動態頁面技術相比,Servlet有諸多優點
- 較好的可移植性
- 執行效率高
- 功能強大【可以與Web伺服器進行互動】
- 使用方便【有介面用來讀取或者設定HTTP都訊息,處理Cookie和跟蹤會話狀態】
- 可擴充套件性強【具備Java所有優點】
什麼是Servlet的生命週期
載入、建立、初始化、處理客戶請求、解除安裝
載入:容器通過類載入器使用Servlet類對應的檔案來載入Servlet
建立:通過呼叫Servlet的建構函式來建立一個Servlet例項。
初始化:通過呼叫Servlet 的init( )方法來完成初始化工作
處理客戶請求:Servlet 一旦被建立後,它就可以為客戶端提供服務了。
解除安裝:容器在解除安裝Servlet之前需要呼叫destroy()方法,讓Servlet自己釋放其佔用的系統資源
JSP有哪些優點
JSP的引入在一定程度上解決了Servlet存在的缺點
改進了Web應用程式程式碼可讀性差,系統可擴充套件性可維護性差的缺陷
JSP與Servlet有何異同
相同點
JSP可以看做特殊的Servlet,只要是JSP可以完成的工作,Servlet都可以完成
不同點
Servlet是在Java嵌入HTML程式碼,編寫不方便,JSP實現是在HTML中嵌入Java程式碼
Servlet中沒有內建物件
JSP中的內建物件都是通過HttpServletRequest物件、HttpServletResponse 物件以及HttpServlet物件得到。
如何使用JSP與Servlet實現MVC模型
MVC全程Model【模型】,View【檢視】、Controller【控制器】首字母組合
MVC強制性地分離Web應用的輸入、處理和輸出,使得MVC應用程式分成3個核心部件
JSP的內建物件有哪些
在JSP中,內建物件又稱為隱含物件,是指在不宣告和不建立的情況下就可以被使用的一些成員變數。
JSP一共提供有9個內建物件:
request ( 請求物件)
response (響應物件)
pageContext(頁面上下文物件)
session ( 會話物件)
application (應用程式物件)
out (輸出物件)
config(配置物件)
page (頁面物件)
exception (例外物件)
request物件主要有哪些方法
JSP有哪些動作
jsp: include。用來在頁面被請求時引入一個檔案。 |
|
jsp : useBean。用來尋找或者例項化一個JavaBean。 |
|
jsp: setProperty。用來設定已經例項化的Bean物件的屬性 |
|
jsp : getProperty。用來獲取某個JavaBean的屬性 |
|
jsp:foward。用來把請求轉到一個新頁面 |
|
jsp: plugin。用於在瀏覽器中播放或顯示一個物件 |