2023java面試題

康華0 分享 時間:

面試和面談的區(qū)別之一就是對方往往是多人,其中不乏專家、學(xué)者,求職者切不可息以為是,不懂裝懂,講話要留有余地。下面是小編為大家整理的2023java面試題,如果大家喜歡可以分享給身邊的朋友。

2023java面試題

2023java面試題【篇1】

1、面向?qū)ο蟮奶卣饔心男┓矫?

1.抽象:

抽象就是忽略一個主題中與當(dāng)前目標無關(guān)的那些方面,以便更充分地注意與當(dāng)前目標有關(guān)的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節(jié)。抽象包括兩個方面,一是過程抽象,二是數(shù)據(jù)抽象。

2.繼承:

繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現(xiàn)有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。

3.封裝:

封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面。面向?qū)ο笥嬎闶加谶@個基本概念,即現(xiàn)實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。

4. 多態(tài)性:

多態(tài)性是指允許不同類的對象對同一消息作出響應(yīng)。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,很好的解決了應(yīng)用程序函數(shù)同名問題。

2、String是最基本的數(shù)據(jù)類型嗎?

基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。

java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節(jié)省空間,我們應(yīng)該用StringBuffer類

3、int 和 Integer 有什么區(qū)別

Java 提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型)。Int是java的原始數(shù)據(jù)類型,Integer是java為int提供的封裝類。Java為每個原始類型提供了封裝類。

原始類型封裝類

booleanBoolean

charCharacter

byteByte

shortShort

intInteger

longLong

floatFloat

doubleDouble

引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲,當(dāng)引用類型和原始類型用作某個類的實例數(shù)據(jù)時所指定的缺省值。對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類型有關(guān)。

4、String 和StringBuffer的區(qū)別

JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數(shù)據(jù)。這個String類提供了數(shù)值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態(tài)構(gòu)造字符數(shù)據(jù)。

5、運行時異常與一般異常有何異同?

異常表示程序運行過程中可能出現(xiàn)的非正常狀態(tài),運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。

6、說出Servlet的生命周期,并說出Servlet和CGI的區(qū)別。

Servlet被服務(wù)器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應(yīng)的do__X方法(doGet,doPost)等,當(dāng)服務(wù)器決定將實例銷毀的時候調(diào)用其destroy方法。

與cgi的區(qū)別在于servlet處于服務(wù)器進程中,它通過多線程方式運行其service方法,一個實例可以服務(wù)于多個請求,并且其實例一般不會銷毀,而CGI對每個請求都產(chǎn)生新的進程,服務(wù)完成后就銷毀,所以效率上低于servlet。

7、說出ArrayList,Vector, LinkedList的存儲性能和特性

ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入速度較快。

8、EJB是基于哪些技術(shù)實現(xiàn)的?并說出SessionBean和EntityBean的區(qū)別,StatefulBean和StatelessBean的區(qū)別。

EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技術(shù)實現(xiàn)。

SessionBean在J2EE應(yīng)用程序中被用來完成一些服務(wù)器端的業(yè)務(wù)操作,例如訪問數(shù)據(jù)庫、調(diào)用其他EJB組件。EntityBean被用來代表應(yīng)用系統(tǒng)中用到的數(shù)據(jù)。

對于客戶機,SessionBean是一種非持久性對象,它實現(xiàn)某些在服務(wù)器上運行的業(yè)務(wù)邏輯。

對于客戶機,EntityBean是一種持久性對象,它代表一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現(xiàn)有企業(yè)應(yīng)用程序?qū)崿F(xiàn)的實體。

Session Bean 還可以再細分為 Stateful Session Bean 與 Stateless Session Bean ,這兩種的 Session Bean都可以將系統(tǒng)邏輯放在 method之中執(zhí)行,不同的是 Stateful Session Bean 可以記錄呼叫者的狀態(tài),因此通常來說,一個使用者會有一個相對應(yīng)的 Stateful Session Bean 的實體。Stateless Session Bean 雖然也是邏輯組件,但是他卻不負責(zé)記錄使用者狀態(tài),也就是說當(dāng)使用者呼叫 Stateless Session Bean 的時候,EJB Container 并不會找尋特定的 Stateless Session Bean 的實體來執(zhí)行這個 method。換言之,很可能數(shù)個使用者在執(zhí)行某個 Stateless Session Bean 的 methods 時,會是同一個 Bean 的 Instance 在執(zhí)行。從內(nèi)存方面來看, Stateful Session Bean 與 Stateless Session Bean 比較, Stateful Session Bean 會消耗 J2EE Server 較多的內(nèi)存,然而 Stateful Session Bean 的優(yōu)勢卻在于他可以維持使用者的狀態(tài)。

9、Collection 和 Collections的區(qū)別。

Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.

Collections是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序、線程安全化等操作。

10、&和&&的區(qū)別。

&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)。

11、HashMap和Hashtable的區(qū)別。

