1. 程式人生 > >java面試筆試知識點----深度瞭解

java面試筆試知識點----深度瞭解

一、java相關的

1、ArrayList深入瞭解:

三種方式來初始化:
(1)預設建構函式,使用初始容量10構造一個空列表(無引數構造)。
elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
(2)帶初始容量引數initialCapacity的建構函式。
☆如果引數等於0,建立空陣列;
elementData = EMPTY_ELEMENTDATA;
☆如果引數大於0,建立initialCapacity大小的陣列:
elementData = new Object[initialCapacity];
☆如果引數小於0,拋異常
(3)構造包含指定collection元素的列表,這些元素利用該集合的迭代器按順序返回
elementData = c.toArray();
elementData = Arrays.copyOf(elementData, size, Object[].class);

2、HashMap

JDK1.8 之前 HashMap 由 陣列+連結串列 組成的,陣列是 HashMap 的主體,連結串列則是主要為了解決雜湊衝突而存在的(“拉鍊法”解決衝突)。

JDK1.8 以後在解決雜湊衝突時有了較大的變化,當連結串列長度大於閾值(預設為 8)時,將連結串列轉化為紅黑樹,以減少搜尋時間。

HashMap 通過 key 的 hashCode 經過擾動函式處理過後得到 hash 值,然後通過 (n - 1) & hash 判斷當前元素存放的位置(這裡的 n 指的時陣列的長度),如果當前位置存在元素的話,就判斷該元素與要存入的元素的 hash 值以及 key 是否相同,如果相同的話,直接覆蓋,不相同就通過拉鍊法解決衝突。

3、Servlet總結

(1)在Java Web程式中,Servlet主要負責接收使用者請求HttpServletRequest,在doGet(),doPost()中做相應的處理,並將迴應HttpServletResponse反饋給使用者。

Servlet可以設定初始化引數,供Servlet內部使用。

一個Servlet類只會有一個例項,在它初始化時呼叫init()方法,銷燬時呼叫destroy()方法。Servlet需要在web.xml中配置(MyEclipse中建立Servlet會自動配置),一個Servlet可以設定多個URL訪問。Servlet不是執行緒安全,因此要謹慎使用類變數。
(2)get和post請求的區別
get請求用來從伺服器上獲得資源,而post是用來向伺服器提交資料。

get將表單中資料按照name=value的形式,新增到action 所指向的URL 後面,並且兩者使用"?“連線,而各個變數之間使用”&"連線;post是將表單中的資料放在HTTP協議的請求頭或訊息體中,傳遞到action所指向URL;

get傳輸的資料要受到URL長度限制,而post可以傳輸大量的資料

4、轉發(Forward)和重定向(Redirect)的區別

轉發是伺服器行為,重定向是客戶端行為。

從位址列顯示來說
forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道伺服器傳送的內容從哪裡來的,所以它的位址列還是原來的地址. redirect是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以位址列顯示的是新的URL.

從資料共享來說
forward:轉發頁面和轉發到的頁面可以共享request裡面的資料. redirect:不能共享資料.

從運用地方來說
forward:一般用於使用者登陸的時候,根據角色轉發到相應的模組. redirect:一般用於使用者登出登陸時返回主頁面和跳轉到其它的網站等

從效率來說
forward:高. redirect:低.

5、Servlet與執行緒安全

Servlet不是執行緒安全的,多執行緒併發的讀寫會導致資料不同步的問題。 解決的辦法是儘量不要定義name屬性,而是要把name變數分別定義在doGet()和doPost()方法內。

雖然使用synchronized(name){}語句塊可以解決問題,但是會造成執行緒的等待,不是很科學的辦法。

注意:多執行緒的併發的讀寫Servlet類屬性會導致資料不同步。但是如果只是併發地讀取屬性而不寫入,則不存在資料不同步的問題。因此Servlet裡的只讀屬性最好定義為final型別的。

6、如何控制Servlet的執行緒安全性?

