1. 程式人生 > >2017最新java工程師面試筆試題集錦(一)

2017最新java工程師面試筆試題集錦(一)

  找工作有一段時間啦,走了不少彎路;特此提醒,基礎很重要,筆試題是開啟大門的鑰匙;機會雖然很多,但一定要牢牢把握住每一次;擁有選擇的權利,不論是心情還是未來都將是無怨無悔的!

struts2:
Struts2是一個基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與檢視的資料互動。Struts 2的Action是一個請求對應一個例項(每次請求時都新new出一個物件),沒有執行緒安全方面的問題。

Struts 2 相比Struts 1的優點:

1、在軟體設計上Struts 2 沒有像Struts 1那樣跟Servlet API 和 struts API 有著緊密的耦合。
Struts 2的應用可以不依賴於Servlet API和Struts API 。

2、Struts 2 提供了攔截器,利用攔截器可以進行AOP程式設計。

3、Struts 2 提供了型別轉換器。

4、Struts 2 提供支援多種表現層技術,如:JSP 、 freeMarker等。

5、Struts 2 的輸入校驗可以指定方法進行校驗。

6、Struts 2 提供了全域性範圍、包範圍和Action範圍的國際化資原始檔管理實現。

JSP:

Jsp包含三個編譯指令和七個動作指令。

三個編譯指令為:page、include、taglib。

七個動作指令為:jsp:forward、jsp:param、jsp:include、jsp:plugin、jsp:useBean、jsp:setProperty、jsp:getProperty。

〈% @page

[language=”Java”]

[extends=”package.class”]

[import= “package. class I package. *},…”]

[session=”true I false”]