HashMap是Hashtable的輕量級實現(xiàn)(非線程安全的實現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable。

HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。

Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現(xiàn)。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現(xiàn)同步,而HashMap 就必須為之提供外同步。

Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。

12、final, finally, finalize的區(qū)別。

final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。

finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關(guān)閉文件等。

13、sleep 和 wait() 有什么區(qū)別?

sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時間,給執(zhí)行機會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時后會自動恢復(fù)。調(diào)用sleep不會釋放對象鎖。

2023java面試題【篇2】

1、什么是存儲過程和如何編寫

1、注冊Jdbc驅(qū)動程序的三種方式

1、用JDBC如何調(diào)用存儲過程

1、JDBC中的preparedStatement相比Statement的好處

1. 寫一個用jdbc連接并訪問oracle數(shù)據(jù)的程序代碼

2、Class.forName的作用?為什么要用?

答:調(diào)用該訪問返回一個以字符串指定類名的類的對象。

3、大數(shù)據(jù)量下的分頁解決方法。

4、用 JDBC 查詢學(xué)生成績單, 把主要代碼寫出來.

5、這段代碼有什么不足之處?

try {

Connection conn = ...;

Statement stmt = ...;

ResultSet rs = stmt.executeQuery(“select __ from table1”);

while(rs.next) {

}

} catch(Exception ex) {

}

36、說出數(shù)據(jù)連接池的工作機制是什么?

J2EE服務(wù)器啟動時會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接。客戶端程序需要連接時,池驅(qū)動程序會返回一個未使用的池連接并將其表記為忙。如果當(dāng)前沒有空閑連接,池驅(qū)動程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個連接。

4、為什么要用 ORM? 和 JDBC 有何不一樣?

5. XML部分

1、xml有哪些解析技術(shù)?區(qū)別是什么?

答:有DOM,SAX,STAX等

DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結(jié)構(gòu)所造成的,這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個文檔裝入內(nèi)存,適合對XML的隨機訪問SAX:不現(xiàn)于DOM,SAX是事件驅(qū)動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當(dāng)遇到像文件開頭,文檔結(jié)束,或者標簽開頭與標簽結(jié)束時,它會觸發(fā)一個事件,用戶通過在其回調(diào)事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問

STAX:Streaming ApI for XML (StAX)

講解這些區(qū)別是不需要特別去比較,就像說傳智播客與其他培訓(xùn)機構(gòu)的區(qū)別時,我們只需說清楚傳智播客有什么特點和優(yōu)點就行了,這就已經(jīng)間接回答了彼此的區(qū)別。

2、你在項目中用到了xml技術(shù)的哪些方面?如何實現(xiàn)的?

答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺時,將不能數(shù)據(jù)源的數(shù)據(jù)組裝成XML文件,然后將XML文件壓縮打包加密后通過網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后再同XML文件中還原相關(guān)信息進行處理。在做軟件配置時,利用XML可以很方便的進行,軟件的各種配置參數(shù)都存貯在XML文件中。

3、用jdom解析xml文件時如何解決中文問題?如何解析?

答:看如下代碼,用編碼方式加以解決

package test;

import java.io.__;

public class DOMTest

{

private String inFile = “c:\\people.xml”

private String outFile = “c:\\people.xml”

public static void main(String args[])

{

new DOMTest();

}

public DOMTest()

{

try

{

javax.xml.parsers.DocumentBuilder builder =

javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();

org.w3c.dom.Document doc = builder.newDocument();

org.w3c.dom.Element root = doc.createElement(“老師”);

org.w3c.dom.Element wang = doc.createElement(“王”);

org.w3c.dom.Element liu = doc.createElement(“劉”);

wang.appendChild(doc.createTextNode(“我是王老師”));

root.appendChild(wang);

doc.appendChild(root);

javax.xml.transform.Transformer transformer =

javax.xml.transform.TransformerFactory.newInstance().newTransformer();

transformer.setOutputproperty(javax.xml.transform.OutputKeys.ENCODING, “gb2312”);

transformer.setOutputproperty(javax.xml.transform.OutputKeys.INDENT, “yes”);

transformer.transform(new javax.xml.transform.dom.DOMSource(doc),

new

javax.xml.transform.stream.StreamResult(outFile));

}

catch (Exception e)

{

System.out.println (e.getMessage());

}

}

}

4、編程用JAVA解析XML的方式.

答:用SAX方式解析XML,XML文件如下:

王小明

信息學(xué)院

6258113

男,1955年生,博士,95年調(diào)入海南大學(xué)

事件回調(diào)類SAXHandler.java

import java.io.__;

import java.util.Hashtable;

import org.xml.sax.__;

public class SAXHandler extends HandlerBase

{

private Hashtable table = new Hashtable();

private String currentElement = null;

private String currentValue = null;

public void setTable(Hashtable table)

{

this.table = table;

}

public Hashtable getTable()

{

return table;

}

public void startElement(String tag, AttributeList attrs)

throws SAXException

{

currentElement = tag;

}

public void characters(char[] ch, int start, int length)

throws SAXException

{

currentValue = new String(ch, start, length);

}

public void endElement(String name) throws SAXException

{

if (currentElement.equals(name))

table.put(currentElement, currentValue);

}

}

JSp內(nèi)容顯示源碼,Sa__ml.jsp:

<%@ page errorpage=Errpage.jsp

contentType=text/html;charset=GB2312 %>

[Java面試題]

2023java面試題【篇3】

一、談?wù)刦inal, finally, finalize的區(qū)別,

Final --修飾符(關(guān)鍵字)。如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類

不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為

final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。

finally—在異常處理時提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個異常,那么相匹配的catch 子句就會執(zhí)行,然后控制就會進入 finally 塊(如果有的話)。

finalize —方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。

這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。

子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調(diào)用的。

二、Anonymous Inner Class (匿名內(nèi)部類)

是否可以extends(繼承)其它類,是否可以implements(實現(xiàn))interface(接口)?

匿名的內(nèi)部類是沒有名字的內(nèi)部類。不能extends(繼承) 其它類,但一個內(nèi)部類可以作為一個接口,由另一個內(nèi)部

類實現(xiàn)。

三、Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統(tǒng))。

Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。