避免使用例項變數
避免使用非執行緒安全的集合
在多個Servlet中對某個外部物件(例如檔案)的修改是務必加鎖(Synchronized,或者ReentrantLock),互斥訪問。
屬性的執行緒安全:ServletContext、HttpSession是執行緒安全的;ServletRequest是非執行緒安全的。

7、JSP和Servlet是什麼關係

Servlet是一個特殊的Java程式,它運行於伺服器的JVM中,能夠依靠伺服器的支援向瀏覽器提供顯示內容。

JSP本質上是Servlet的一種簡易形式,JSP會被伺服器處理成一個類似於Servlet的Java程式,可以簡化頁面內容的生成。

Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java檔案中,並且完全從表示層中的HTML分離開來。而JSP的情況是Java和HTML可以組合成一個副檔名為.jsp的檔案。JSP側重於檢視,Servlet更側重於控制邏輯,在MVC架構模式中,JSP適合充當檢視(view)而Servlet適合充當控制器(controller)。

8、JSP有9個內建物件

request:封裝客戶端的請求,其中包含來自GET或POST請求的引數;
response:封裝伺服器對客戶端的響應;
pageContext:通過該物件可以獲取其他物件;
session:封裝使用者會話的物件;
application:封裝伺服器執行環境的物件;
out:輸出伺服器響應的輸出流物件;
config:Web應用的配置物件;
page:JSP頁面本身(相當於Java程式中的this);
exception:封裝頁面丟擲異常的物件。

9、request.getAttribute()和 request.getParameter()有何區別

從獲取方向來看:
getParameter()是獲取 POST/GET 傳遞的引數值;
getAttribute()是獲取物件容器中的資料值;

從用途來看:
getParameter用於客戶端重定向時,即點選了連結或提交按扭時傳值用,即用於在用表單或url重定向傳值時接收資料用。
getAttribute用於伺服器端重定向時,即在 sevlet 中使用了 forward 函式,或 struts 中使用了 mapping.findForward。 getAttribute 只能收到程式用 setAttribute 傳過來的值。

另外,可以用 setAttribute,getAttribute 傳送接收物件.而 getParameter 顯然只能傳字串。 setAttribute 是應用伺服器把這個物件放在該頁面所對應的一塊記憶體中去,當你的頁面伺服器重定向到另一個頁面時,應用伺服器會把這塊記憶體拷貝另一個頁面所對應的記憶體中。這樣getAttribute就能取得你所設下的值,當然這種方法可以傳物件。session也一樣,只是物件在記憶體中的生命週期不一樣而已。getParameter只是應用伺服器在分析你送上來的 request頁面的文字時,取得你設在表單或 url 重定向時的值。

總結:

getParameter 返回的是String,用於讀取提交的表單中的值;(獲取之後會根據實際需要轉換為自己需要的相應型別,比如整型,日期型別啊等等)

getAttribute 返回的是Object,需進行轉換,可用setAttribute 設定成任意物件,使用很靈活,可隨時用

10、include 指令和 include 行為有什麼區別

<%@ include file=“檔案相對 url 地址” %>該指令在編譯之前先讀入指定的頁面中的內容(並不對動態內容求值),融合後的完整頁面再被整體的轉換為一個servlet。

<jsp:include page=“相對 URL 地址” flush=“true” />該行為並不是要引入指定頁面的實際內容,它將引入執行該引入頁面後所產生的應答
講解JSP中的四種作用域

11、JSP中的四種作用域包括page、request、session和application

page代表與一個頁面相關的物件和屬性。
request代表與Web客戶機發出的一個請求相關的物件和屬性。一個請求可能跨越多個頁面,涉及多個Web元件;需要在頁面顯示的臨時資料可以置於此作用域。
session代表與某個使用者與伺服器建立的一次會話相關的物件和屬性。跟某個使用者相關的資料應該放在使用者自己的session中。
application代表與整個Web應用程式相關的物件和屬性,它實質上是跨越整個Web應用程式,包括多個頁面、請求和會話的一個全域性作用域。