30道常見的JAVA面試題分享

1、servlet執行流程

客戶端發出http請求,web服務器將請求轉發到servlet容器,servlet容器解析url並根據web.xml找到相對應的servlet,並將request、response對象傳遞給找到的servlet,servlet根據request就可以知道是誰發出的請求,請求信息及其他信息,當servlet處理完業務邏輯後會將信息放入到response並響應到客戶端。

2、ajax的理解

a)Ajax為異步請求,即局部刷新技術,在傳統的頁面中,用戶需要點擊按鈕或者事件觸發請求,到刷新頁面,而異步技術為不需要點擊即可觸發事件,這樣使得用戶體驗感增強,比如商城購物車的異步加載,當你點擊商品時無需請求後臺而直接動態修改參數。

3、內部類與外部類的調用

a)內部類可以直接調用外部類包括private的成員變量,使用外部類引用的this.關鍵字調用即可

b)而外部類調用內部類需要建立內部類對象

4、多線程

a)一個進程是一個獨立的運行環境,可以看做是一個程序,而線程可以看做是進程的一個任務,比如QQ是一個進程,而一個QQ窗口是一個線程。

b)在多線程程序中,多線程併發可以提高程序的效率,cpu不會因為某個線程等待資源而進入空閒狀態,它會把資源讓給其他的線程。

c)用戶線程就是我們開發程序是創建的線程,而守護線程為系統線程,如JVM虛擬中的GC

d)線程的優先級別:每一個線程都有優先級別,有限級別高的可以先獲取CPU資源使該線程從就緒狀態轉為運行狀態。也可以自定義線程的有限級別

e)死鎖:至少兩個以上線程爭取兩個以上cpu資源,避免死鎖就避免使用嵌套鎖,只需要在他們需要同步的地方加鎖和避免無限等待

5、HTTP協議

a)常用的請求方法有get、post

b)Get與post的區別:傳送數據,get攜帶參數與訪問地址傳送,用戶可以看見,這的話信息會不安全,導致信息洩露。而post則將字段與對應值封裝在實體中傳送,這個過程用戶是不可見的。Get傳遞參數有限制,而post無限制。

6、事物的理解

a)事物具有原子性,一致性,持久性,隔離性

b)原子性:是指在一個事物中,要麼全部執行成功,要麼全部失敗回滾。

c)一致性:事物執行之前和執行之後都處於一致性狀態

d)持久性:事物多數據的操作是永久性

e)隔離性:當一個事物正在對數據進行操作時,另一個事物不可以對數據進行操作,也就是多個併發事物之間相互隔離。

7.Java中,什麼是構造函數?什麼是構造函數重載?什麼是複製構造函數?

當新對象被創建的時候,構造函數會被調用。每一個類都有構造函數。在程序員沒有給類提供構造函數的情況下,Java編譯器會為這個類創建一個默認的構造函數。

Java中構造函數重載和方法重載很相似。可以為一個類創建多個構造函數。每一個構造函數必須有它自己唯一的參數列表。

Java不支持像C++中那樣的複製構造函數,這個不同點是因為如果你不自己寫構造函數的情況下,Java不會創建默認的複製構造函數。

8.hashCode()和equals()方法的重要性體現在什麼地方?

Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引,當根據鍵獲取值的時候也會用到這兩個方法。如果沒有正確的實現這兩個方法,兩個不同的鍵可能會有相同的hash值,因此,可能會被集合認為是相等的。而且,這兩個方法也用來發現重複元素。所以這兩個方法的實現對HashMap的精確性和正確性是至關重要的。