Java內(nèi)部類與C++嵌套類最大的不同就在于是否有指向外部的引用上。具體可見

www.frontfree.net/articles/services/view.asp?id=704&page=1

注: 靜態(tài)內(nèi)部類(Inner Class)意味著

1、創(chuàng)建一個static內(nèi)部類的對象,不需要一個外部類對象,2、不能從一個static內(nèi)部類的一個對象訪問一個外部類對象

四、&和&&的區(qū)別。

&是位運算符。&&是布爾邏輯運算符。

五、HashMap和Hashtable的區(qū)別。

都屬于Map接口的類,實現(xiàn)了將惟一鍵映射到特定的值上。 HashMap 類沒有分類或者排序。它允許一個 null鍵和多個 null 值。 Hashtable 類似于HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步的。

六、Collection 和 Collections的區(qū)別。

Collections是個java.util下的類,它包含有各種有關(guān)集合操作的靜態(tài)方法。

Collection是個java.util下的接口,它是各種集合結(jié)構(gòu)的父接口。

七、什么時候用assert。

斷言是一個包含布爾表達式的語句,在執(zhí)行這個語句時假定該表達式為 true。

如果表達式計算為 false,那么系統(tǒng)會報告一個 AssertionError。

它用于調(diào)試目的: assert(a >0); // throws an AssertionError if a <= 0

斷言可以有兩種形式: assert Expression1 ; assert Expression1 : Expression2 ; Expression1

應(yīng)該總是產(chǎn)生一個布爾值。 Expression2 可以是得出一個值的任意表達式。這個值用于生成顯示更多調(diào)試信息的 String 消息。

斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記: javac -source 1.4 Test.java

要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。 要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。

要在系統(tǒng)類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎(chǔ)上啟用或者禁用斷言。

可以在預(yù)計正常情況下不會到達的任何位置上放置斷言。斷言可以用于驗證傳遞給私有方法的參數(shù)。不過,斷言不應(yīng)該用于驗證

傳遞給公有方法的參數(shù),因為不管是否啟用了斷言,公有方法都必須檢查其參數(shù)。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試后置條件。另外,斷言不應(yīng)該以任何方式改變程序的狀態(tài)。

八、GC是什么? 為什么要有GC? (基礎(chǔ))。

GC是垃圾收集器。Java 程序員不用擔(dān)心內(nèi)存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,

可以調(diào)用下面的方法之一: System.gc() 、Runtime.getRuntime().gc()

九、String s = new String(“xyz”);創(chuàng)建了幾個String Object?

兩個對象,一個是“xyx”,一個是指向“xyx”的引用對象s。

十、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

十一、short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?

short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉(zhuǎn)化為short型。

可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。

十二、sleep() 和 wait() 有什么區(qū)別?

搞線程的最愛sleep()方法是使線程停止一段時間的方法,

在sleep 時間間隔期滿后,線程不一定立即恢復(fù)執(zhí)行。

這是因為在那個時刻,其它線程可能正在運行而且沒有被調(diào)度為放棄執(zhí)行,除非(a)“醒來”的線程具有更高的優(yōu)先級,(b)正在運行的線程因為其它原因而阻塞。

wait()是線程交互時,如果線程對一個同步對象x 發(fā)出一個wait()調(diào)用,該線程會暫停執(zhí)行,被調(diào)對象進入等待狀態(tài),直到被喚醒或等待時間到。

十三、Java有沒有g(shù)oto?

Goto—java中的保留字,現(xiàn)在沒有在java中使用。

十四、數(shù)組有沒有l(wèi)ength()這個方法? String有沒有l(wèi)ength()這個方法?

數(shù)組沒有l(wèi)ength()方法,有l(wèi)ength的屬性。String有l(wèi)ength()方法。

十五、Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類型?

方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),

重載Overloading是一個類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被

重寫 (Overriding)。子類的對象使用這個方法時,將調(diào)用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。

如果在一個類中定義了多個同名的方法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。

Overloaded的方法是可以改變返回值的類型。

十八、error和exception有什么區(qū)別?

error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。

exception 表示一種設(shè)計或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運行正常,從不會發(fā)生的情況。

二十,abstract class和interface有什么區(qū)別?

聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類(abstract class),它用于要創(chuàng)建一個體現(xiàn)某些基本行為的類,并為該類聲明

方法,但不能在該類中實現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實例。然而可以創(chuàng)建一個變量,其類型是一個抽象類,

并讓它指向具體子類的一個實例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽象方法提供

實現(xiàn),否則它們也是抽象類為。取而代之,在子類中實現(xiàn)該方法。知道其行為的其它類可以在類中實現(xiàn)這些方法。

接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現(xiàn)這樣的接口而獲得。接口中的所有

方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現(xiàn)與子類相似,除了該實現(xiàn)類不能從

接口定義中繼承行為。當(dāng)類實現(xiàn)特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現(xiàn)了該接口的類的任何對象上調(diào)用接口的方法。由于有抽象類,它允

許使用接口名作為引用變量的類型。通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof 運算符可以用來決定某對象的類是否實現(xiàn)了接口。

二十三,啟動一個線程是用run()還是start()?

啟動一個線程是調(diào)用start()方法,使線程所代表的虛擬處理機處于可運行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行

。這并不意味著線程就會立即運行。run()方法可以產(chǎn)生必須退出的標志來停止一個線程。

2.抽象類和接口的區(qū)別.

答案:

(1)接口可以被多重implements,抽象類只能被單一extends.

(2)接口只有定義,抽象類可以有定義和實現(xiàn).

(3)接口的字段定義默認為:public static final, 抽象類字段默認friendly“(本包可見).

