Java面試基礎部分合集
寫在前面:這篇文章對於在Java方面已經很牛逼的大手,就沒必要看了,因為對於你們來說,這tm簡直太簡單了。。。。
面試我們都經歷過,你真的懂面試嗎?針對面試我只想說一點,面試的目的不是讓考官知道你怎麽樣,而是讓你自己清楚自己怎麽樣。也就是說你會什麽、能夠做什麽!舉個例子,如果你去面試Java工程師,你至少要會該職位的職能,而不是只會做面試題!
以下所述不止是面試題還能讓你知道自己到底會什麽。
基礎部分
1.面向對象的三大特性
繼承、封裝、多態
什麽是繼承?
①繼承是面向對象程序設計能夠提高軟件開發效率的重要原因之一。
②繼承是具有傳遞性的,就像現實中孫子不僅長得像爸爸而且還像他爺爺。
③繼承來的屬性和方法是隱式的,也就是在本類裏面是看不見的。
④一個類只能有一個父類,也就是類只能是單繼承。
⑤一個接口可以有多個父類,也就是接口可以是多繼承。
實際項目開發中,一個類繼承於另一個類,那麽前者就是後者的子類,反則反之。
什麽是封裝?
對象數據和操作該對象的指令都是對象自身的一部分,能夠實現盡可能對外部隱藏數據。
實際項目開發中,使用封裝最多的就是實體類,常常和JavaBean(類必須是具體的和公共的,並且具有無參數的構造器)一起使用。
那麽,實體類有那些東西呢?
答:私有的成員變量、無參數的構造器、有參數的構造器、setter和getters方法、重寫tostring方法、重寫hashCode和equals方法。
什麽是多態?
①多態就是對象擁有多種形態:引用多態和方法多態。
②引用多態:父類的引用可以指向本類對象、父類的引用可以指向子類的對象。
③方法多態:創建本類對象時,調用的方法為本類的方法;創建子類對象時,調用的方法為子類重寫的方法或者繼承的方法。
④存在多態的必要條件:繼承、重寫。
⑤多態的作用是消除類型之間的耦合關系。
在實際項目開發中,A類繼承B類,如果在A類中不重寫B類的方法的時候,輸出的仍舊是B類方法裏面的信息(B b=new A());如果在A類中重寫B類的方法的時候,輸出的是A類方法裏面的信息(B b=new A())。
2.Java集合框架樹
Collection接口:它是Java集合框架的一個根接口,也是List、Set和Queue接口的父接口。同時它定義了可用於操作List、Set和Queue的方法—增刪改查。
Map接口:它提供了一種映射關系,其中的元素是以鍵值對(key-value)的形式存儲的。Map接口有一個重要的實現類HashMap。
①在Map接口中的鍵值對是以Entry類型的對象實例形式存在。
②在Map接口中鍵值(Key值)是不可以重復的,value值卻可以重復,也就是存在多對一的關系。
③在Map接口中提供了分別返回Key值的集合、value值的集合以及Entry集合的方法。
④Map支持泛型,同時Key值和value值都是可以為null的。
⑤在HashMap中的Entry對象是無序排序的,這點特性和List接口是相反的。
⑥在HashMap中有且只能有一個Key值為null的映射。(註:key值是不能重復的)
List接口:List接口有一個重要的實現類ArrayList(數組序列)。
①List是元素有序並且可以重復的集合。
②List可以精確的控制每個元素的插入位置,或刪除某個元素的位置。
Comparator接口:臨時的比較規則。如果某一個類要實現這個接口,那必然要實現它的Compare()方法。
Comparable接口:默認的比較規則。當實現了這個接口,則表示這個類的實例可以比較大小,可以進行自然排序。如果某一個類要實現這個接口,那必然要實現它的CompareTo()方法。
3.Java中的IO流
字節流:
//一個字節一個字節的讀寫
FileInputStream in=new FileInputStream("源文件");
FileOutputStream out=new FileOutputStream("目標文件");
......
in.close();
out.close();
首先要記住,一旦使用了IO流最後一定要記得關閉,這是常識。
//利用緩沖區,高效的讀取字節
BufferedInputStream in=new BufferedInputStream(new FileInputStream("源文件");
BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("目標文件");
......
in.close();
out.close();
字符流:
InputStreamReader isr=new InputStreamReader(new FileInputStream("源文件路徑"),"設置編碼");
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("目標文件路徑"),"設置編碼");
......
osw.close();
isr.close();
也可以這樣寫:
FileReader fr=new FileReader("源文件路徑");
FileWriter fw=new FileWriter("目標文件路徑");
......
fr.close();
fw.close();
//利用緩沖區,高效的讀取字符
BufferedReader br=new BufferedReader(new FileReade("源文件路徑");
PrintWriter pw=new PrintWriter("目標文件路徑");
......
br.close();
pw.close();
序列化和反序列化:
//對象的序列化
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
這裏的file指的是String file="文件在項目中的路徑";
//對象的反序列化
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
4.Java的Socket通信(多線程)
思路:
①首先創建服務器端Socket,指定並偵聽某一個端口,然後循環監聽開始等待客戶端的連接….
②創建客戶端socket,指定服務器地址和端口,然後獲取輸出流,向服務器端發送請求,並關閉socket輸出流。
③服務端接收到客戶端的請求後,創建新線程並啟動。
④創建線程處理類,執行線程操作,獲取輸入流,服務端讀取客戶端用戶詳情,關閉資源。
⑤執行線程操作,獲取輸出流,響應客戶端請求,客戶端接受到服務端的響應,關閉資源。
簡單點講,就相當於我跟你說話(客戶端→服務端),你收到我說的話(服務端→線程處理類),大腦進行思考後(線程處理類),做出回答我的話(線程處理類→客戶端)。
5.關系型數據庫
數據庫的三範式:
①字段不可分。
②有主鍵,非主鍵字段依賴主鍵。
③非主鍵字段不能互相依賴。
T-SQL:
在整個數據庫中,查詢操作占據增刪改查的80%,而說到查詢,T-SQL語句自然不能少。如圖上示。
增:
①插入單行
insert into <表名> (列名) values (列值)
②將現有的表數據添加到一個已有表
insert into <已有的新表> (列名) select <源表列名> from <源表名>
③直接拿現有表數據創建一個新表並填充
select <新建表列名> into <新建表名> from <源表名>
刪:
①刪除滿足條件的行
delete from <表名> where <刪除條件>
②刪除整個表
truncate table <表名>
註:刪除表的所有行,但表的結構、列、約束、索引等不會被刪除;不能用語有外建約束引用的表。
改:
①更新
update <表名> set <列名=更新值> where <更新條件>
子查詢:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
其中:
①SELECT * FROM t1 …稱為外查詢。
②SELECT column1 FROM t2 稱為子查詢。
所以,我們就說子查詢是嵌套在外查詢內部的。而事實上它也有可能在子查詢內部再嵌套一個或者多個子查詢。這裏要註意,子查詢必須出現在圓括號之間哦。
JavaWeb
JavaSpring 總結
JSP
思路:當用戶使用客戶端瀏覽器向服務器發送一個請求訪問index.jsp頁面,當服務器接收到客戶的請求之後,開始判斷用戶所訪問的這個資源是否是第一次訪問?
①如果是第一次請求,那麽Tomcat的JSP引擎就把這個JSP文件轉換成一個Servlet(一個Servlet從本質上而言也是一個Java類),既然是一個Java類就需要通過編譯,生成相應的字節碼文件,然後執行jspInit這個初始化方法。再生成JSP頁面的字節碼文件,轉到③。
②直接訪問所生成的JSP頁面的字節碼文件,轉到③。
③最後解析執行這個Java類當中的jspService方法,這個方法就是專門用來處理用戶的請求。
JSP九大內置對象:
out對象:它是JspWriter類的實例,是向客戶端輸出內容常用的對象。
request對象:它表示客戶端的一次請求,這個請求裏面的信息是被封裝在request對象中的。同時它也是HttpServletRequest類的實例,並且具有請求域,也就是在完成客戶端的請求之前,該對象是一直有效的。
常用方法:
request.setCharacterEncoding("UTF-8");//設置編碼,解決中文亂碼問題。
request.setAttribute("","");//前者為需要設置的屬性,後者為需要的值。
request.getAttribute();
request.getRequestDispatcher("index.jsp").forward(request, response);//請求轉發到index.jsp頁面,該請求對象是一直有效的。
response對象:它包含了響應客戶請求的相關信息,它也是HttpServletResponse類的實例。和request一樣,它具有頁面的作用域,也就是在訪問一個頁面的時候,該頁面的response對象只對這次訪問有效,往後執行是不存在、無效的。
常用方法:
response.setContentType("text/html","charset="utf-8");//設置響應的MIMI類型。
response.sendRedirect("index.jsp");//請求重定向,如果存在多次重定向,那麽對象數據是不會保存下來的,即為null。
請求轉發和請求重定向的區別分析:
-
請求重定向:客戶端行為,response.sendRedirect(),從本質上講等同於兩次請求,前一次的請求對象不會保存,地址欄的URL地址會改變。
-
請求轉發:服務器行為,request.getRequestDispatcher().forward(req, resp);是一次請求,轉發後請求對象會保存,地址欄的URL地址不會改變。
session對象:當我們第一次訪問頁面的時候,session對象就會被自動裝載和創建。它是HttpSession類的實例對象。
什麽是會話?為什麽要用session對象?
-
會話:當一個客戶端打開瀏覽器連接到服務器開始,到客戶端關閉瀏覽器服務器結束這個過程,我們稱為一個會話。
-
在實際情況下,客戶在訪問服務器的過程中,避免不了會在服務器的幾個頁面之間切換,這時候服務端有必要知道當前操作的客戶是不是操作前幾個頁面的客戶,也就是必須要清楚知道是否同一個人在進行操作。所以就引入了session對象這個概念。
application對象:它實現了用戶間數據的共享,可以存放全局變量,它是ServletContext類的實例。它的生命周期開始於服務器的啟動,終止於服務器的關閉。
註:
①在用戶的前後連接或不同用戶之間的連接中,可以對application對象的同一屬性進行操作。
②在任何地方對application對象屬性的操作,都將影響到其他用戶對此的訪問。
JSP的指令和動作:
①三個編譯指令:page、include、taglib。
②七個動作指令:jsp:forward、jsp:param、jsp:include、jsp:plugin、jsp:useBean、jsp:setProperty、jsp:getPProperty。
JSP指令:
include指令和include動作指令區別:
Session的生命周期
Session生命周期的“活動”思路:
①某次會話當中通過超鏈接打開的新頁面屬於同一次會話。
②只有當前會話頁面沒有全部關閉,重新打開新的瀏覽器窗口訪問同一項目資源時屬於同一次會話。
③除非本次會話的所有頁面都關閉後再重新訪問某個Jsp或者Servlet將會創建新的會話。
註:
註意原有會話是還存在的,只是這個舊的SessionId仍然存在於服務端,只不過再也沒有客戶端會攜帶它然後交予服務端校驗。
註:
①當Web容器啟動的時候,過濾器就已經加載並啟動了。
②實例化只會實例化一次,也就是說在Web容器中只會使用一次。
思路:
①首先判斷Servlet實例是否存在,如果存在則跳入第③步。
②初始化階段,init初始化方法是在創建實例之後完成的。
③響應階段,響應客戶端的請求,調用service()方法。由service()方法根據提交方式選擇性執行doGet()方法或者doPost()方法。
④終止階段,調用Destroy()方法銷毀,服務器關閉。
Web監聽器
Web監聽器是有Servlet規範定義的一種特殊類,它可以監聽客戶端的請求和服務端的操作,同時它還可以監聽,包括ServletContext、HttpSession、ServletRequest等對象。
監聽器的分類
HttpSession的事件監聽器
ServletContext的事件監聽器
ServletRequest的事件監聽器
註:
這三個監聽事件,分別實現對應的接口,也就是圖示的1..N。既然實現了接口,即必然要實現其對應的方法,如圖所示。主要用途也如圖所示。
綁定到HttpSession域中的對象狀態的事件監聽器
註:
為什麽要用session鈍化?
首先,正常情況下,我們的session是存放在服務器的session當中的,但是如果我們的用戶很多的時候,仍然把session存放在服務器裏,這時服務器的開銷是很大的,會直接影響我們Web應用的使用。所以就需要使用到session鈍化機制,它的本質就是將服務器未使用到的session對象暫時序列化到系統文件當中,當要使用的時候再反序列化到服務器內存當中。
Model1和Model2
註:
Model1是最早的能體現分層思想的一種開發模式,簡單來說Model1就是一種Jsp+JavaBean的一種開發模式。
缺點:可維護性和可擴展性是比較差的。
思路:
①首先由Jsp頁面向Servlet提交一個請求。
②然後在我們的控制層Servlet實例化一個模型層的對象或者調用模型層的一些功能。
③然後由模型層來訪問讀取我們的數據庫層。
④當得到讀取到結果後,再將結果返回到我們的控制層。
⑤控制層得到這個結果後,會根據這個結果給用戶展示不同的Jsp頁面。
有需要Java教學視頻的朋友,可以加我756576218 萌新也可以
Java面試基礎部分合集