[buffer=”none I 8kb I size kb” 1

[autoFlush=”true I false”]

[isThreadSafe=”true I false”]

[info=”text”]

[errorPage=”relativeURL”]

[contentType=”mimeType[ ;charset=characterSet]” I”text/html;charset= “808859-1”]

[isErrorPage=” true I false”]

%〉

JSP中有三種形式的指令碼,要理解這三種指令碼,應該先理解JSP的執行模式,JSP檔案有兩種形態:設計時的JSP檔案和執行時態的Servlet,當用戶訪問一個JSP檔案的時候,這個JSP檔案首先會被編譯生成Servlet程式碼,然後這個Servlet會被編譯執行,從而產生動態頁面,所以JSP中的JAVA指令碼都會被作為Servlet類中的程式碼存在。


1.宣告式指令碼。jsp中編寫方式如下:<%!  %>。在<%! %>中的的變數和方法都是作為()類的成員存在的,所以這種指令碼稱作宣告式指令碼,用來宣告類的成員屬性和方法的。
2.普通指令碼。又稱作Jsp ScriptLet,jsp中編寫方式如下:<%  %>。在指令碼<% %>中的程式碼是作為servlet類的service方法的一部分存在的,即在<%%>中的變數是區域性變數,而不能編寫方法,因為java中不允許在方法中再直接定義方法,所以這種指令碼稱作普通指令碼,因為就是普通的java程式碼。
3.表示式指令碼。編寫方式如下:<%= %>。在jsp對應的servlet類的service方法中<%= %>中的內容是作為out.print()方法的引數存在的,作用是在瀏覽器頁面上輸出內容,所以<%= %>中必須是有結果的表示式用於輸出,所以這種指令碼稱作表示式指令碼。

一、String,StringBuffer, StringBuilder 的區別是什麼?String為什麼是不可變的?
1. String是字串常量,StringBuffer和StringBuilder是字串變數。StringBuffer是執行緒安全的,StringBuilder是非執行緒安全的。具體來說String是一個不可變的物件,每次修改String物件實際上是創新新物件,並將引用指向新物件。效率很低。StringBuffer是可變的,即每次修改只是針對其本身,大部分情況下比String效率高,StringBuffer保證同步(synchronized),所以執行緒安全。StringBuilder沒有實現同步,所以非執行緒安全。但效率應該比StringBuffer高。StringBuffer使用時最好指定容量,這樣會比不指定容量快30%-40%,甚至比不指定容量的StringBuilder還快。

二、VECTOR,ARRAYLIST, LINKEDLIST的區別是什麼?
vector是同步的,arraylist和linkedlist不是同步的。底層方面,vector與arraylist都是基於object[]array實現的,但考慮vector執行緒安全,所以arraylist效率上回比vector較快。元素隨機訪問上,vector與arraylist是基本相同的,時間複雜度是O(1),linkedlist的隨機訪問元素的複雜度為O(n)。但在插入刪除資料上,linkedlist則比arraylist要快很多。linkedlist比arraylist更佔記憶體,因為linkedlist每個節點上還要儲存對前後兩個節點的引用。

四、ConcurrentHashMap和HashTable的區別
兩者均應用於多執行緒中,但當HashTable增大到一定程度時,其效能會急劇下降。因為迭代時會被鎖很長時間。但ConcurrentHashMap則通過引入分割來保證鎖的個數不會很大。簡而言之就是HashTable會鎖住真個map,而ConcurrentHashMap則只需要鎖住map的一個部分。

五、Tomcat,apache,jboss的區別
Tomcat是servlet容器,用於解析jsp,servlet。是一個輕量級的高效的容器;缺點是不支援EJB,只能用於Java應用。
Apache是http伺服器(web伺服器),類似於IIS可以用來建立虛擬站點,編譯處理靜態頁面。支援SSL技術,支援多個虛擬主機等功能。
Jboss是應用伺服器,執行EJB的javaee應用伺服器,遵循javaee規範,能夠提供更多平臺的支援和更多整合功能,如資料庫連線,JCA等。其對servlet的支援是通過整合其他servlet容器來實現的。如tomcat。

七、SESSION, COOKIE區別
session資料放在伺服器上,cookie則放在客戶瀏覽器上。cookie不太安全,因為可以分析出本地cookie,並進行cookie欺騙,考慮安全應使用session。session會在一定時間內儲存在伺服器上,當訪問增多時,會比較佔用伺服器的效能,考慮減輕伺服器壓力則應該使用cookie。單個cookie保持的資料不超過4k,很多瀏覽器都限制要給站點最多儲存20個cookie。

八、Servlet的生命週期
主要分三個階段:初始化——呼叫init()方法,響應客戶請求階段——呼叫service()方法,終止階段——呼叫destroy方法。工作原理:客戶傳送一個請求,servlet呼叫service方法對請求進行響應,即對請求方式進行匹配,選擇呼叫doGet、doPost方法等,然後進入對於的方法中呼叫邏輯層的方法,實現對客戶的響應。自定義的servlet必須首先servlet介面。
具體生命週期包括:裝載Servlet、伺服器建立Servlet例項、伺服器呼叫Servlet的init()方法、客戶請求到達伺服器、伺服器建立請求物件、服務建立相應物件、伺服器啟用Servlet的service方法,請求物件和響應物件作為service()方法的引數、service()方法獲得關於請求物件的資訊,處理請求,訪問其他資源,獲得需要的資訊、service()方法可能啟用其他方法以處理請求,如doGet(),doPost()

九、HTTP 報文包含內容
(請求行,請求頭部,請求正文)
請求方法包括GET,POST,HEAD,PUT,TRACE,OPTIONS,DELETE。請求頭如:Host、User-Agent、Connection、Accept-Charset等。請求頭部的最後會有一個空行,表示請求頭部結束,接下來為請求正文,這一行非常重要,必不可少。請求正文為可選部分,如get就沒有。

十、Statement與PreparedStatement的區別,什麼是SQL注入,如何防止SQL注入
使用PreparedStatement可以提升程式碼的可讀性和可維護性,可以盡最大可能提高效能。因為Statement每次執行一個SQL命令都會對其編譯,但PreparedStatement則只編譯一次。PreparedStatement就類似於流水線生產。另一方面PreparedStatement可以極大提高安全性:它對傳遞過來的引數進行了強制引數型別轉換,確保插入或查詢資料時,與底層資料庫格式匹配。
SQL注入:就是通過將sql命令插入到web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意SQL命令。如sql命令:select id from test where name=’1’ or 1=1; drop table test,但用PreparedStatement就可以避免這種問題。

十一、redirect, forward區別
redirect:伺服器根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址。所以位址列顯示是新的url。forward是指伺服器請求資源,直接訪問目標地址url,把響應的內容讀取過來並再傳送給瀏覽器,瀏覽器並不知道資源從哪裡來,所以位址列不變。
redirect不能共享資料,forward轉發頁面和轉發到頁面可以貢獻request中的資料。redirect用於登出,forward用於登陸。forward效率高於redirect。

十、Statement與PreparedStatement的區別,什麼是SQL注入,如何防止SQL注入
使用PreparedStatement可以提升程式碼的可讀性和可維護性,可以盡最大可能提高效能。因為Statement每次執行一個SQL命令都會對其編譯,但PreparedStatement則只編譯一次。PreparedStatement就類似於流水線生產。另一方面PreparedStatement可以極大提高安全性:它對傳遞過來的引數進行了強制引數型別轉換,確保插入或查詢資料時,與底層資料庫格式匹配。
SQL注入:就是通過將sql命令插入到web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意SQL命令。如sql命令:select id from test where name=’1’ or 1=1; drop table test,但用PreparedStatement就可以避免這種問題。

十二、關於JAVA記憶體模型,一個物件(兩個屬性,四個方法)例項化100次,現在記憶體中的儲存狀態,幾個物件,幾個屬性,幾個方法。
Java新建的物件都放在堆裡,如果例項化100次,堆中產生100個物件,一般物件與其屬性和方法屬於一個整體,但如果屬性和方法是靜態的,則屬性和方法只在記憶體中存一份。

mysql連線資料庫
Class.forName(“com.sql.jdbc.Driver”);
Connection ct=DriverManager.getConnection (“jdbc:mysql://127.0.0.1:3360/first”,”root”,”123”);
PreparedStatement ps=ct.preparedStatement(sql);
ResultSet rs=ps.executeQuery();

float型float f=3.4是否正確?

不正確。精度不準確,應該用強制型別轉換,如下所示:float f=(float)3.4 或float f = 3.4f 在java裡面,沒小數點的預設是int,有小數點的預設是double;

structs

1.是一個框架(基於mvc的一個web框架)
2.
(規範化,效率高,可讀性好,可維護性增加;)

mvc模式(模式是一種思想)(model view control)
將資料的輸入,處理(model)和顯示分開(jsp)

對mvc的理解不同,寫程式時規範不統一,不利維護擴充套件效率,所以
有了統一的規範structs

structs執行原理:
使用者登入:

瀏覽器 web伺服器 ActionServlet(struts-config.xml) actionform Loginaction model jsp

static表示不要例項化就可以使用。被static修飾的成員變數和成員方法不依賴類特定的例項,被類的所有例項共享。

對於靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過物件來訪問(但是這是不推薦的)。
一般在需要實現以下兩個功能時使用靜態變數:
在物件之間共享值時(多個變數共享一個值:如所有學生公用一個變數學費)
方便訪問變數時

類變數是該類的所有物件共享的變數,任何一個該類的物件去訪問它時,取到的都是相同的值,任何一個該類的物件去修改它時,修改的也是同一個變數。

靜態區域塊只被執行一次,且自動執行不需例項化。利用靜態程式碼塊可以對一些static變數進行賦值。
類變數原則上用類方法去訪問;類方法中不許訪問非靜態變數,反之可以;靜態方法中不能用this和super關鍵字。

類方法屬於類相關的、公共的方法
static方法獨立於任何例項,static方法必須被實現,而不能是抽象的abstract。

一般類內部的static方法也是方便其它類對該方法的呼叫。

如果一個成員被宣告為static,它就能夠在它的類的任何物件建立之前被訪問,而不必引用任何物件。

spring

Spring是全面的和模組化的。Spring有分層的體系結構,你能選擇使用它孤立的任何部分,它的架構仍然是內在穩定的。
Spring作為開源的中介軟體,獨立於各種應用伺服器,甚至無須應用伺服器的支援,也能提供應用伺服器的功能,如宣告式事務、事務處理等。
Spring致力於J2EE應用的各層的解決方案,而不是僅僅專注於某一層的方案。可以說Spring是企業應用開發的“一站式”選擇,並貫穿表現層、業務層及持久層。然而,Spring並不想取代那些已有的框架,而是與它們無縫地整合。

輕量、控制反轉ioc、面向切面、容器、框架、mvc

servlet生命週期:建立例項,init初始化,service方法處理,destroy方法銷燬。

int 是基本型別,直接存數值
integer是物件,用一個引用指向這個物件(一個類)

int i =1;
Integer i= new Integer(1);(要把integer 當做一個類看)

Integer 是一個類,是int的擴充套件,定義了很多的轉換方法
類似的還有:float Float;double Double;string String等

舉個例子:當需要往ArrayList,HashMap中放東西時,像int,double這種內建型別是放不進去的,因為容器都是裝object的,這是就需要這些內建型別的外覆類了。
Java中每種內建型別都有相應的外覆類。

Java中int和Integer關係是比較微妙的。關係如下:

1.int是基本的資料型別;
2.Integer是int的封裝類;
3.int和Integer都可以表示某一個數值;
4.int和Integer不能夠互用,因為他們兩種不同的資料型別;

引入的原因:為了在各種型別間轉化,通過各種方法的呼叫。否則 你無法直接通過變數轉化。
比如,現在int要轉為String
int a=0;
String result=Integer.toString(a);
在java中包裝類,比較多的用途是用在於各種資料型別的轉化中。

JVM是一個”橋樑“,是一個”中介軟體“,是實現跨平臺的關鍵,Java程式碼首先被編譯成位元組碼檔案,再由JVM將位元組碼檔案翻譯成機器語言,從而達到執行Java程式的目的。
JVM 有一個選項,可以將使用最頻繁的位元組碼翻譯成機器碼並儲存,這一過程被稱為即時編譯。這種方式確實很有效,
JVM 自己的命令集,JVM 的命令集則是可以到處執行的,因為 JVM 做了翻譯,根據不同的CPU ,翻譯成不同的機器語言。
Java 中的所有類,必須被裝載到 JVM 中才能執行,這個裝載工作是由 JVM 中的類裝載器完成的,類裝載器所做的工作實質是把類檔案從硬碟讀取到記憶體中。
  2. Java中的類大致分為三種:
  a) 系統類
  b) 擴充套件類
  c) 由程式設計師自定義的類
  3. 類裝載方式,有兩種:
  a) 隱式裝載,程式在執行過程中當碰到通過 new 等方式生成物件時,隱式呼叫類裝載器載入對應的類到jvm中。
  b) 顯式裝載,通過 class.forName() 等方法,顯式載入需要的類。