37、int 和 Integer 有什么區(qū)別

答:Java 提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型)。Int是java的原始數(shù)據(jù)類型,Integer是java為int提供的封裝類。Java為每個原始類型提供了封裝類。原始類型封裝類booleanBoolean,charCharacter,byteByte,shortShort,intInteger,

longLong,floatFloat,doubleDouble引 用類型和原始類型的行為完全不同,并且它們具有不同的語義。

引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數(shù) 據(jù)結(jié)構(gòu)存儲,當(dāng)引用類型和原始類型用作某個類的實例數(shù)據(jù)時所指定的缺省值。對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類 型有關(guān)

42、Java的接口和C++的虛類的相同和不同處

答:由 于Java不支持多繼承,而有可能某個類或?qū)ο笠褂梅謩e在幾個類或?qū)ο罄锩娴姆椒ɑ驅(qū)傩?,現(xiàn)有的單繼承機制就不能滿足要求。與繼承相比,接口有更高的靈 活性,因為接口中沒有任何實現(xiàn)代碼。當(dāng)一個類實現(xiàn)了接口以后,該類要實現(xiàn)接口里面所有的方法和屬性,并且接口里面的屬性在默認狀態(tài)下面都是 public static,所有方法默認情況下是public.一個類可以實現(xiàn)多個接口。

43、Java中的異常處理機制的簡單原理和應(yīng)用

答:當(dāng)JAVA 程序違反了JAVA的語義規(guī)則時,JAVA虛擬機就會將發(fā)生的錯誤表示為一個異常。違反語義規(guī)則包括2種情況。一種是JAVA類庫內(nèi)置的語義檢查。例如數(shù) 組下標越界,會引發(fā)IndexOutOfBoundsException;訪問null的對象時會引發(fā)NullPointerException。另一種 情況就是JAVA允許程序員擴展這種語義檢查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時用throw關(guān)鍵字引發(fā)異常。所有的異常都是 java.lang.Thowable的子類。

44、垃圾回收的優(yōu)點和原理。并考慮2種回收機制

答:Java 語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內(nèi)存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內(nèi)存管 理。由于有個垃圾回收機制,Java中的對象不再有”作用域“的概念,只有對象的引用才有”作用域“。垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使 用的內(nèi)存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能 實時的調(diào)用垃圾回收器對某個對象或所有對象進行垃圾回收?;厥諜C制有分代復(fù)制垃圾回收和標記垃圾回收,增量垃圾回收。

不止所見,見所未見!你所需要的就是我所用所擁有的??!

2023java面試題【篇4】

1. 什么情況下會發(fā)生棧內(nèi)存溢出。

至于是堆內(nèi)存溢出還是方法區(qū)內(nèi)存溢出還是棧內(nèi)存溢出,其實可以用一些工具比如

JConsole來監(jiān)視

2. JVM 的內(nèi)存結(jié)構(gòu),Eden 和 Survivor 比例。

3. jvm 中一次完整的 GC 流程是怎樣的,對象如何晉升到老年代,說說你知道的幾種主要的 jvm 參數(shù)。

4. 你知道哪幾種垃圾收集器,各自的優(yōu)缺點,重點講下 cms,包括原理,流程,優(yōu)缺點

5. 垃圾回收算法的實現(xiàn)原理。

6. 當(dāng)出現(xiàn)了內(nèi)存溢出,你怎么排錯。

7. JVM 內(nèi)存模型的相關(guān)知識了解多少,比如重排序,內(nèi)存屏障,happen-before,主內(nèi)存,工作內(nèi)存等。

8. 簡單說說你了解的類加載器。

9. 講講 JAVA 的反射機制。

10. 你們線上應(yīng)用的 JVM 參數(shù)有哪些。

11. g1 和 cms 區(qū)別,吞吐量優(yōu)先和響應(yīng)優(yōu)先的垃圾收集器選擇。

12. 請解釋如下 jvm 參數(shù)的含義:

-server -Xms512m -Xmx512m -Xss1024K

-__:PermSize=256m -__:MaxPermSize=512m -__:MaxTenuringThreshold=20 __:CMSInitiatingOccupancyFraction=80 -__:+UseCMSInitiatingOccupancyOnly。

blog.csdn.net/a503921892/article/details/39048889

Xmx3550m:設(shè)置JVM最大可用內(nèi)存為3550M。

-Xms3550m:設(shè)置JVM初始內(nèi)存為3550m。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。

-Xss128k: 設(shè)置每個線程的堆棧大小。在相同物理內(nèi) 存下,減小這個值能生成更多的線程。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成,

經(jīng)驗值在3000~5000左右

-__:MaxPermSize=16m:設(shè)置持久代大小為16m

-__:MaxTenuringThreshold=0:設(shè)置垃圾最大年齡。如果設(shè)置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代。對于年老代比較多的應(yīng)用,可以提高效率。

如果將此值設(shè)置為一個較大值,則年輕代對象會在Survivor區(qū)進行多次復(fù)制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。

開源框架知識

1. 簡單講講 tomcat 結(jié)構(gòu),以及其類加載器流程。

2. tomcat 如何調(diào)優(yōu),涉及哪些參數(shù)。

3. 講講 Spring 加載流程。

4. 講講 Spring 事務(wù)的傳播屬性。

PROPAGATION_REQUIRED--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個事務(wù)。這是最常見的選擇。

5. Spring 如何管理事務(wù)的。

6. Spring 怎么配置事務(wù)(具體說出一些關(guān)鍵的 xml元素)。

tx:advice,aop:config

7. 說說你對 Spring 的理解,非單例注入的原理?它的生命周期?循環(huán)注入的原理,aop 的實現(xiàn)原理,說說 aop 中的幾個術(shù)語,它們是怎么相互工作的。

8. Springmvc 中 DispatcherServlet初始化過程。

操作系統(tǒng)

1. Linux 系統(tǒng)下你關(guān)注過哪些內(nèi)核參數(shù),說說你知道的。

2. Linux 下 IO 模型有幾種,各自的含義是什么。

3. epoll 和 poll 有什么區(qū)別。

4.平時用到哪些 Linux 命令。

5. 用一行命令查看文件的最后五行。

輸出test文件的后五行:

liyi@liyi:~/Desktop >tail -n 5 test

輸出test文件的前五行:

liyi@liyi:~/Desktop >head -n 5 test

6. 用一行命令輸出正在運行的 java 進程。

7. 介紹下你理解的操作系統(tǒng)中線程切換過程。

8. 進程和線程的區(qū)別。

多線程

1. 多線程的幾種實現(xiàn)方式,什么是線程安全。

2. volatile 的原理,作用,能代替鎖么。

3. 畫一個線程的生命周期狀態(tài)圖。

4. sleep 和 wait 的區(qū)別。

5. Lock 與 Synchronized 的區(qū)別。

6. synchronized 的原理是什么,解釋以下名詞:重排序,自旋鎖,偏向鎖,輕量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖。

7. 用過哪些原子類,他們的原理是什么。

8. 用過線程池嗎,newCache 和 newFixed 有什么區(qū)別,他們的原理簡單概括下,構(gòu)造函數(shù)的各個參數(shù)的含義是什么,比如 coreSize,maxsize 等。

9. 線程池的關(guān)閉方式有幾種,各自的區(qū)別是什么。

10. 假如有一個第三方接口,有很多個線程去調(diào)用獲取數(shù)據(jù),現(xiàn)在規(guī)定每秒鐘最多有 10 個線程同時調(diào)用它,如何做到。

11. spring 的 controller 是單例還是多例,怎么保證并發(fā)的安全。

singleton : bean在每個Spring ioc 容器中只有一個實例。

prototype:一個bean的定義可以有多個實例。

request:每次http請求都會創(chuàng)建一個bean,該作用域僅在基于web的Spring ApplicationContext情形下有效。

12. 用三個線程按順序循環(huán)打印 abc 三個字母,比如 abcabcabc。

思路:解題思路大概是這樣的,開啟三個線程,每個線程一次打印一個字母,并且按照一定的順序打印,當(dāng)打印A的時候,其他線程處于阻塞狀態(tài),打印完A以后,

將線程解鎖,讓打印B的那個線程開啟,其他線程處于阻塞狀態(tài),同理打印C的時候,阻塞其他線程,這三個線程順序循環(huán),就達到順序多次打印ABC的目的了。

這道題看似思路簡單,其實主要需要用到wait方法和notify()方法,還有關(guān)鍵字synchronized,只有充分理解了這些,才能解出這道題。下面我有必要講解一下這兩個方法,

還有關(guān)鍵字synchronized。

13. ThreadLocal 用過么,用途是什么,原理是什么,用的時候要注意什么。

14. 如果讓你實現(xiàn)一個并發(fā)安全的鏈表,你會怎么做。

15. 有哪些無鎖數(shù)據(jù)結(jié)構(gòu),他們實現(xiàn)的原理是什么。

16. 講講 java 同步機制的 wait 和 notify。

17. 多線程如果線程掛住了怎么辦。

18. countdowlatch 和 cyclicbarrier的內(nèi)部原理和用法,以及相互之間的差別。

19. 使用 synchronized 修飾靜態(tài)方法和非靜態(tài)方法有什么區(qū)別。

所有的非靜態(tài)同步方法用的都是同一把鎖――實例對象本身,也就是說如果一個實例對象的非靜態(tài)同步方法獲取鎖后,

該實例對象的其他非靜態(tài)同步方法必須等待獲取鎖的方法釋放鎖后才能獲取鎖,

可是別的實例對象的非靜態(tài)同步方法因為跟該實例對象的非靜態(tài)同步方法用的是不同的鎖,

所以毋須等待該實例對象已獲取鎖的非靜態(tài)同步方法釋放鎖就可以獲取他們自己的鎖。

而所有的靜態(tài)同步方法用的也是同一把鎖――類對象本身,這兩把鎖是兩個不同的對象,

所以靜態(tài)同步方法與非靜態(tài)同步方法之間是不會有競態(tài)條件的。但是一旦一個靜態(tài)同步方法獲取鎖后,

其他的靜態(tài)同步方法都必須等待該方法釋放鎖后才能獲取鎖,而不管是同一個實例對象的靜態(tài)同步方法之間,

還是不同的實例對象的靜態(tài)同步方法之間,只要它們同一個類的實例對象!

20. 簡述 ConcurrentLinkedQueue 和 LinkedBlockingQueue 的用處和不同之處。

21. 導(dǎo)致線程死鎖的原因?怎么解除線程死鎖。

22. 非常多個線程(可能是不同機器),相互之間需要等待協(xié)調(diào),才能完成某種工作,問怎么設(shè)計這種協(xié)調(diào)方案。

23. 正確使用 Volatile 變量

正確使用 volatile 變量的條件

您只能在有限的一些情形下使用 volatile 變量替代鎖。要使 volatile 變量提供理想的線程安全,必須同時滿足下面兩個條件:

1對變量的寫操作不依賴于當(dāng)前值。