9.數組(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?

下面列出了Array和ArrayList的不同點:

·Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。

·Array大小是固定的,ArrayList的大小是動態變化的。

·ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

·對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。

·10.Java中Exception和Error有什麼區別?

·

·Exception和Error都是Throwable的子類。Exception用於用戶程序可以捕獲的異常情況。Error定義了不期望被用戶程序捕獲的異常。

·

·11.throw和throws有什麼區別?

·

·throw關鍵字用來在程序中明確的拋出異常,相反,throws語句用來表明方法不能處理的異常。每一個方法都必須要指定哪些異常不能處理,所以方法的調用者才能夠確保處理可能發生的異常,多個異常是用逗號分隔的。

·

·12.異常處理的時候,finally代碼塊的重要性是什麼?(譯者注:作者標題的序號弄錯了)

·

·無論是否拋出異常,finally代碼塊總是會被執行。就算是沒有catch語句同時又拋出異常的情況下,finally代碼塊仍然會被執行。最後要說的是,finally代碼塊主要用來釋放資源,比如:I/O緩衝區,數據庫連接

·13.什麼是Servlet?

·

·Servlet是用來處理客戶端請求併產生動態網頁內容的Java類。Servlet主要是用來處理或者是存儲HTML表單提交的數據,產生動態內容,在無狀態的HTTP協議下管理狀態信息。

·

·14.說一下Servlet的體系結構。

·

·所有的Servlet都必須要實現的核心的接口是javax.servlet.Servlet。每一個Servlet都必須要直接或者是間接實現這個接口,或者是繼承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最後,Servlet使用多線程可以並行的為多個請求服務

·15.GenericServlet和HttpServlet有什麼區別?

·

·GenericServlet是一個通用的協議無關的Servlet,它實現了Servlet和ServletConfig接口。繼承自GenericServlet的Servlet應該要覆蓋service()方法。最後,為了開發一個能用在網頁上服務於使用HTTP協議請求的Servlet,你的Servlet必須要繼承自HttpServlet。這裡有Servlet的例子。

·

·16.解釋下Servlet的生命週期。

·

·對每一個客戶端的請求,Servlet引擎載入Servlet,調用它的init()方法,完成Servlet的初始化。然後,Servlet對象通過為每一個請求單獨調用service()方法來處理所有隨後來自客戶端的請求,最後,調用Servlet(譯者注:這裡應該是Servlet而不是server)的destroy()方法把Servlet刪除掉。

·

17.什麼是cookie?session和cookie有什麼區別?

cookie是Web服務器發送給瀏覽器的一塊信息。瀏覽器會在本地文件中給每一個Web服務器存儲cookie。以後瀏覽器在給特定的Web服務器發請求的時候,同時會發送所有為該服務器存儲的cookie。下面列出了session和cookie的區別:

· 無論客戶端瀏覽器做怎麼樣的設置,session都應該能正常工作。客戶端可以選擇禁用cookie,但是,session仍然是能夠工作的,因為客戶端無法禁用服務端的session。

· 在存儲的數據量方面session和cookies也是不一樣的。session能夠存儲任意的Java對象,cookie只能存儲String類型的對象。

18.JSP請求是如何被處理的?

瀏覽器首先要請求一個以.jsp擴展名結尾的頁面,發起JSP請求,然後,Web服務器讀取這個請求,使用JSP編譯器把JSP頁面轉化成一個Servlet類。需要注意的是,只有當第一次請求頁面或者是JSP文件發生改變的時候JSP文件才會被編譯,然後服務器調用servlet類,處理瀏覽器的請求。一旦請求執行結束,servlet會把響應發送給客戶端。這裡看下如何在JSP中獲取請求參數。

19.JSP有什麼優點?

下面列出了使用JSP的優點:

· JSP頁面是被動態編譯成Servlet的,因此,開發者可以很容易的更新展現代碼。

· JSP頁面可以被預編譯。

· JSP頁面可以很容易的和靜態模板結合,包括:HTML或者XML,也可以很容易的和產生動態內容的代碼結合起來。

· 開發者可以提供讓頁面設計者以類XML格式來訪問的自定義的JSP標籤庫。

·20.接口和抽象類的區別是什麼?

·從設計層面來說,抽象是對類的抽象,是一種模板設計,接口是行為的抽象,是一種行為的規範。

Java提供和支持創建抽象類和接口。它們的實現有共同點,不同點在於:

接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。

類可以實現很多個接口,但是隻能繼承一個抽象類

抽象類可以在不提供接口方法實現的情況下實現接口。

Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。

接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調用的。

也可以參考JDK8中抽象類和接口的區別

·21.Java中的HashMap的工作原理是什麼?

·我們知道在Java中最常用的兩種結構是數組和模擬指針(引用),幾乎所有的數據結構都可以利用這兩種來組合實現,HashMap也是如此。實際上HashMap是一個“鏈表散列”,如下是它數據結構:最左側是一個數組,數組中的每一個元素都是一個鏈表,鏈表的每一個元素都是entry。

·HashMap是基於hashing的原理,我們使用put(key, value)存儲對象到HashMap中,使用get(key)從HashMap中獲取對象。當我們給put()方法傳遞鍵和值時,我們先對鍵調用hashCode()方法,返回的hashCode用於找到bucket位置來儲存Entry對象。

·22、訪問修飾符public,private,protected,以及不寫(默認)時的區別?

·答:區別如下:

·作用域 當前類 同包子類其他

·public √ √ √ √

·protected √ √ √ ×

·default √ √ × ×

·private √ × × ×

·類的成員不寫訪問修飾時默認為default。默認對於同一個包中的其他類相當於公開(public),對於不是同一個包中的其他類相當於私有(private)。受保護(protected)對子類相當於公開,對不是同一包中的沒有父子關係的類相當於私有。

·23、int 和Integer 有什麼區別

·答:Java是一個近乎純潔的面向對象編程語言,但是為了編程的方便還是引入不是對象的基本數據類型,但是為了能夠將這些基本數據類型當成對象操作,Java為每一個基本數據類型都引入了對應的包裝類型(wrapper class),int的包裝類就是Integer,從JDK 1.5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。

·Java 為每個原始類型提供了包裝類型:

·原始類型: boolean,char,byte,short,int,long,float,double

·包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

·24、構造器(constructor)是否可被重寫(override)

·答:構造器不能被繼承,因此不能被重寫,但可以被重載。

·25、重載(Overload)和重寫(Override)的區別。重載的方法能否根據返回類型進行區分

·26、靜態變量和實例變量的區別?

·答:靜態變量是被static修飾符修飾的變量,也稱為類變量,它屬於類,不屬於類的任何一個對象,一個類不管創建多少個對象,靜態變量在內存中有且僅有一個拷貝;實例變量必須依存於某一實例,需要先創建對象然後通過對象才能訪問到它。靜態變量可以實現讓多個對象共享內存。在Java開發中,上下文類和工具類中通常會有大量的靜態成員。

·31、String s=new String(“xyz”);創建了幾個字符串對象?

·答:兩個對象,一個是靜態存儲區的"xyz",一個是用new創建在堆上的對象。

·36、Java 中的final關鍵字有哪些用法?

·

·答:(1)修飾類:表示該類不能被繼承;(2)修飾方法:表示方法不能被重寫;(3)修飾變量:表示變量只能一次賦值以後值不能被修改(常量)

·49、列出一些你常見的運行時異常?

·答:

·ArithmeticException(算術異常)

·ClassCastException (類轉換異常)

·IllegalArgumentException (非法參數異常)

·IndexOutOfBoundsException (下表越界異常)

·NullPointerException (空指針異常)

·SecurityException (安全異常)

·

7、request.getParameter()和request.getAttribute()的區別?

·答:

·a、request.getParameter()獲取的類型是String;

· request.getAttribute()獲取的類型是Object

·b、request.getPrameter()獲取的是POST/GET傳遞的參數值和URL中的參數;

· request.getAttribute()獲取的是對象容器中的數據值/對象

·c、request.setAttribute()和request.getAttribute()可以發送、接收對象;

· request.getParamter()只能接收字符串,官方不開放request.setParamter()(也就是沒有這個方法)

· setAttribute()和getAttribute()的傳參原理:

· setAttribute()是應用服務器把這個對象放在該頁面所對應的一塊內存中去,當你的頁面服務器重定向到另外一個頁面時,

· 應用服務器會把這塊內存拷貝到另一個頁面所對應的那塊內存中。這個就可以通過getAttribute()獲取到相應的參數值或者對象。

·13、JSP和Servlet有哪些相同點和不同點,他們之間的聯繫是什麼?

·答:JSP是Servlet的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"類Servlet"。Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在java文件中,並且完全從表示層中的HTML裡分離開來。而JSP的情況是java和HTML可以組合成一個擴展名為.jsp的文件。JSP偏重於視圖,Servlet偏重於業務邏輯。

·14、詳細描述MVC。

·答:基於java的web應用系統採用MVC設計模型,即用Model(模型)、View(視圖)和Controller(控制)分離設計,這是目前web應用服務系統的主流設置方向。

· Model:處理業務邏輯的模塊。

· View:負責頁面顯示,顯示Model的處理結果給用戶,主要實現數據到頁面的轉換過程。

· Controller:負責每個請求的分發,把Form數據傳遞給Model進行處理,處理完成後,把處理結果返回給相應的View顯示給用戶。

·20、JSP的四種範圍?

·答:a、page是代表一個頁面相關的對象和屬性。一個頁面由一個編譯好的java servlet類(可以帶有include指令,但不可以帶有include動作)表示。這既包括servlet又包括編譯成servlet的jsp頁面。

· b、request是代表與web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個web組件(由於forware指令和include動作的關係)

· c、session是代表與用於某個web客戶機的一個用戶體驗相關的對象和屬性。一個web回話也可以經常跨域多個客戶機請求。

· d、application是代表與整個web應用程序相關的對象和屬性。這實質上是跨域整個web應用程序,包括多個頁面、請求和回話的一個全局作用域。

·30、JSP頁面是如何被執行的?JSP執行效率比Servlet低嗎?

·答:當客戶端向一個JSP頁面發出請求時,Web Container將JSP轉換成Servlet的源代碼(只是第一次請求時),然後編譯轉化後的Servlet並加載到內存中執行,執行的結果Response到客戶端。

·JSP只在第一次執行的時候會轉化為Servlet,以後的每次執行Web容器都是直接執行編譯後的Servlet,所有JSP和Servlet只有第一次執行的時候不一樣,JSP慢一點,以後的執行都是相同的。


分享到:


相關文章: