JAVA面試題1.開發(fā)中都用到了那些設(shè)計(jì)模式?用在什么場(chǎng)合? 每個(gè)模式都描述了一個(gè)在我們的環(huán)境中不斷出現(xiàn)的問(wèn)題,然后描述了該問(wèn)題的解決方案的核心。通過(guò)這種方式,你可以無(wú)數(shù)次地使用那些已有的解決方案,無(wú)需在重復(fù)相同的工作。主要用到了MVC的設(shè)計(jì)模式。用來(lái)開發(fā)JSP/Servlet或者J2EE的相關(guān)應(yīng)用。簡(jiǎn)單工廠模式等。 2. 說(shuō)說(shuō)你所熟悉或聽說(shuō)過(guò)的j2ee中的幾種常用模式?及對(duì)設(shè)計(jì)模式的一些看法 Session Facade Pattern:使用SessionBean訪問(wèn)EntityBean Message Facade Pattern:實(shí)現(xiàn)異步調(diào)用 EJB Command Pattern:使用Command JavaBeans取代SessionBean,實(shí)現(xiàn)輕量級(jí)訪問(wèn) Data Transfer Object Factory:通過(guò)DTO Factory簡(jiǎn)化EntityBean數(shù)據(jù)提供特性 Generic Attribute Access:通過(guò)AttibuteAccess接口簡(jiǎn)化EntityBean數(shù)據(jù)提供特性 Business Interface:通過(guò)遠(yuǎn)程(本地)接口和Bean類實(shí)現(xiàn)相同接口規(guī)范業(yè)務(wù)邏輯一致性 EJB架構(gòu)的設(shè)計(jì)好壞將直接影響系統(tǒng)的性能、可擴(kuò)展性、可維護(hù)性、組件可重用性及開發(fā)效率。項(xiàng)目越復(fù)雜,項(xiàng)目隊(duì)伍越龐大則越能體現(xiàn)良好設(shè)計(jì)的重要性。 3. j2ee常用的設(shè)計(jì)模式?說(shuō)明工廠模式。 Java中的23種設(shè)計(jì)模式: Factory(工廠模式), Builder(建造模式), Factory Method(工廠方法模式), Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式), Adapter(適配器模式), Bridge(橋梁模式), Composite(合成模式), Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解釋器模式), Visitor(訪問(wèn)者模式), Iterator(迭代子模式), Mediator(調(diào)停者模式), Memento(備忘錄模式), Observer(觀察者模式), State(狀態(tài)模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(責(zé)任鏈模式) 工廠模式:工廠模式是一種經(jīng)常被使用到的模式,根據(jù)工廠模式實(shí)現(xiàn)的類可以根據(jù)提供的數(shù)據(jù)生成一組類中某一個(gè)類的實(shí)例,通常這一組類有一個(gè)公共的抽象父類并且實(shí)現(xiàn)了相同的方法,但是這些方法針對(duì)不同的數(shù)據(jù)進(jìn)行了不同的操作。首先需要定義一個(gè)基類,該類的子類通過(guò)不同的方法實(shí)現(xiàn)了基類中的方法。然后需要定義一個(gè)工廠類,工廠類可以根據(jù)條件生成不同的子類實(shí)例。當(dāng)?shù)玫阶宇惖膶?shí)例后,開發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返回的是哪一個(gè)子類的實(shí)例。 4. 概述MVC體系結(jié)構(gòu)。 答:MVC包括三類對(duì)象,model是應(yīng)用對(duì)象,view是視圖,controller是控制器,它定義用戶界面對(duì)用戶輸入的響應(yīng)方式。 在MVC體系中,模型通常被稱為"業(yè)務(wù)邏輯",是真正完成任務(wù)的代碼,視圖就是使用界面,反映數(shù)據(jù)的變化。控制器控制著模型和視圖之間的交互過(guò)程,它決定著向用戶返回怎樣的視圖、檢查通過(guò)界面輸入的信息以及選擇處理輸入信息的模型 在MVC中,表示層和邏輯層分離,各部分可相互獨(dú)立進(jìn)行開發(fā),便于開發(fā)和維護(hù),提高了開發(fā)效率。 5. 寫一段Jdbc連Oracle的程序,并實(shí)現(xiàn)數(shù)據(jù)查詢. package hello.ant; import java.sql.*; public class jdbc { String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String theUser="admin"; String thePw="manager"; Connection c=null; Statement conn; ResultSet rs=null; public jdbc() { try{ Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); c = DriverManager.getConnection(dbUrl,theUser,thePw); conn=c.createStatement(); }catch(Exception e){ e.printStackTrace(); } } public boolean executeUpdate(String sql) { try { conn.executeUpdate(sql); return true; } catch (SQLException e) { e.printStackTrace(); return false; } } public ResultSet executeQuery(String sql) { rs=null; try { rs=conn.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } public void close() { try { conn.close(); c.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { ResultSet rs; jdbc conn = new jdbc(); rs=conn.executeQuery("select * from test"); try { while (rs.next()) { System.out.println(rs.getString("id")); System.out.println(rs.getString("name")); } }catch(Exception e) { e.printStackTrace(); } } } 6. EJB與JAVA BEAN的區(qū)別? Java Bean 是可復(fù)用的組件,對(duì)Java Bean并沒有嚴(yán)格的規(guī)范,理論上講,任何一個(gè)Java類都可以是一個(gè)Bean。但通常情況下,由于Java Bean是被容器所創(chuàng)建(如Tomcat)的,所以Java Bean應(yīng)具有一個(gè)無(wú)參的構(gòu)造器,另外,通常Java Bean還要實(shí)現(xiàn)Serializable接口用于實(shí)現(xiàn)Bean的持久性。Java Bean實(shí)際上相當(dāng)于微軟COM模型中的本地進(jìn)程內(nèi)COM組件,它是不能被跨進(jìn)程訪問(wèn)的。Enterprise Java Bean 相當(dāng)于DCOM,即分布式組件。它是基于Java的遠(yuǎn)程方法調(diào)用(RMI)技術(shù)的,所以EJB可以被遠(yuǎn)程訪問(wèn)(跨進(jìn)程、跨計(jì)算機(jī))。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問(wèn)真正的EJB組件,而是通過(guò)其容器訪問(wèn)。EJB容器是EJB組件的代理,EJB組件由容器所創(chuàng)建和管理。客戶通過(guò)容器來(lái)訪問(wèn)真正的EJB組件 7. 你在項(xiàng)目中用到了xml技術(shù)的哪些方面?如何實(shí)現(xiàn)的? 用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺(tái)時(shí),將不同數(shù)據(jù)源的數(shù)據(jù)組裝成XML文件,然后將XML文件壓縮打包加密后通過(guò)網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后再同XML文件中還原相關(guān)信息進(jìn)行處理。在做軟件配置時(shí),利用XML可以很方便的進(jìn)行,軟件的各種配置參數(shù)都存貯在XML文件中。 8. Class.forName的作用?為什么要用? 調(diào)用該訪問(wèn)返回一個(gè)以字符串指定類名的類的對(duì)象。 9. Servlet執(zhí)行時(shí)一般實(shí)現(xiàn)哪幾個(gè)方法? public void init(ServletConfig config) public ServletConfig getServletConfig() public String getServletInfo() public void service(ServletRequest request,ServletResponse response) public void destroy() 10. Request對(duì)象的主要方法 setAttribute(String name,Object):設(shè)置名字為name的request的參數(shù)值 getAttribute(String name):返回由name指定的屬性值 getAttributeNames():返回request對(duì)象所有屬性的名字集合,結(jié)果是一個(gè)枚舉的實(shí)例 getCookies():返回客戶端的所有Cookie對(duì)象,結(jié)果是一個(gè)Cookie數(shù)組 getCharacterEncoding():返回請(qǐng)求中的字符編碼方式 getContentLength():返回請(qǐng)求的Body的長(zhǎng)度 getHeader(String name):獲得HTTP協(xié)議定義的文件頭信息 getHeaders(String name):返回指定名字的request Header的所有值,結(jié)果是一個(gè)枚舉的實(shí)例 getHeaderNames():返回所以request Header的名字,結(jié)果是一個(gè)枚舉的實(shí)例 getInputStream():返回請(qǐng)求的輸入流,用于獲得請(qǐng)求中的數(shù)據(jù) getMethod():獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法 getParameter(String name):獲得客戶端傳送給服務(wù)器端的有name指定的參數(shù)值 getParameterNames():獲得客戶端傳送給服務(wù)器端的所有參數(shù)的名字,結(jié)果是一個(gè)枚舉的實(shí)例 getParameterValues(String name):獲得有name指定的參數(shù)的所有值 getProtocol():獲取客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱 getQueryString():獲得查詢字符串 getRequestURI():獲取發(fā)出請(qǐng)求字符串的客戶端地址 getRemoteAddr():獲取客戶端的IP地址 getRemoteHost():獲取客戶端的名字 getSession([Boolean create]):返回和請(qǐng)求相關(guān)Session getServerName():獲取服務(wù)器的名字 getServletPath():獲取客戶端所請(qǐng)求的腳本文件的路徑 getServerPort():獲取服務(wù)器的端口號(hào) removeAttribute(String name):刪除請(qǐng)求中的一個(gè)屬性 11. 四種會(huì)話跟蹤技術(shù) 會(huì)話作用域ServletsJSP 頁(yè)面描述 page否是代表與一個(gè)頁(yè)面相關(guān)的對(duì)象和屬性。一個(gè)頁(yè)面由一個(gè)編譯好的 Java servlet 類(可以帶有任何的 include 指令,但是沒有 include 動(dòng)作)表示。這既包括 servlet 又包括被編譯成 servlet 的 JSP 頁(yè)面 request是是代表與 Web 客戶機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性。一個(gè)請(qǐng)求可能跨越多個(gè)頁(yè)面,涉及多個(gè) Web 組件(由于 forward 指令和 include 動(dòng)作的關(guān)系) session是是代表與用于某個(gè) Web 客戶機(jī)的一個(gè)用戶體驗(yàn)相關(guān)的對(duì)象和屬性。一個(gè) Web 會(huì)話可以也經(jīng)常會(huì)跨越多個(gè)客戶機(jī)請(qǐng)求 application是是代表與整個(gè) Web 應(yīng)用程序相關(guān)的對(duì)象和屬性。這實(shí)質(zhì)上是跨越整個(gè) Web 應(yīng)用程序,包括多個(gè)頁(yè)面、請(qǐng)求和會(huì)話的一個(gè)全局作用域 12. JSP和Servlet有哪些相同點(diǎn)和不同點(diǎn),他們之間的聯(lián)系是什么? JSP是Servlet技術(shù)的擴(kuò)展,本質(zhì)上是Servlet的簡(jiǎn)易方式,更強(qiáng)調(diào)應(yīng)用的外表表達(dá)。JSP編譯后是"類servlet"。Servlet和 JSP最主要的不同點(diǎn)在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來(lái)。而JSP的情況是Java和HTML 可以組合成一個(gè)擴(kuò)展名為.jsp的文件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯。 13. servlet的生命周期 web容器加載servlet,生命周期開始。通過(guò)調(diào)用servlet的init()方法進(jìn)行servlet的初始化。通過(guò)調(diào)用service()方法實(shí)現(xiàn),根據(jù)請(qǐng)求的不同調(diào)用不同的do***()方法。結(jié)束服務(wù),web容器調(diào)用servlet的destroy()方法。 14. 什么情況下調(diào)用doGet()和doPost()? Jsp頁(yè)面中的form標(biāo)簽里的method屬性為get時(shí)調(diào)用doGet(),為post時(shí)調(diào)用doPost()。 15. Servlet的基本架構(gòu) public class ServletName extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } } 16. JAVA SERVLET API中forward() 與redirect()的區(qū)別? 前者僅是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址;后者則是完全的跳轉(zhuǎn),瀏覽器將會(huì)得到跳轉(zhuǎn)的地址,并重新發(fā)送請(qǐng)求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時(shí),盡量使用forward()方法,并且,這樣也有助于隱藏實(shí)際的鏈接。在有些情況下,比如,需要跳轉(zhuǎn)到一個(gè)其它服務(wù)器上的資源,則必須使用sendRedirect()方法。 17. JSP的內(nèi)置對(duì)象及方法。 request表示HttpServletRequest對(duì)象。它包含了有關(guān)瀏覽器請(qǐng)求的信息,并且提供了幾個(gè)用于獲取cookie, header, 和session數(shù)據(jù)的有用的方法。 response表示HttpServletResponse對(duì)象,并提供了幾個(gè)用于設(shè)置送回 瀏覽器的響應(yīng)的方法(如cookies,頭信息等) out對(duì)象是javax.jsp.JspWriter的一個(gè)實(shí)例,并提供了幾個(gè)方法使你能用于向?yàn)g覽器回送輸出結(jié)果。 pageContext表示一個(gè)javax.servlet.jsp.PageContext對(duì)象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對(duì)象的API,并且包裝了通用的servlet相關(guān)功能的方法。 session表示一個(gè)請(qǐng)求的javax.servlet.http.HttpSession對(duì)象。Session可以存貯用戶的狀態(tài)信息 applicaton 表示一個(gè)javax.servle.ServletContext對(duì)象。這有助于查找有關(guān)servlet引擎和servlet環(huán)境的信息 config表示一個(gè)javax.servlet.ServletConfig對(duì)象。該對(duì)象用于存取servlet實(shí)例的初始化參數(shù)。 page表示從該頁(yè)面產(chǎn)生的一個(gè)servlet實(shí)例 18. 兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別? 有兩種,分別為: <jsp:include page="included.jsp" flush="true"> <jsp:forward page= "nextpage.jsp"/> 前者頁(yè)面不會(huì)轉(zhuǎn)向include所指的頁(yè)面,只是顯示該頁(yè)的結(jié)果,主頁(yè)面還是原來(lái)的頁(yè)面。執(zhí)行完后還會(huì)回來(lái),相當(dāng)于函數(shù)調(diào)用。并且可以帶參數(shù).后者完全轉(zhuǎn)向新頁(yè)面,不會(huì)再回來(lái)。相當(dāng)于go to 語(yǔ)句。 19. JSP中動(dòng)態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別? 動(dòng)態(tài)INCLUDE用jsp:include動(dòng)作實(shí)現(xiàn)。<jsp:include page="included.jsp" flush="true" />它總是會(huì)檢查所含文件中的變化,適合用于包含動(dòng)態(tài)頁(yè)面,并且可以帶參數(shù) 靜態(tài)INCLUDE用include偽碼實(shí)現(xiàn),定不會(huì)檢查所含文件的變化,適用于包含靜態(tài)頁(yè)面:<%@ include file="included.htm" %> 20. jsp有哪些動(dòng)作?作用分別是什么? JSP共有以下6種基本動(dòng)作: jsp:include:在頁(yè)面被請(qǐng)求的時(shí)候引入一個(gè)文件。 jsp:useBean:尋找或者實(shí)例化一個(gè)JavaBean。 jsp:setProperty:設(shè)置JavaBean的屬性。 jsp:getProperty:輸出某個(gè)JavaBean的屬性。 jsp:forward:把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁(yè)面。 jsp:plugin:根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標(biāo)記 21. jsp有哪些內(nèi)置對(duì)象?作用分別是什么? JSP共有以下9種基本內(nèi)置組件(可與ASP的6種內(nèi)部組件相對(duì)應(yīng)): request 用戶端請(qǐng)求,此請(qǐng)求會(huì)包含來(lái)自GET/POST請(qǐng)求的參數(shù) response 網(wǎng)頁(yè)傳回用戶端的回應(yīng) pageContext 網(wǎng)頁(yè)的屬性是在這里管理 session 與請(qǐng)求有關(guān)的會(huì)話期 application servlet正在執(zhí)行的內(nèi)容 out 用來(lái)傳送回應(yīng)的輸出 config servlet的構(gòu)架部件 page JSP網(wǎng)頁(yè)本身 exception 針對(duì)錯(cuò)誤網(wǎng)頁(yè),未捕捉的例外 22. 啟動(dòng)一個(gè)線程是用run()還是start()? 啟動(dòng)一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會(huì)立即運(yùn)行。run()方法可以產(chǎn)生必須退出的標(biāo)志來(lái)停止一個(gè)線程。 23. 說(shuō)出一些常用的類,包,接口,請(qǐng)各舉5個(gè) 常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer 常用的包:java.lang java.awt java.io java.util java.sql 常用的接口:Remote List Map Runnable Serializable ActionListener 24. List、Map、Set三個(gè)接口,存取元素時(shí),各有什么特點(diǎn)? List 以特定次序來(lái)持有元素,可有重復(fù)元素。Set 無(wú)法擁有重復(fù)元素,內(nèi)部排序。Map 保存key-value值,value可多值。 25. 什么是java序列化,如何實(shí)現(xiàn)java序列化? 序列化就是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化??梢詫?duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫操作時(shí)所引發(fā)的問(wèn)題。 序列化的實(shí)現(xiàn):將需要被序列化的類實(shí)現(xiàn)Serializable接口,該接口沒有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的,然后使用一個(gè)輸出流(如:FileOutputStream)來(lái)構(gòu)造一個(gè) ObjectOutputStream(對(duì)象流)對(duì)象,接著,使用ObjectOutputStream對(duì)象的writeObject(Object obj)方法就可以將參數(shù)為obj的對(duì)象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。 26. 垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存嗎?有什么辦法主動(dòng)通知虛擬機(jī)進(jìn)行垃圾回收 對(duì)于GC來(lái)說(shuō),當(dāng)程序員創(chuàng)建對(duì)象時(shí),GC就開始監(jiān)控這個(gè)對(duì)象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對(duì)象。通過(guò)這種方式確定哪些對(duì)象是"可達(dá)的",哪些對(duì)象是"不可達(dá)的"。當(dāng)GC確定一些對(duì)象為"不可達(dá)"時(shí),GC就有責(zé)任回收這些內(nèi)存空間??梢?。程序員可以手動(dòng)執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語(yǔ)言規(guī)范并不保證GC一定會(huì)執(zhí)行。 27. java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請(qǐng)說(shuō)出他們分別是哪些類? 字節(jié)流,字符流。字節(jié)流繼承于InputStream OutputStream,字符流繼承于InputStreamReader OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。 28. JAVA語(yǔ)言如何進(jìn)行異常處理,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎? ava通過(guò)面向?qū)ο蟮姆椒ㄟM(jìn)行異常處理,把各種不同的異常進(jìn)行分類,并提供了良好的接口。在Java中,每個(gè)異常都是一個(gè)對(duì)象,它是 Throwable類或其它子類的實(shí)例。當(dāng)一個(gè)方法出現(xiàn)異常后便拋出一個(gè)異常對(duì)象,該對(duì)象中包含有異常信息,調(diào)用這個(gè)對(duì)象的方法可以捕獲到這個(gè)異常并進(jìn)行處理。Java的異常處理是通過(guò)5個(gè)關(guān)鍵詞來(lái)實(shí)現(xiàn)的:try、catch、throw、throws和finally。一般情況下是用try來(lái)執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)會(huì)拋出(throws)一個(gè)異常,這時(shí)候你可以通過(guò)它的類型來(lái)捕捉(catch)它,或最后(finally)由缺省處理器來(lái)處理。 用try來(lái)指定一塊預(yù)防所有"異常"的程序。緊跟在try程序后面,應(yīng)包含一個(gè)catch子句來(lái)指定你想要捕捉的"異常"的類型。 throw語(yǔ)句用來(lái)明確地拋出一個(gè)"異常"。 throws用來(lái)標(biāo)明一個(gè)成員函數(shù)可能拋出的各種"異常"。 Finally為確保一段代碼不管發(fā)生什么"異常"都被執(zhí)行一段代碼。 可以在一個(gè)成員函數(shù)調(diào)用的外面寫一個(gè)try語(yǔ)句,在這個(gè)成員函數(shù)內(nèi)部寫另一個(gè)try語(yǔ)句保護(hù)其他代碼。每當(dāng)遇到一個(gè)try語(yǔ)句,"異常"的框架就放到堆棧上面,直到所有的try語(yǔ)句都完成。如果下一級(jí)的try語(yǔ)句沒有對(duì)某種"異常"進(jìn)行處理,堆棧就會(huì)展開,直到遇到有處理這種"異常"的try語(yǔ)句。 29. 排序都有哪幾種方法?請(qǐng)列舉 排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸并排序,分配排序(箱排序、基數(shù)排序) 30. 你所知道的集合類都有哪些?主要方法? 最常用的集合類是 List 和 Map。 List 的具體實(shí)現(xiàn)包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構(gòu)建、存儲(chǔ)和操作任何類型對(duì)象的元素列表。 List 適用于按數(shù)值索引訪問(wèn)元素的情形。 31. heap和stack有什么區(qū)別 棧是一種線形集合,其添加和刪除元素的操作應(yīng)在同一段完成。棧按照后進(jìn)先出的方式進(jìn)行處理。堆是棧的一個(gè)組成元素 32. HashMap和Hashtable的區(qū)別 HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable。 HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進(jìn)的Map interface的一個(gè)實(shí)現(xiàn)。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問(wèn)Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap 就必須為之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異 33. 說(shuō)出ArrayList,Vector, LinkedList的存儲(chǔ)性能和特性 ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù),此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號(hào)索引元素,但是插入元素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),通常性能上較 ArrayList差,而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。 34. 運(yùn)行時(shí)異常與一般異常有何異同 異常表示程序運(yùn)行過(guò)程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見運(yùn)行錯(cuò)誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行時(shí)異常。 35. int 和 Integer 有什么區(qū)別 Java 提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型)。 Int是java的原始數(shù)據(jù)類型,Integer是java為int提供的wapper。Java為每個(gè)原始類型提供了封裝類。 原始類型封裝類: boolean : Boolean char : Character byte : Byte short : Short int : Integer long : Long float : Float double : Double 引用類型和原始類型的行為完全不同,并且它們具有不同的語(yǔ)義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問(wèn)題,這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),當(dāng)引用類型和原始類型用作某個(gè)類的實(shí)例數(shù)據(jù)時(shí)所指定的缺省值。對(duì)象引用實(shí)例變量的缺省值為 null,而原始類型實(shí)例變量的缺省值與它們的類型有關(guān) 36. String是最基本的數(shù)據(jù)類型嗎 不是,基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。 java.lang.String類是final類型的,因此不可以繼承這個(gè)類、不能修改這個(gè)類。為了提高效率節(jié)省空間,我們應(yīng)該用StringBuffer類 37. 面向?qū)ο蟮奶卣饔心男┓矫? 主要有以下四方面: 1.抽象:抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問(wèn)題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。抽象包括兩個(gè)方面,一是過(guò)程抽象,二是數(shù)據(jù)抽象。 2.繼承:繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵(lì)類的重用,它提供了一種明確表述共性的方法。對(duì)象的一個(gè)新類可以從現(xiàn)有的類中派生,這個(gè)過(guò)程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實(shí)例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。 3.封裝:封裝是把過(guò)程和數(shù)據(jù)包圍起來(lái),對(duì)數(shù)據(jù)的訪問(wèn)只能通過(guò)已定義的界面。面向?qū)ο笥?jì)算始于這個(gè)基本概念,即現(xiàn)實(shí)世界可以被描繪成一系列完全自治、封裝的對(duì)象,這些對(duì)象通過(guò)一個(gè)受保護(hù)的接口訪問(wèn)其他對(duì)象。 4. 多態(tài)性:多態(tài)性是指允許不同類的對(duì)象對(duì)同一消息作出響應(yīng)。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好的解決了應(yīng)用程序函數(shù)同名問(wèn)題。 38. 談?wù)刦inal, finally, finalize的區(qū)別 final—修飾符(關(guān)鍵字)如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖儭1宦暶鳛閒inal的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載 finally—再異常處理時(shí)提供 finally 塊來(lái)執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally 塊(如果有的話) finalize—方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的 39. 抽象類與接口? 抽象類與接口都用于抽象,但是抽象類(JAVA中)可以有自己的部分實(shí)現(xiàn),而接口則完全是一個(gè)標(biāo)識(shí)(同時(shí)有多實(shí)現(xiàn)的功能)。 JAVA類實(shí)現(xiàn)序例化的方法是實(shí)現(xiàn)java.io.Serializable接口 Collection框架中實(shí)現(xiàn)比較要實(shí)現(xiàn)Comparable 接口和 Comparator 接口 40. GC是什么? 為什么要有GC GC是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問(wèn)題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動(dòng)監(jiān)測(cè)對(duì)象是否超過(guò)作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語(yǔ)言沒有提供釋放已分配內(nèi)存的顯示操作方法 41. char型變量中能不能存貯一個(gè)中文漢字?為什么? 是能夠定義成為一個(gè)中文的,因?yàn)閖ava中以u(píng)nicode編碼,一個(gè)char占16個(gè)字節(jié),所以放一個(gè)中文是沒問(wèn)題的 42. ArrayList和Vector的區(qū)別,HashMap和Hashtable的區(qū)別 就ArrayList與Vector主要從二方面來(lái)說(shuō): 1、同步性:Vector是線程安全的,也就是說(shuō)是同步的,而ArrayList是線程序不安全的,不是同步的 2、數(shù)據(jù)增長(zhǎng):當(dāng)需要增長(zhǎng)時(shí),Vector默認(rèn)增長(zhǎng)為原來(lái)一倍,而ArrayList卻是原來(lái)的一半 就HashMap與HashTable主要從三方面來(lái)說(shuō): 1、歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn) 2、同步性:Hashtable是線程安全的,也就是說(shuō)是同步的,而HashMap是線程序不安全的,不是同步的 3、值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value 43. 當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞 是值傳遞。Java 編程語(yǔ)言只有值傳遞參數(shù)。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的內(nèi)容可以在被調(diào)用的方法中改變,但對(duì)象的引用是永遠(yuǎn)不會(huì)改變的 44. 兩個(gè)對(duì)象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對(duì)不對(duì) 不對(duì),有相同的hash code 45. try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后 會(huì)執(zhí)行,在return前執(zhí)行 46. 是否可以繼承String類 String類是final類故不可以繼承 47. 接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)(implements)接口? 抽象類是否可繼承實(shí)體類(concrete class) 接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implements)接口,抽象類是否可繼承實(shí)體類,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù) 48. abstract class和interface有什么區(qū)別 聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類(abstract class),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以在類中實(shí)現(xiàn)這些方法 接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過(guò)實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個(gè)有程序體。接口只可以定義static final成員變量。接口的實(shí)現(xiàn)與子類相似,除了該實(shí)現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類的任何對(duì)象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來(lái)決定某對(duì)象的類是否實(shí)現(xiàn)了接口 49. List, Set, Map是否繼承自Collection接口 List,Set是,Map不是 50. String s = new String("xyz");創(chuàng)建了幾個(gè)String Object "xyz"本身作為字符常量,在匯編語(yǔ)言中應(yīng)該作為常量放在數(shù)據(jù)段,Java有一個(gè)類似數(shù)據(jù)段的constant pool保存這個(gè)常量,在classloader加載這個(gè)類的時(shí)候就把"xyz"和這個(gè)類的其他一些信息放在constant pool new String("xyz")根據(jù)常量"xyz"在heap上創(chuàng)建String對(duì)象所以,一共兩個(gè)對(duì)象 51. 前幾天面試的時(shí)候遇到了一個(gè)很好的sql語(yǔ)句題.雖然不是很難,但如果沒實(shí)際做過(guò)項(xiàng)目,做起來(lái)還是有點(diǎn)難度的.特與大家分享.. 題目大概意思是:有下面這樣一個(gè)方法,在此方法在被調(diào)用,在沒有數(shù)據(jù)更新時(shí)沒有進(jìn)行判斷.請(qǐng)修改... public boolean xx() { String sql; sql = "update user set name=?"; try{ PreparedStatement ps = cn.prepareStatement(sql); ps.setString(1,xxx); ps.executeUpdate(); }catch(Exception e){ return false; } return true; } 參考答案 int n=ps.executeUpdate(); if(n==0){ return false; } 52. 什么情況下調(diào)用doGet()和doPost()? 答:Jsp頁(yè)面中的form標(biāo)簽里的method屬性為get時(shí)調(diào)用doGet(),為post時(shí)調(diào)用doPost()。 53 orward和redirect的區(qū)別 forward: an internal transfer in servlet redirect: 重定向,有2次request,第2次request將丟失第一次的attributs/parameters等 54. J2EE是技術(shù)還是平臺(tái)還是框架? J2EE本身是一個(gè)標(biāo)準(zhǔn),一個(gè)為企業(yè)分布式應(yīng)用的開發(fā)提供的標(biāo)準(zhǔn)平臺(tái)。 J2EE也是一個(gè)框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術(shù)。 55.作用域public,private,protected,以及不寫時(shí)的區(qū)別 答:區(qū)別如下: 作用域 當(dāng)前類 同一package 子孫類 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 不寫時(shí)默認(rèn)為friendly 56、&和&&的區(qū)別 答:&是位運(yùn)算符,表示按位與運(yùn)算,&&是邏輯運(yùn)算符,表示邏輯與(and) 57、Collection 和 Collections的區(qū)別 答:Collection是集合類的上級(jí)接口,繼承與他的接口主要有Set 和List. Collections是針對(duì)集合類的一個(gè)幫助類,他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程安全化等操作 58.Math.round(11.5)等於多少? Math.round(-11.5)等於多少 答: Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回與參數(shù)最接近的長(zhǎng)整數(shù),參數(shù)加1/2后求其floor 59、接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)(implements)接口? 抽象類是否可繼承實(shí)體類(concrete class) 答:接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implements)接口,抽象類是否可繼承實(shí)體類,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù) 60、float型float f=3.4是否正確? 答:不正確。精度不準(zhǔn)確,應(yīng)該用強(qiáng)制類型轉(zhuǎn)換,如下所示:float f=(float)3.4; float f = 3.4f; 61、運(yùn)行時(shí)異常與一般異常有何異同 答:異常表示程序運(yùn)行過(guò)程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見運(yùn)行錯(cuò)誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行時(shí)異常。 61、一個(gè)".java"源文件中是否可以包括多個(gè)類(不是內(nèi)部類)?有什么限制? 答:可以。必須只有一個(gè)類名與文件名相同。 62、在JAVA中,如何跳出當(dāng)前的多重嵌套循環(huán)? 答:用break; return 方法。 63、說(shuō)出一些常用的類,包,接口,請(qǐng)各舉5個(gè) 答:常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer 常用的包:java.lang java.awt java.io java.util java.sql 常用的接口:Remote List Map Runnable Serializable ActionListener 64、sleep() 和 wait() 有什么區(qū)別? 答:sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖。 wait是Object類的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。 65、C/S 與 B/S 區(qū)別: 答:有如下八個(gè)方面的不同: 1.硬件環(huán)境不同: C/S 一般建立在專用的網(wǎng)絡(luò)上, 小范圍里的網(wǎng)絡(luò)環(huán)境, 局域網(wǎng)之間再通過(guò)專門服務(wù)器提供連接和數(shù)據(jù)交換服務(wù). B/S 建立在廣域網(wǎng)之上的, 不必是專門的網(wǎng)絡(luò)硬件環(huán)境,例與電話上網(wǎng), 租用設(shè)備. 信息自己管理. 有比C/S更強(qiáng)的適應(yīng)范圍, 一般只要有操作系統(tǒng)和瀏覽器就行 2.對(duì)安全要求不同 C/S 一般面向相對(duì)固定的用戶群, 對(duì)信息安全的控制能力很強(qiáng). 一般高度機(jī)密的信息系統(tǒng)采用C/S 結(jié)構(gòu)適宜. 可以通過(guò)B/S發(fā)布部分可公開信息. B/S 建立在廣域網(wǎng)之上, 對(duì)安全的控制能力相對(duì)弱, 可能面向不可知的用戶。 3.對(duì)程序架構(gòu)不同 C/S 程序可以更加注重流程, 可以對(duì)權(quán)限多層次校驗(yàn), 對(duì)系統(tǒng)運(yùn)行速度可以較少考慮. B/S 對(duì)安全以及訪問(wèn)速度的多重的考慮, 建立在需要更加優(yōu)化的基礎(chǔ)之上. 比C/S有更高的要求 B/S結(jié)構(gòu)的程序架構(gòu)是發(fā)展的趨勢(shì), 從MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持網(wǎng)絡(luò)的構(gòu)件搭建的系統(tǒng). SUN 和IBM推的JavaBean 構(gòu)件技術(shù)等,使 B/S更加成熟. 3.對(duì)程序架構(gòu)不同 C/S 程序可以更加注重流程, 可以對(duì)權(quán)限多層次校驗(yàn), 對(duì)系統(tǒng)運(yùn)行速度可以較少考慮. B/S 對(duì)安全以及訪問(wèn)速度的多重的考慮, 建立在需要更加優(yōu)化的基礎(chǔ)之上. 比C/S有更高的要求 B/S結(jié)構(gòu)的程序架構(gòu)是發(fā)展的趨勢(shì), 從MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持網(wǎng)絡(luò)的構(gòu)件搭建的系統(tǒng). SUN 和IBM推的JavaBean 構(gòu)件技術(shù)等,使 B/S更加成熟. 4.軟件重用不同 C/S 程序可以不可避免的整體性考慮, 構(gòu)件的重用性不如在B/S要求下的構(gòu)件的重用性好. B/S 對(duì)的多重結(jié)構(gòu),要求構(gòu)件相對(duì)獨(dú)立的功能. 能夠相對(duì)較好的重用.就入買來(lái)的餐桌可以再利用,而不是做在墻上的石頭桌子 5.系統(tǒng)維護(hù)不同 C/S 程序由于整體性, 必須整體考察, 處理出現(xiàn)的問(wèn)題以及系統(tǒng)升級(jí). 升級(jí)難. 可能是再做一個(gè)全新的系統(tǒng) B/S 構(gòu)件組成,方面構(gòu)件個(gè)別的更換,實(shí)現(xiàn)系統(tǒng)的無(wú)縫升級(jí). 系統(tǒng)維護(hù)開銷減到最小.用戶從網(wǎng)上自己下載安裝就可以實(shí)現(xiàn)升級(jí). 6.處理問(wèn)題不同 C/S 程序可以處理用戶面固定, 并且在相同區(qū)域, 安全要求高需求, 與操作系統(tǒng)相關(guān). 應(yīng)該都是相同的系統(tǒng) B/S 建立在廣域網(wǎng)上, 面向不同的用戶群, 分散地域, 這是C/S無(wú)法作到的. 與操作系統(tǒng)平臺(tái)關(guān)系最小. 7.用戶接口不同 C/S 多是建立的Window平臺(tái)上,表現(xiàn)方法有限,對(duì)程序員普遍要求較高 B/S 建立在瀏覽器上, 有更加豐富和生動(dòng)的表現(xiàn)方式與用戶交流. 并且大部分難度減低,減低開發(fā)成本. 8.信息流不同 C/S 程序一般是典型的中央集權(quán)的機(jī)械式處理, 交互性相對(duì)低 B/S 信息流向可變化, B-B B-C B-G等信息、流向的變化, 更像交易中心 |
|