2該變量沒有包含在具有其他變量的不變式中。

www.ibm.com/developerworks/cn/java/j-jtp06197.html

TCP與HTTP

1. http1.0 和 http1.1 有什么區(qū)別。

在http1.0中,當(dāng)建立連接后,客戶端發(fā)送一個請求,服務(wù)器端返回一個信息后就關(guān)閉連接,

當(dāng)瀏覽器下次請求的時候又要建立連接,顯然這種不斷建立連接的方式,會造成很多問題。

在http1.1中,引入了持續(xù)連接的概念,通過這種連接,瀏覽器可以建立一個連接之后,

發(fā)送請求并得到返回信息,然后繼續(xù)發(fā)送請求再次等到返回信息,也就是說客戶端可以連續(xù)發(fā)送多個請求,而不用等待每一個響應(yīng)的到來。

2. TCP 三次握手和四次揮手的流程,為什么斷開連接要 4次,如果握手只有兩次,會出現(xiàn)什么。

3. TIME_WAIT 和 CLOSE_WAIT 的區(qū)別。

4. 說說你知道的幾種 HTTP 響應(yīng)碼,比如 200, 302, 404。

5. 當(dāng)你用瀏覽器打開一個鏈接的時候,計算機做了哪些工作步驟。

6. TCP/IP 如何保證可靠性,說說 TCP 頭的結(jié)構(gòu)。

7. 如何避免瀏覽器緩存。

8. 簡述 Http 請求 get 和 post 的區(qū)別以及數(shù)據(jù)包格式。

GET提交,請求的數(shù)據(jù)會附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭<request-line>中

POST提交:把提交的數(shù)據(jù)放置在是HTTP包的包體<request-body>中

[java面試題]

2023java面試題【篇5】

三、線程的四種狀態(tài)

1. 新狀態(tài):線程已被創(chuàng)建但尚未執(zhí)行(start() 尚未被調(diào)用)。

2. 可執(zhí)行狀態(tài):線程可以執(zhí)行,雖然不一定正在執(zhí)行。CPU 時間隨時可能被分配給該線程,從而使得它執(zhí)行。

3. 死亡狀態(tài):正常情況下 run() 返回使得線程死亡。調(diào)用 stop()或 destroy() 亦有同樣效果,但是不被推薦,前者會產(chǎn)生異常,后者是強制終止,不會釋放鎖。

4. 阻塞狀態(tài):線程不會被分配 CPU 時間,無法執(zhí)行。

四、線程的優(yōu)先級

線程的優(yōu)先級代表該線程的重要程度,當(dāng)有多個線程同時處于可執(zhí)行狀態(tài)并等待獲得 CPU 時間時,線程調(diào)度系統(tǒng)根據(jù)各個線程的優(yōu)先級來決定給誰分配 CPU 時間,優(yōu)先級高的線程有更大的機會獲得 CPU 時間,優(yōu)先級低的線程也不是沒有機會,只是機會要小一些罷了。

你可以調(diào)用 Thread 類的方法 getPriority() 和 setPriority()來存取線程的優(yōu)先級,線程的優(yōu)先級界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之間,缺省是5(NORM_PRIORITY)。

5)你用過哪種設(shè)計模式?(瞬聯(lián),IBM,aspenTech)

設(shè)計:design

模式:pattern

框架:framework

創(chuàng)建模式,結(jié)構(gòu)模式和行為模式

GoF設(shè)計模式

A.創(chuàng)建模式

設(shè)計模式之Factory(工廠模式)

使用工廠模式就象使用new一樣頻繁./10/9更新

設(shè)計模式之Prototype(原型模式)

用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。

設(shè)計模式之Builder

汽車由車輪 方向盤 發(fā)動機很多部件組成,同時,將這些部件組裝成汽車也是一件復(fù)雜的工作,Builder模式就是將這兩種情況分開進行。

設(shè)計模式之Singleton(單態(tài)模式)

保證一個類只有一個實例,并提供一個訪問它的全局訪問點 2002/10/9更新

B.結(jié)構(gòu)模式

設(shè)計模式之Facade

可擴展的使用JDBC針對不同的數(shù)據(jù)庫編程,Facade提供了一種靈活的實現(xiàn).

設(shè)計模式之Proxy

以Jive為例,剖析代理模式在用戶級別授權(quán)機制上的應(yīng)用

設(shè)計模式之Adapter

使用類再生的兩個方式:組合(new)和繼承(extends),這個已經(jīng)在”thinking in java“中提到過.

設(shè)計模式之Composite

就是將類用樹形結(jié)構(gòu)組合成一個單位.你向別人介紹你是某單位,你是單位中的一個元素,別人和你做買賣,相當(dāng)于和單位做買賣。文章中還對Jive再進行了剖析。

設(shè)計模式之Decorator

Decorator是個油漆工,給你的東東的外表刷上美麗的顏色.

設(shè)計模式之Bridge

將”牛郎織女“分開(本應(yīng)在一起,分開他們,形成兩個接口),在他們之間搭建一個橋(動態(tài)的結(jié)合)

設(shè)計模式之Flyweight

提供Java運行性能,降低小而大量重復(fù)的類的開銷.

C.行為模式

設(shè)計模式之Template

實際上向你介紹了為什么要使用Java 抽象類,該模式原理簡單,使用很普遍.

設(shè)計模式之Memento

很簡單一個模式,就是在內(nèi)存中保留原來數(shù)據(jù)的拷貝.

設(shè)計模式之Observer

介紹如何使用Java API提供的現(xiàn)成Observer

設(shè)計模式之Chain of Responsibility

各司其職的類串成一串,好象擊鼓傳花,當(dāng)然如果自己能完成,就不要推委給下一個.

設(shè)計模式之Command

什么是將行為封裝,Command是最好的說明.

設(shè)計模式之State

狀態(tài)是編程中經(jīng)常碰到的實例,將狀態(tài)對象化,設(shè)立狀態(tài)變換器,便可在狀態(tài)中輕松切換.

設(shè)計模式之Strategy

不同算法各自封裝,用戶端可隨意挑選需要的算法.

設(shè)計模式之Mediator

Mediator很象十字路口的紅綠燈,每個車輛只需和紅綠燈交互就可以.

設(shè)計模式之Interpreter

主要用來對語言的分析,應(yīng)用機會不多.

設(shè)計模式之Visitor

訪問者在進行訪問時,完成一系列實質(zhì)性操作,而且還可以擴展.

設(shè)計模式之Iterator

這個模式已經(jīng)被整合入Java的Collection.在大多數(shù)場合下無需自己制造一個Iterator,只要將對象裝入Collection中,直接使用Iterator進行對象遍歷。

6)請說一下MVC架構(gòu)(瞬聯(lián),IBM,aspenTech)

Model:模型層

View:視圖層

Controller:控制層

MVC (Modal View Controler)本來是存在于Desktop程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現(xiàn)代碼分離,從而使同一個程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計數(shù)據(jù)你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。

模型-視圖-控制器(MVC)是Xerox PARC在八十年代為編程語言Smalltalk-80發(fā)明的一種軟件設(shè)計模式,至今已被廣泛使用。最近幾年被推薦為Sun公司J2EE平臺的設(shè)計模式,并且受到越來越多的使用 ColdFusion 和 PHP 的開發(fā)者的歡迎。模型-視圖-控制器模式是一個有用的工具箱,它有很多好處,但也有一些缺點。

MVC如何工作

MVC是一個設(shè)計模式,它強制性的使應(yīng)用程序的輸入、處理和輸出分開。使用MVC應(yīng)用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務(wù)。

視圖

視圖是用戶看到并與之交互的界面。對老式的Web應(yīng)用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應(yīng)用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術(shù)已層出不窮,它們包括Macromedia Flash和象XHTML,XML/XSL,WML等一些標識語言和Web services.

如何處理應(yīng)用程序的界面變得越來越有挑戰(zhàn)性。MVC一個大的好處是它能為你的應(yīng)用程序處理很多不同的視圖。在視圖中其實沒有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。

模型

模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。在MVC的三個部件中,模型擁有最多的處理任務(wù)。例如它可能用象EJBs和ColdFusion Components這樣的構(gòu)件對象來處理數(shù)據(jù)庫。被模型返回的數(shù)據(jù)是中立的,就是說模型與數(shù)據(jù)格式無關(guān),這樣一個模型能為多個視圖提供數(shù)據(jù)。由于應(yīng)用于模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復(fù)性。

控制器

控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求。所以當(dāng)單擊Web頁面中的超鏈接和發(fā)送HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個模型構(gòu)件去處理請求,然后用確定用哪個視圖來顯示模型處理返回的數(shù)據(jù)。

現(xiàn)在我們總結(jié)MVC的處理過程,首先控制器接收用戶的請求,并決定應(yīng)該調(diào)用哪個模型來進行處理,然后模型用業(yè)務(wù)邏輯來處理用戶的請求并返回數(shù)據(jù),最后控制器用相應(yīng)的視圖格式化模型返回的數(shù)據(jù),并通過表示層呈現(xiàn)給用戶。

為什么要使用 MVC

大部分Web應(yīng)用程序都是用像ASP,PHP,或者CFML這樣的過程化語言來創(chuàng)建的。它們將像數(shù)據(jù)庫查詢語句這樣的數(shù)據(jù)層代碼和像HTML這樣的表示層代碼混在一起。經(jīng)驗比較豐富的開發(fā)者會將數(shù)據(jù)從表示層分離開來,但這通常不是很容易做到的,它需要精心的計劃和不斷的嘗試。MVC從根本上強制性的將它們分開。盡管構(gòu)造MVC應(yīng)用程序需要一些額外的工作,但是它給我們帶來的好處是無庸質(zhì)疑的。

首先,最重要的一點是多個視圖能共享一個模型,正如我所提及的,現(xiàn)在需要用越來越多的方式來訪問你的應(yīng)用程序。對此,其中一個解決之道是使用MVC,無論你的用戶想要Flash界面或是 WAP 界面;用一個模型就能處理它們。由于你已經(jīng)將數(shù)據(jù)和業(yè)務(wù)規(guī)則從表示層分開,所以你可以最大化的重用你的代碼了。

由于模型返回的數(shù)據(jù)沒有進行格式化,所以同樣的構(gòu)件能被不同界面使用。例如,很多數(shù)據(jù)可能用HTML來表示,但是它們也有可能要用Macromedia Flash和WAP來表示。模型也有狀態(tài)管理和數(shù)據(jù)持久性處理的功能,例如,基于會話的購物車和電子商務(wù)過程也能被Flash網(wǎng)站或者無線聯(lián)網(wǎng)的應(yīng)用程序所重用。

因為模型是自包含的,并且與控制器和視圖相分離,所以很容易改變你的應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。如果你想把你的數(shù)據(jù)庫從MySQL移植到Oracle,或者改變你的基于RDBMS數(shù)據(jù)源到LDAP,只需改變你的模型即可。一旦你正確的實現(xiàn)了模型,不管你的數(shù)據(jù)來自數(shù)據(jù)庫或是LDAP服務(wù)器,視圖將會正確的顯示它們。由于運用MVC的應(yīng)用程序的三個部件是相互對立,改變其中一個不會影響其它兩個,所以依據(jù)這種設(shè)計思想你能構(gòu)造良好的松偶合的構(gòu)件。

對我來說,控制器的也提供了一個好處,就是可以使用控制器來聯(lián)接不同的模型和視圖去完成用戶的需求,這樣控制器可以為構(gòu)造應(yīng)用程序提供強有力的手段。給定一些可重用的模型和視圖,控制器可以根據(jù)用戶的需求選擇模型進行處理,然后選擇視圖將處理結(jié)果顯示給用戶。

MVC的缺點

MVC的缺點是由于它沒有明確的定義,所以完全理解MVC并不是很容易。使用MVC需要精心的計劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費一些時間去思考。

你將不得不花費相當(dāng)可觀的時間去考慮如何將MVC運用到你的應(yīng)用程序,同時由于模型和視圖要嚴格的分離,這樣也給調(diào)試應(yīng)用程序到來了一定的困難。每個構(gòu)件在使用之前都需要經(jīng)過徹底的測試。一旦你的構(gòu)件經(jīng)過了測試,你就可以毫無顧忌的重用它們了。

根據(jù)我個人經(jīng)驗,由于我們將一個應(yīng)用程序分成了三個部件,所以使用MVC同時也意味著你將要管理比以前更多的文件,這一點是顯而易見的。這樣好像我們的工作量增加了,但是請記住這比起它所能帶給我們的好處是不值一提。

MVC并不適合小型甚至中等規(guī)模的應(yīng)用程序,花費大量時間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會得不償失。

MVC是一條創(chuàng)建軟件的好途徑

MVC設(shè)計模式是一個很好創(chuàng)建軟件的途徑,它所提倡的一些原則,像內(nèi)容和顯示互相分離可能比較好理解。但是如果你要隔離模型、視圖和控制器的構(gòu)件,你可能需要重新思考你的應(yīng)用程序,尤其是應(yīng)用程序的構(gòu)架方面。如果你肯接受MVC,并且有能力應(yīng)付它所帶來的額外的工作和復(fù)雜性,MVC將會使你的軟件在健壯性,代碼重用和結(jié)構(gòu)方面上一個新的臺階。

7)如果類a繼承類b,實現(xiàn)接口c,而類b和接口c中定義了同名變量,請問會出現(xiàn)什么問題?(瞬聯(lián))

interface A

{

int x = 0;

}

class B

{

int x =1;

}

class C extends B implements A

{

public void pX()

{

System.out.println(x);

}

public static void main(String[] args) {

new C().pX();

}

}

答案:錯誤。在編譯時會發(fā)生錯誤(錯誤描述不同的JVM有不同的信息,意思就是未明確的x調(diào)用,兩個x都匹配(就象在同時import java.util和java.sql兩個包時直接聲明Date一樣)。對于父類的變量,可以用super.x來明確(輸出的是1),而接口的屬性默認隱含為 public static final.所以可以通過A.x來明確(輸出的是0)。

下面的代碼運行時會不會報錯

interface Playable

{

void play();

}

interface Bounceable

{

void play();

}

interface Rollable extends Playable, Bounceable

{

Ball ball = new Ball(”PingPang“);

}

class Ball implements Rollable

{

private String name;

public String getName()

{

return name;

}

public Ball(String name)

{

this.name = name;

}

public void play()

{

ball = new Ball(”Football“);

System.out.println(ball.getName());

}

}

答案: 錯?!眎nterface Rollable extends Playable, Bounceable“沒有問題。interface可繼承多個interfaces,所以這里沒錯。問題出在interface Rollable里的”Ball ball = new Ball(“PingPang”);“。任何在interface里聲明的interface variable (接口變量,也可稱成員變量),默認為public static final。也就是說”Ball ball = new Ball(“PingPang”);“實際上是”public static final Ball ball = new Ball(“PingPang”);“。在Ball類的Play()方法中,”ball = new Ball(“Football”);“改變了ball的reference,而這里的ball來自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改變reference的。因此編譯器將在”ball = new Ball(“Football”);“這里顯示有錯。

8)請說一下java中為什么要引入內(nèi)部類?還有匿名內(nèi)部類?(瞬聯(lián),IBM)

9)請說一下final,finally和finalize的區(qū)別?(瞬聯(lián))

final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。

finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關(guān)閉文件等。

10)請說一下HTTP請求的基本過程(IBM)

11)java中存在內(nèi)存泄漏問題嗎?請舉例說明?(IBM)

int i,i2; return (i-i2); //when i為足夠大的正數(shù),i2為足夠大的負數(shù)。結(jié)果會造成溢位,導(dǎo)致錯誤。

12)請說一下java中的內(nèi)存回收機制所采用的算法(IBM,瞬聯(lián))

雖然垃圾回收關(guān)心著大部分的問題,包括內(nèi)存管理,使得程序員的任務(wù)顯得更加輕松,但是程序員還是可能犯些錯誤導(dǎo)致內(nèi)存泄漏問題。GC(垃圾回收)通過遞歸對所有從“根”對象(堆棧中的對象,靜態(tài)數(shù)據(jù)成員,JNI句柄等等)繼承下來的引用進行工作,然后標記所有可以訪問的活動著的對象。而這些對象變成了程序唯一能夠操縱的對象,其他的對象都被釋放了。因為GC使得程序不能夠訪問那些被釋放的對象,所以這樣做是安全的。

1436255