久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

最新葵花寶典.Java軟件工程師筆試面試必備(定稿)

時(shí)間:2019-05-13 23:01:45下載本文作者:會(huì)員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《最新葵花寶典.Java軟件工程師筆試面試必備(定稿)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《最新葵花寶典.Java軟件工程師筆試面試必備(定稿)》。

第一篇:最新葵花寶典.Java軟件工程師筆試面試必備(定稿)

Java軟件工程師筆試面試必備

一.Java基礎(chǔ)部分.........................................................................................6

1、一個(gè)“.java”源文件中是否可以包括多個(gè)類(不是內(nèi)部類)?有什么限制?.................................6

2、Java有沒有g(shù)oto?..................................................................................6

3、說說&和&&的區(qū)別。.................................................................................6

4、在JAVA中如何跳出當(dāng)前的多重嵌套循環(huán)?.............................................................6

5、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?..............................6

6、short s1 = 1;s1 = s1 + 1;有什么錯(cuò)? short s1 = 1;s1 += 1;有什么錯(cuò)?...............................6

7、char型變量中能不能存貯一個(gè)中文漢字?為什么?........................................................7

8、用最有效率的方法算出2乘以8等於幾?...............................................................7

9、請(qǐng)?jiān)O(shè)計(jì)一個(gè)一百億的計(jì)算器..........................................................................7

10、使用final關(guān)鍵字修飾一個(gè)變量時(shí),是引用不能變,還是引用的對(duì)象不能變?.............................8

11、“==”和equals方法究竟有什么區(qū)別?................................................................8

12、靜態(tài)變量和實(shí)例變量的區(qū)別?.......................................................................9

13、是否可以從一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用?.........................................9

14、Integer與int的區(qū)別..............................................................................9

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

16、下面的代碼有什么不妥之處?........................................................................9

17、請(qǐng)說出作用域public,private,protected,以及不寫時(shí)的區(qū)別.........................................9

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

19、構(gòu)造器Constructor是否可被override?.............................................................10 20、接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)(implements)接口? 抽象類是否可繼承具體類(concrete class)? 抽象類中是否可以有靜態(tài)的main方法?.........................................................................10

21、寫clone()方法時(shí),通常都有一行代碼,是什么?.....................................................10

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

23、java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?....................................................................11

24、abstract class和interface有什么區(qū)別?...........................................................11

25、abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?.............13

26、什么是內(nèi)部類?Static Nested Class 和 Inner Class的不同。........................................13

27、內(nèi)部類可以引用它的包含類的成員嗎?有沒有什么限制?..............................................14

28、Anonymous Inner Class(匿名內(nèi)部類)是否可以extends(繼承)其它類,是否可以implements(實(shí)現(xiàn))interface(接口)?....................................................................................................14

29、super.getClass()方法調(diào)用........................................................................15 30、String是最基本的數(shù)據(jù)類型嗎?.....................................................................15

31、String s = “Hello”;s = s + “ world!”;這兩行代碼執(zhí)行后,原始的String對(duì)象中的內(nèi)容到底變了沒有?......15

32、是否可以繼承String類?..........................................................................16

33、String s = new String(“xyz”);創(chuàng)建了幾個(gè)String Object? 二者之間有什么區(qū)別?......................16

34、String 和StringBuffer的區(qū)別....................................................................16

35、如何把一段逗號(hào)分割的字符串轉(zhuǎn)換成一個(gè)數(shù)組?.......................................................16

36、數(shù)組有沒有l(wèi)ength()這個(gè)方法? String有沒有l(wèi)ength()這個(gè)方法?.....................................16

37、下面這條語句一共創(chuàng)建了多少個(gè)對(duì)象:String s=“a”+“b”+“c”+“d”;.....................................16

38、try {}里有一個(gè)return語句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?.....................................................................................17

39、下面的程序代碼輸出的結(jié)果是多少?................................................................17 40、final, finally, finalize的區(qū)別。................................................................19

41、運(yùn)行時(shí)異常與一般異常有何異同?..................................................................19

42、error和exception有什么區(qū)別?....................................................................19

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

44、請(qǐng)寫出你最常見到的5個(gè)runtime exception。.......................................................19

45、JAVA語言如何進(jìn)行異常處理,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎?..............................................................................................20

46、java中有幾種方法可以實(shí)現(xiàn)一個(gè)線程?用什么關(guān)鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?20

47、sleep()和 wait()有什么區(qū)別?...................................................................20

48、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。........................................22 49.下面兩個(gè)方法同步嗎?(自己發(fā)明)................................................................22 50、多線程有幾種實(shí)現(xiàn)方法?同步有幾種實(shí)現(xiàn)方法?........................................................23

51、啟動(dòng)一個(gè)線程是用run()還是start()?.............................................................23

52、當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法?............23

53、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系................................................23

54、簡述synchronized和java.util.concurrent.locks.Lock的異同 ?....................................23

55、設(shè)計(jì)4個(gè)線程,其中兩個(gè)線程每次對(duì)j增加1,另外兩個(gè)線程對(duì)j每次減少1。寫出程序。.................25

56、子線程循環(huán)10次,接著主線程循環(huán)100,接著又回到子線程循環(huán)10次,接著再回到主線程又循環(huán)100,如此循環(huán)50次,請(qǐng)寫出程序。....................................................................................26

57、介紹Collection框架的結(jié)構(gòu).......................................................................31

58、Collection框架中實(shí)現(xiàn)比較要實(shí)現(xiàn)什么接口..........................................................31

59、ArrayList和Vector的區(qū)別........................................................................31 60、HashMap和Hashtable的區(qū)別.......................................................................31 61、List 和 Map 區(qū)別?...............................................................................32 62、List, Set, Map是否繼承自Collection接口?........................................................32 63、List、Map、Set三個(gè)接口,存取元素時(shí),各有什么特點(diǎn)?..............................................32 64、說出ArrayList,Vector, LinkedList的存儲(chǔ)性能和特性...............................................32 65、去掉一個(gè)Vector集合中重復(fù)的元素.................................................................33 66、Collection 和 Collections的區(qū)別。...............................................................33 67、Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別?.....33 68、你所知道的集合類都有哪些?主要方法?............................................................33 69、兩個(gè)對(duì)象值相同(x.equals(y)== true),但卻可有不同的hash code,這句話對(duì)不對(duì)?.....................33 70、TreeSet里面放對(duì)象,如果同時(shí)放入了父類和子類的實(shí)例對(duì)象,那比較時(shí)使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常!................................................................33 71、說出一些常用的類,包,接口,請(qǐng)各舉5個(gè)..........................................................34 72、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請(qǐng)說出他們分別是哪些類?......35 73、字節(jié)流與字符流的區(qū)別............................................................................35 74、什么是java序列化,如何實(shí)現(xiàn)java序列化?或者請(qǐng)解釋Serializable接口的作用。.....................36 75、描述一下JVM加載class文件的原理機(jī)制?...........................................................36 76、heap和stack有什么區(qū)別。........................................................................36 77、GC是什么? 為什么要有GC?........................................................................36 78、垃圾回收的優(yōu)點(diǎn)和原理。并考慮2種回收機(jī)制。......................................................36 79、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存嗎?有什么辦法主動(dòng)通知虛擬機(jī)進(jìn)行垃圾回收? 36 80、什么時(shí)候用assert。..............................................................................37 81、java中會(huì)存在內(nèi)存泄漏嗎,請(qǐng)簡單描述。............................................................37 82、能不能自己寫個(gè)類,也叫java.lang.String?........................................................39 83.Java代碼查錯(cuò)........................................................................................40 二.算法與編程...........................................................................................43

1、編寫一個(gè)程序,將a.txt文件中的單詞與b.txt文件中的單詞交替合并到c.txt文件中,a.txt文件中的單詞用回車符分隔,b.txt文件中用回車或空格進(jìn)行分隔。.............................................................43

2、編寫一個(gè)程序,將d:java目錄下的所有.java文件復(fù)制到d:jad目錄下,并將原來文件的擴(kuò)展名從.java改為.jad。....................................................................................................44

3、編寫一個(gè)截取字符串的函數(shù),輸入為一個(gè)字符串和字節(jié)數(shù),輸出為按字節(jié)截取的字符串,但要保證漢字不被截取半個(gè),如“我ABC”,4,應(yīng)該截取“我AB”,輸入“我ABC漢DEF”,6,應(yīng)該輸出“我ABC”,而不是“我ABC+漢的半個(gè)”。..............................................................................................46

4、有一個(gè)字符串,其中包含中文字符、英文字符和數(shù)字字符,請(qǐng)統(tǒng)計(jì)和打印出各個(gè)字符的個(gè)數(shù)。...............46

5、說明生活中遇到的二叉樹,用java實(shí)現(xiàn)二叉樹........................................................47

6、從類似如下的文本文件中讀取出所有的姓名,并打印出重復(fù)的姓名和重復(fù)的次數(shù),并按重復(fù)次數(shù)排序:.......52

7、寫一個(gè)Singleton出來。...........................................................................54

8、遞歸算法題1......................................................................................56

9、遞歸算法題2......................................................................................57

10、排序都有哪幾種方法?請(qǐng)列舉。用JAVA實(shí)現(xiàn)一個(gè)快速排序。...........................................58

11、有數(shù)組a[n],用java代碼將數(shù)組元素順序顛倒.......................................................59 12.金額轉(zhuǎn)換,阿拉伯?dāng)?shù)字的金額轉(zhuǎn)換成中國傳統(tǒng)的形式如:(¥1011)->(一千零一拾一元整)輸出。.......59 三.html&JavaScript&ajax部分............................................................................60 1.判斷第二個(gè)日期比第一個(gè)日期大.....................................................................60 2.用table顯示n條記錄,每3行換一次顏色,即1,2,3用紅色字體,4,5,6用綠色字體,7,8,9用紅顏色字體。....................................................................................................61

3、HTML 的 form 提交之前如何驗(yàn)證數(shù)值文本框的內(nèi)容全部為數(shù)字? 否則的話提示用戶并終止提交?.............61

4、請(qǐng)寫出用于校驗(yàn)HTML文本框中輸入的內(nèi)容全部為數(shù)字的javascript代碼.................................62

5、說說你用過那些ajax技術(shù)和框架,說說它們的區(qū)別....................................................62 四.Java web部分........................................................................................62

1、Tomcat的優(yōu)化經(jīng)驗(yàn).................................................................................62

2、HTTP請(qǐng)求的GET與POST方式的區(qū)別..................................................................62

3、解釋一下什么是servlet;...........................................................................62

4、說一說Servlet的生命周期?........................................................................62

5、Servlet的基本架構(gòu)................................................................................63

6、SERVLET API中forward()與redirect()的區(qū)別?.....................................................63

7、什么情況下調(diào)用doGet()和doPost()?...............................................................63

8、Request對(duì)象的主要方法:..........................................................................63

9、forward 和redirect的區(qū)別........................................................................64

10、request.getAttribute()和 request.getParameter()有何區(qū)別?......................................64 11.jsp有哪些內(nèi)置對(duì)象?作用分別是什么? 分別有什么方法?..............................................64 12.jsp有哪些動(dòng)作?作用分別是什么?...................................................................64

13、JSP的常用指令...................................................................................64 14.JSP中動(dòng)態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?.........................................................64

15、兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別?..............................................................64

16、頁面間對(duì)象傳遞的方法............................................................................65

17、JSP和Servlet有哪些相同點(diǎn)和不同點(diǎn),他們之間的聯(lián)系是什么?.......................................65

18、MVC的各個(gè)部分都有那些技術(shù)來實(shí)現(xiàn)?如何實(shí)現(xiàn)?.......................................................65

19、我們?cè)趙eb應(yīng)用開發(fā)過程中經(jīng)常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個(gè)某種編碼的字符串?65 20.現(xiàn)在輸入n個(gè)數(shù)字,以逗號(hào),分開;然后可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什么排序,結(jié)果為,提供reset...........................................................................................65 五.數(shù)據(jù)庫部分...........................................................................................65

1、用兩種方式根據(jù)部門號(hào)從高到低,工資從低到高列出每個(gè)員工的信息。...................................65

2、列出各個(gè)部門中工資高于本部門的平均工資的員工數(shù)和部門號(hào),并按部門號(hào)排序...........................65

3、存儲(chǔ)過程與觸發(fā)器必須講,經(jīng)常被面試到?............................................................66

4、數(shù)據(jù)庫三范式是什么?..............................................................................68

5、說出一些數(shù)據(jù)庫優(yōu)化方面的經(jīng)驗(yàn)?....................................................................68

6、union和union all有什么不同?.....................................................................69 7.分頁語句..........................................................................................70 8.用一條SQL語句 查詢出每門課都大于80分的學(xué)生姓名..................................................72 9.所有部門之間的比賽組合............................................................................73 10.每個(gè)月份的發(fā)生額都比101科目多的科目.............................................................73 11.統(tǒng)計(jì)每年每月的信息...............................................................................74 12.顯示文章標(biāo)題,發(fā)帖人、最后回復(fù)時(shí)間...............................................................75 13.刪除除了id號(hào)不同,其他都相同的學(xué)生冗余信息.......................................................75 14.航空網(wǎng)的幾個(gè)航班查詢題:.........................................................................76 15.查出比經(jīng)理薪水還高的員工信息:...................................................................77

16、求出小于45歲的各個(gè)老師所帶的大于12歲的學(xué)生人數(shù)................................................77 17.求出發(fā)帖最多的人:...............................................................................78

18、一個(gè)用戶表中有一個(gè)積分字段,假如數(shù)據(jù)庫中有100多萬個(gè)用戶,若要在每年第一天凌晨將積分清零,你將考慮什么,你將想什么辦法解決?.............................................................................78

19、一個(gè)用戶具有多個(gè)角色,請(qǐng)查詢出該表中具有該用戶的所有角色的其他用戶。............................79 20.xxx公司的sql面試...............................................................................79

21、注冊(cè)Jdbc驅(qū)動(dòng)程序的三種方式.....................................................................79

22、用JDBC如何調(diào)用存儲(chǔ)過程.........................................................................79

23、JDBC中的PreparedStatement相比Statement的好處..................................................80 24.寫一個(gè)用jdbc連接并訪問oracle數(shù)據(jù)的程序代碼....................................................81

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

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

27、用 JDBC 查詢學(xué)生成績單, 把主要代碼寫出來(考試概率極大)........................................81

28、這段代碼有什么不足之處?.........................................................................82

29、說出數(shù)據(jù)連接池的工作機(jī)制是什么?.................................................................82 30、為什么要用 ORM? 和 JDBC 有何不一樣?............................................................82 六.XML部分.............................................................................................82

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

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

3、用jdom解析xml文件時(shí)如何解決中文問題?如何解析?..................................................82

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

5、XML文檔定義有幾種形式?它們之間有何本質(zhì)區(qū)別?解析XML文檔有哪幾種方式?..........................85 七.流行的框架與新技術(shù)...................................................................................85

1、談?wù)勀銓?duì)Struts的理解。..........................................................................85

2、談?wù)勀銓?duì)Hibernate的理解。.......................................................................85

3、AOP的作用。......................................................................................86

4、你對(duì)Spring的理解。..............................................................................86

5、談?wù)凷truts中的Action servlet。..................................................................87

6、Struts優(yōu)缺點(diǎn) 優(yōu)點(diǎn): 1.實(shí)現(xiàn)MVC模式,結(jié)構(gòu)清晰,使開發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).....................87

7、STRUTS的應(yīng)用(如STRUTS架構(gòu))......................................................................87

8、說說struts1與struts2的區(qū)別。...................................................................87

9、hibernate中的update()和saveOrUpdate()的區(qū)別,session的load()和get()的區(qū)別。...................88

10、簡述 Hibernate 和 JDBC 的優(yōu)缺點(diǎn)? 如何書寫一個(gè) one to many 配置文件..............................88

11、iBatis與Hibernate有什么不同?...................................................................88

12、寫Hibernate的一對(duì)多和多對(duì)一雙向關(guān)聯(lián)的orm配置?.................................................88

9、hibernate的inverse屬性的作用?...................................................................88

13、在DAO中如何體現(xiàn)DAO設(shè)計(jì)模式?...................................................................88

14、spring+Hibernate中委托方案怎么配置?.............................................................88

15、spring+Hibernate中委托方案怎么配置?.............................................................89 16.hibernate進(jìn)行多表查詢每個(gè)表中各取幾個(gè)字段,也就是說查詢出來的結(jié)果集沒有一個(gè)實(shí)體類與之對(duì)應(yīng)如何解決;....................................................................................................89 17.介紹一下Hibernate的二級(jí)緩存.....................................................................89

18、Spring 的依賴注入是什么意思? 給一個(gè) Bean 的 message 屬性, 字符串類型, 注入值為 “Hello” 的 XML 配置文件該怎么寫?...........................................................................................90

19、Jdo是什么?......................................................................................90 20、什么是spring的IOC AOP.........................................................................90

21、STRUTS的工作流程!..............................................................................90

22、spring 與EJB的區(qū)別!.........................................................................90 八.軟件工程與設(shè)計(jì)模式...................................................................................90

1、UML方面..........................................................................................90

2、j2ee常用的設(shè)計(jì)模式?說明工廠模式。...............................................................90

3、開發(fā)中都用到了那些設(shè)計(jì)模式?用在什么場合?.........................................................91 九.j2ee部分............................................................................................91

1、BS與CS的聯(lián)系與區(qū)別。............................................................................91

2、應(yīng)用服務(wù)器與WEB SERVER的區(qū)別?..................................................................91

3、應(yīng)用服務(wù)器有那些?...............................................................................92

4、J2EE是什么?.....................................................................................92

5、J2EE是技術(shù)還是平臺(tái)還是框架? 什么是J2EE.........................................................92

6、請(qǐng)對(duì)以下在J2EE中常用的名詞進(jìn)行解釋(或簡單描述)..................................................92

7、如何給weblogic指定大小的內(nèi)存?...................................................................92

8、如何設(shè)定的weblogic的熱啟動(dòng)模式(開發(fā)模式)與產(chǎn)品發(fā)布模式?.........................................92

9、如何啟動(dòng)時(shí)不需輸入用戶名與密碼?..................................................................92

10、在weblogic管理制臺(tái)中對(duì)一個(gè)應(yīng)用域(或者說是一個(gè)網(wǎng)站,Domain)進(jìn)行jms及ejb或連接池等相關(guān)信息進(jìn)行配置后,實(shí)際保存在什么文件中?.................................................................................92

11、說說weblogic中一個(gè)Domain的缺省目錄結(jié)構(gòu)?比如要將一個(gè)簡單的helloWorld.jsp放入何目錄下,然的在瀏覽器上就可打入http://主機(jī):端口號(hào)//helloword.jsp就可以看到運(yùn)行結(jié)果了? 又比如這其中用到了一個(gè)自己寫的javaBean該如何辦?.................................................................................................92

12、在weblogic中發(fā)布ejb需涉及到哪些配置文件.......................................................92

13、如何在weblogic中進(jìn)行ssl配置與客戶端的認(rèn)證配置或說說j2ee(標(biāo)準(zhǔn))進(jìn)行ssl的配置?..................93

14、如何查看在weblogic中已經(jīng)發(fā)布的EJB?.............................................................93 十.EBJ部分.............................................................................................93

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

2、簡要講一下 EJB 的 7 個(gè) Transaction Level?........................................................93

3、EJB與JAVA BEAN的區(qū)別?..........................................................................93

4、EJB包括(SessionBean,EntityBean)說出他們的生命周期,及如何管理事務(wù)的?..........................93

5、EJB容器提供的服務(wù)................................................................................93

6、EJB的激活機(jī)制....................................................................................93

7、EJB的幾種類型....................................................................................93

8、客服端調(diào)用EJB對(duì)象的幾個(gè)基本步驟.................................................................94 十一.webservice部分....................................................................................94

1、WEB SERVICE名詞解釋。JSWDL開發(fā)包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。................94

2、CORBA是什么?用途是什么?..........................................................................94 3.Linux.................................................................................................94

4、LINUX下線程,GDI類的解釋。......................................................................94 5.問得稀里糊涂的題......................................................................................94

6、四種會(huì)話跟蹤技術(shù).................................................................................94

7、簡述邏輯操作(&,|,^)與條件操作(&&,||)的區(qū)別。.....................................................94 十二.其他...............................................................................................94

1、請(qǐng)用英文簡單介紹一下自己.........................................................................94

2、請(qǐng)把 http://tomcat.apache.org/ 首頁的這一段話用中文翻譯一下?.....................................94

3、美資軟件公司JAVA工程師電話面試題目..............................................................95

這套面試題主要目的是幫助那些還沒有java軟件開發(fā)實(shí)際工作經(jīng)驗(yàn),而正在努力尋找java軟件開發(fā)工作的朋友在筆試時(shí)更好地贏得筆試和面試。由于這套面試題涉及的范圍很泛,很廣,很雜,大家不可能一天兩天就看完和學(xué)完這套面試寶典,即使你已經(jīng)學(xué)過了有關(guān)的技術(shù),那么至少也需要一個(gè)月的時(shí)間才能消化和掌握這套面試寶典,所以,大家應(yīng)該早作準(zhǔn)備,從拿到這套面試寶典之日起,就要堅(jiān)持在每天閑暇之余學(xué)習(xí)其中幾道題目,日積月累,等到出去面試時(shí),一切都水到渠成,面試時(shí)就自然會(huì)游刃有余了。

答題時(shí),先答是什么,再答有什么作用和要注意什么(這部分最重要,展現(xiàn)自己的心得)

答案的段落分別,層次分明,條理清晰都非常重要,從這些表面的東西也可以看出一個(gè)人的習(xí)慣、辦事風(fēng)格、條理等。要講你做出答案的思路過程,或者說你記住答案的思想都寫下來。把答題想著是辯論賽。答題就是給別人講道理、擺事實(shí)。答題不局限于什么格式和形式,就是要將自己的學(xué)識(shí)展現(xiàn)出來!

別因?yàn)槿思翌}目本來就模棱兩可,你就心里膽怯和沒底氣了,不敢回答了。你要大膽地指出對(duì)方題目很模糊和你的觀點(diǎn),不要把

面試官想得有多高,其實(shí)他和你就是差不多的,你想想,如果他把你招進(jìn)去了,你們以后就是同事了,可不是差不多的嗎?

關(guān)于就業(yè)薪水,如果你是應(yīng)屆生,那不能要高工資,好比大餅的故事,沒有文憑還想拿高工資,就去中關(guān)村缺什么補(bǔ)什么吧!少數(shù)人基礎(chǔ)確實(shí)很好,在校期間確實(shí)又做過一些項(xiàng)目,那仍然是可以要到相對(duì)高的工資的。1.Java基礎(chǔ)部分

基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語法,集合的語法,io 的語法,虛擬機(jī)方面的語法。

1、一個(gè)“.java”源文件中是否可以包括多個(gè)類(不是內(nèi)部類)?有什么限制? 可以有多個(gè)類,但只能有一個(gè)public的類,并且public的類名必須與文件名相一致。

2、Java有沒有g(shù)oto? java中的保留字,現(xiàn)在沒有在java中使用。

3、說說&和&&的區(qū)別。

&和&&都可以用作邏輯與的運(yùn)算符,表示邏輯與(and),當(dāng)運(yùn)算符兩邊的表達(dá)式的結(jié)果都為true時(shí),整個(gè)運(yùn)算結(jié)果才為true,否則,只要有一方為false,則結(jié)果為false。

&&還具有短路的功能,即如果第一個(gè)表達(dá)式為false,則不再計(jì)算第二個(gè)表達(dá)式,例如,對(duì)于if(str!= null &&!str.equals(“”))表達(dá)式,當(dāng)str為null時(shí),后面的表達(dá)式不會(huì)執(zhí)行,所以不會(huì)出現(xiàn)NullPointerException如果將&&改為&,則會(huì)拋出NullPointerException異常。If(x==33 & ++y>0)y會(huì)增長,If(x==33 && ++y>0)不會(huì)增長

&還可以用作位運(yùn)算符,當(dāng)&操作符兩邊的表達(dá)式不是boolean類型時(shí),&表示按位與操作,我們通常使用0x0f來與一個(gè)整數(shù)進(jìn)行&運(yùn)算,來獲取該整數(shù)的最低4個(gè)bit位,例如,0x31 & 0x0f的結(jié)果為0x01。

備注:這道題先說兩者的共同點(diǎn),再說出&&和&的特殊之處,并列舉一些經(jīng)典的例子來表明自己理解透徹深入、實(shí)際經(jīng)驗(yàn)豐富。

4、在JAVA中如何跳出當(dāng)前的多重嵌套循環(huán)?

在Java中,要想跳出多重循環(huán),可以在外面的循環(huán)語句前定義一個(gè)標(biāo)號(hào),然后在里層循環(huán)體的代碼中使用帶有標(biāo)號(hào)的break 語句,即可跳出外層循環(huán)。例如,ok: for(int i=0;i<10;i++){

} 另外,我個(gè)人通常并不使用標(biāo)號(hào)這種方式,而是讓外層的循環(huán)條件表達(dá)式的結(jié)果可以受到里層循環(huán)體代碼的控制,例如,要在二維數(shù)組中查找到某個(gè)數(shù)字。

int arr[][] = {{1,2,3},{4,5,6,7},{9}};boolean found = false;for(int i=0;i

}

5、switch語句能否作用在byte上,能否作用在long上,能否作用在String上? 在switch(condition)中,condition只能是一個(gè)整數(shù)表達(dá)式或者枚舉常量(更大字體),整數(shù)表達(dá)式可以是int基本類型或Integer包裝類型,由于,byte,short,char都可以隱式轉(zhuǎn)換為int,所以,這些類型以及這些類型的包裝類型也是可以的。顯然,long和String類型都不符合switch的語法規(guī)定,并且不能被隱式轉(zhuǎn)換成int類型,所以,它們不能作用于swtich語句中。

6、short s1 = 1;s1 = s1 + 1;有什么錯(cuò)? short s1 = 1;s1 += 1;有什么錯(cuò)? 對(duì)于short s1 = 1;s1 = s1 + 1;由于s1+1運(yùn)算時(shí)會(huì)自動(dòng)提升表達(dá)式的類型,所以結(jié)果是int型,再賦值給short類型s1時(shí),編譯器將報(bào)告需要強(qiáng)制轉(zhuǎn)換類型的錯(cuò)誤。

對(duì)于short s1 = 1;s1 += 1;由于 += 是java語言規(guī)定的運(yùn)算符,java編譯器會(huì)對(duì)它進(jìn)行特殊處理,因此可以正確編譯。for(int j=0;j

} System.out.println(“i=” + i + “,j=” + j);if(arr[i][j] == 5){

} found = true;break;

{ for(int j=0;j<10;j++)

} if(j == 5)break ok;

{ System.out.println(“i=” + i + “,j=” + j);

7、char型變量中能不能存貯一個(gè)中文漢字?為什么? char型變量是用來存儲(chǔ)Unicode編碼的字符的,unicode編碼字符集中包含了漢字,所以,char型變量中當(dāng)然可以存儲(chǔ)漢字啦。不過,如果某個(gè)特殊的漢字沒有被包含在unicode編碼字符集中,那么,這個(gè)char型變量中就不能存儲(chǔ)這個(gè)特殊漢字。補(bǔ)充說明:unicode編碼占用兩個(gè)字節(jié),所以,char類型的變量也是占用兩個(gè)字節(jié)。

備注:后面一部分回答雖然不是在正面回答題目,但是,為了展現(xiàn)自己的學(xué)識(shí)和表現(xiàn)自己對(duì)問題理解的透徹深入,可以回答一些相關(guān)的知識(shí),做到知無不言,言無不盡。

8、用最有效率的方法算出2乘以8等於幾? 2 << 3,因?yàn)閷⒁粋€(gè)數(shù)左移n位,就相當(dāng)于乘以了2的n次方,那么,一個(gè)數(shù)乘以8只要將其左移3位即可,而位運(yùn)算cpu直接支持的,效率最高,所以,2乘以8等於幾的最效率的方法是2 << 3。

9、請(qǐng)?jiān)O(shè)計(jì)一個(gè)一百億的計(jì)算器

首先要明白這道題目的考查點(diǎn)是什么,一是大家首先要對(duì)計(jì)算機(jī)原理的底層細(xì)節(jié)要清楚、要知道加減法的位運(yùn)算原理和知道計(jì)算機(jī)中的算術(shù)運(yùn)算會(huì)發(fā)生越界的情況,二是要具備一定的面向?qū)ο蟮脑O(shè)計(jì)思想。

首先,計(jì)算機(jī)中用固定數(shù)量的幾個(gè)字節(jié)來存儲(chǔ)的數(shù)值,所以計(jì)算機(jī)中能夠表示的數(shù)值是有一定的范圍的,為了便于講解和理解,我們先以byte 類型的整數(shù)為例,它用1個(gè)字節(jié)進(jìn)行存儲(chǔ),表示的最大數(shù)值范圍為-128到+127。-1在內(nèi)存中對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)為11111111,如果兩個(gè)-1相加,不考慮Java運(yùn)算時(shí)的類型提升,運(yùn)算后會(huì)產(chǎn)生進(jìn)位,二進(jìn)制結(jié)果為1,11111110,由于進(jìn)位后超過了byte類型的存儲(chǔ)空間,所以進(jìn)位部分被舍棄,即最終的結(jié)果為11111110,也就是-2,這正好利用溢位的方式實(shí)現(xiàn)了負(fù)數(shù)的運(yùn)算。-128在內(nèi)存中對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)為10000000,如果兩個(gè)-128相加,不考慮Java運(yùn)算時(shí)的類型提升,運(yùn)算后會(huì)產(chǎn)生進(jìn)位,二進(jìn)制結(jié)果為1,00000000,由于進(jìn)位后超過了byte類型的存儲(chǔ)空間,所以進(jìn)位部分被舍棄,即最終的結(jié)果為00000000,也就是0,這樣的結(jié)果顯然不是我們期望的,這說明計(jì)算機(jī)中的算術(shù)運(yùn)算是會(huì)發(fā)生越界情況的,兩個(gè)數(shù)值的運(yùn)算結(jié)果不能超過計(jì)算機(jī)中的該類型的數(shù)值范圍。由于Java中涉及表達(dá)式運(yùn)算時(shí)的類型自動(dòng)提升,我們無法用byte類型來做演示這種問題和現(xiàn)象的實(shí)驗(yàn),大家可以用下面一個(gè)使用整數(shù)做實(shí)驗(yàn)的例子程序體驗(yàn)一下:

先不考慮long類型,由于int的正數(shù)范圍為2的31次方,表示的最大數(shù)值約等于2*1000*1000*1000,也就是20億的大小,所以,要實(shí)現(xiàn)一個(gè)一百億的計(jì)算器,我們得自己設(shè)計(jì)一個(gè)類可以用于表示很大的整數(shù),并且提供了與另外一個(gè)整數(shù)進(jìn)行加減乘除的功能,大概功能如下:

()這個(gè)類內(nèi)部有兩個(gè)成員變量,一個(gè)表示符號(hào),另一個(gè)用字節(jié)數(shù)組表示數(shù)值的二進(jìn)制數(shù)()有一個(gè)構(gòu)造方法,把一個(gè)包含有多位數(shù)值的字符串轉(zhuǎn)換到內(nèi)部的符號(hào)和字節(jié)數(shù)組中()提供加減乘除的功能 public class BigInteger{

int sign;byte[] val;public Biginteger(String val)

} public BigInteger add(BigInteger other)} public BigInteger subtract(BigInteger other){ } public BigInteger multiply(BigInteger other){ } public BigInteger divide(BigInteger other){

{ sign =;val =;

{ int a = Integer.MAX_VALUE;int b = Integer.MAX_VALUE;int sum = a + b;System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);

} 備注:要想寫出這個(gè)類的完整代碼,是非常復(fù)雜的,如果有興趣的話,可以參看jdk中自帶的java.math.BigInteger類的源碼。面試的人也知道誰都不可能在短時(shí)間內(nèi)寫出這個(gè)類的完整代碼的,他要的是你是否有這方面的概念和意識(shí),他最重要的還是考查你的能力,所以,你不要因?yàn)樽约簾o法寫出完整的最終結(jié)果就放棄答這道題,你要做的就是你比別人寫得多,證明你比別人強(qiáng),你有這方面的思想意識(shí)就可以了,畢竟別人可能連題目的意思都看不懂,什么都沒寫,你要敢于答這道題,即使只答了一部分,那也與那些什么都不懂的人區(qū)別出來,拉開了距離,算是矮子中的高個(gè),機(jī)會(huì)當(dāng)然就屬于你了。另外,答案中的框架代碼也很重要,體現(xiàn)了一些面向?qū)ο笤O(shè)計(jì)的功底,特別是其中的方法命名很專業(yè),用的英文單詞很精準(zhǔn),這也是能力、經(jīng)驗(yàn)、專業(yè)性、英語水平等多個(gè)方面的體現(xiàn),會(huì)給人留下很好的印象,在編程能力和其他方面條件差不多的情況下,英語好除了可以使你獲得更多機(jī)會(huì)外,薪水可以高出一千元。

10、使用final關(guān)鍵字修飾一個(gè)變量時(shí),是引用不能變,還是引用的對(duì)象不能變?

使用final關(guān)鍵字修飾一個(gè)變量時(shí),是指引用變量不能變,引用變量所指向的對(duì)象中的內(nèi)容還是可以改變的。例如,對(duì)于如下語句:

final StringBuffer a=new StringBuffer(“immutable”);執(zhí)行如下語句將報(bào)告編譯期錯(cuò)誤:

a=new StringBuffer(“");但是,執(zhí)行如下語句則可以通過編譯:

a.append(” broken!“);

有人在定義方法的參數(shù)時(shí),可能想采用如下形式來阻止方法內(nèi)部修改傳進(jìn)來的參數(shù)對(duì)象:

public void method(final StringBuffer param){ } 實(shí)際上,這是辦不到的,在該方法內(nèi)部仍然可以增加如下代碼來修改參數(shù)對(duì)象:

param.append(”a“);

11、”==“和equals方法究竟有什么區(qū)別?

(單獨(dú)把一個(gè)東西說清楚,然后再說清楚另一個(gè),這樣,它們的區(qū)別自然就出來了,混在一起說,則很難說清楚)

==操作符專門用來比較兩個(gè)變量的值是否相等,也就是用于比較變量所對(duì)應(yīng)的內(nèi)存中所存儲(chǔ)的數(shù)值是否相同,要比較兩個(gè)基本類型的數(shù)據(jù)或兩個(gè)引用變量是否相等,只能用==操作符。

如果一個(gè)變量指向的數(shù)據(jù)是對(duì)象類型的,那么,這時(shí)候涉及了兩塊內(nèi)存,對(duì)象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,例如Objet obj = new Object();變量obj是一個(gè)內(nèi)存,new Object()是另一個(gè)內(nèi)存,此時(shí),變量obj所對(duì)應(yīng)的內(nèi)存中存儲(chǔ)的數(shù)值就是對(duì)象占用的那塊內(nèi)存的首地址。對(duì)于指向?qū)ο箢愋偷淖兞浚绻容^兩個(gè)變量是否指向同一個(gè)對(duì)象,即要看這兩個(gè)變量所對(duì)應(yīng)的內(nèi)存中的數(shù)值是否相等,這時(shí)候就需要用==操作符進(jìn)行比較。

equals方法是用于比較兩個(gè)獨(dú)立對(duì)象的內(nèi)容是否相同,就好比去比較兩個(gè)人的長相是否相同,它比較的兩個(gè)對(duì)象是獨(dú)立的。例如,對(duì)于下面的代碼:

String a=new String(”foo“);String b=new String(”foo“);兩條new語句創(chuàng)建了兩個(gè)對(duì)象,然后用a,b這兩個(gè)變量分別指向了其中一個(gè)對(duì)象,這是兩個(gè)不同的對(duì)象,它們的首地址是不同的,即a和b中存儲(chǔ)的數(shù)值是不相同的,所以,表達(dá)式a==b將返回false,而這兩個(gè)對(duì)象中的內(nèi)容是相同的,所以,表達(dá)式a.equals(b)將返回true。

在實(shí)際開發(fā)中,我們經(jīng)常要比較傳遞進(jìn)行來的字符串內(nèi)容是否等,例如,String input = ?;input.equals(“quit”),許多人稍不注意就使用==進(jìn)行比較了,這是錯(cuò)誤的,隨便從網(wǎng)上找?guī)讉€(gè)項(xiàng)目實(shí)戰(zhàn)的教學(xué)視頻看看,里面就有大量這樣的錯(cuò)誤。記住,字符串的比較基本上都是使用equals方法。

如果一個(gè)類沒有自己定義equals方法,那么它將繼承Object類的equals方法,Object類的equals方法的實(shí)現(xiàn)代碼如下: boolean equals(Object o){ return this==o;} 這說明,如果一個(gè)類沒有自己定義equals方法,它默認(rèn)的equals方法(從Object 類繼承的)就是使用==操作符,也是在比較兩個(gè)變量指向的對(duì)象是否是同一對(duì)象,這時(shí)候使用equals和使用==會(huì)得到同樣的結(jié)果,如果比較的是兩個(gè)獨(dú)立的對(duì)象則總返回false。如果你編寫的類希望能夠比較該類創(chuàng)建的兩個(gè)實(shí)例對(duì)象的內(nèi)容是否相同,那么你必須覆蓋equals方法,由你自己寫代碼來決定在什么情況即可認(rèn)為兩個(gè)對(duì)象的內(nèi)容是相同的。}

12、靜態(tài)變量和實(shí)例變量的區(qū)別?

在語法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字,而實(shí)例變量前則不加。

在程序運(yùn)行時(shí)的區(qū)別:實(shí)例變量屬于某個(gè)對(duì)象的屬性,必須創(chuàng)建了實(shí)例對(duì)象,其中的實(shí)例變量才會(huì)被分配空間,才能使用這個(gè)實(shí)例變量。靜態(tài)變量不屬于某個(gè)實(shí)例對(duì)象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實(shí)例對(duì)象,靜態(tài)變量就會(huì)被分配空間,靜態(tài)變量就可以被使用了。總之,實(shí)例變量必須創(chuàng)建對(duì)象后才可以通過這個(gè)對(duì)象來使用,靜態(tài)變量則可以直接使用類名來引用。

例如,對(duì)于下面的程序,無論創(chuàng)建多少個(gè)實(shí)例對(duì)象,永遠(yuǎn)都只分配了一個(gè)staticVar變量,并且每創(chuàng)建一個(gè)實(shí)例對(duì)象,這個(gè)staticVar就會(huì)加1;但是,每創(chuàng)建一個(gè)實(shí)例對(duì)象,就會(huì)分配一個(gè)instanceVar,即可能分配多個(gè)instanceVar,并且每個(gè)instanceVar的值都只自加了1次。

public class VariantTest{

} 備注:這個(gè)解答除了說清楚兩者的區(qū)別外,最后還用一個(gè)具體的應(yīng)用例子來說明兩者的差異,體現(xiàn)了自己有很好的解說問題和設(shè)計(jì)案例的能力,思維敏捷,超過一般程序員,有寫作能力!

13、是否可以從一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用?

不可以。因?yàn)榉莝tatic方法是要與對(duì)象關(guān)聯(lián)在一起的,必須創(chuàng)建一個(gè)對(duì)象后,才可以在該對(duì)象上進(jìn)行方法調(diào)用,而static方法調(diào)用時(shí)不需要?jiǎng)?chuàng)建對(duì)象,可以直接調(diào)用。也就是說,當(dāng)一個(gè)static方法被調(diào)用時(shí),可能還沒有創(chuàng)建任何實(shí)例對(duì)象,如果從一個(gè)static方法中發(fā)出對(duì)非static方法的調(diào)用,那個(gè)非static方法是關(guān)聯(lián)到哪個(gè)對(duì)象上的呢?這個(gè)邏輯無法成立,所以,一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用。

14、Integer與int的區(qū)別

int是java提供的8種原始數(shù)據(jù)類型之一。Java為每個(gè)原始類型提供了封裝類,Integer是java為int提供的封裝類。int的默認(rèn)值為0,而Integer的默認(rèn)值為null,即Integer可以區(qū)分出未賦值和值為0的區(qū)別,int則無法表達(dá)出未賦值的情況,例如,要想表達(dá)出沒有參加考試和考試成績?yōu)?的區(qū)別,則只能使用Integer。在JSP開發(fā)中,Integer的默認(rèn)為null,所以用el表達(dá)式在文本框中顯示時(shí),值為空白字符串,而int默認(rèn)的默認(rèn)值為0,所以用el表達(dá)式在文本框中顯示時(shí),結(jié)果為0,所以,int不適合作為web層的表單數(shù)據(jù)的類型。

在Hibernate中,如果將OID定義為Integer類型,那么Hibernate就可以根據(jù)其值是否為null而判斷一個(gè)對(duì)象是否是臨時(shí)的,如果將OID定義為了int類型,還需要在hbm映射文件中設(shè)置其unsaved-value屬性為0。

另外,Integer提供了多個(gè)與整數(shù)相關(guān)的操作方法,例如,將一個(gè)字符串轉(zhuǎn)換成整數(shù),Integer中還定義了表示整數(shù)的最大值和最小值的常量。

15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? Math類中提供了三個(gè)與取整有關(guān)的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對(duì)應(yīng),例如,ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結(jié)果為12,Math.ceil(-11.3)的結(jié)果是-11;floor的英文意義是地板,該方法就表示向下取整,Math.ceil(11.6)的結(jié)果為11,Math.ceil(-11.6)的結(jié)果是-12;最難掌握的是round方法,它表示“四舍五入”,算法為Math.floor(x+0.5),即將原來的數(shù)字加上0.5后再向下取整,所以,Math.round(11.5)的結(jié)果為12,Math.round(-11.5)的結(jié)果為-11。

16、下面的代碼有什么不妥之處? 1.if(username.equals(“zxx”){} 2.int x = 1;return x==1?true:false;public static int staticVar = 0;public int instanceVar = 0;public VariantTest(){

} staticVar++;instanceVar++;System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);

17、請(qǐng)說出作用域public,private,protected,以及不寫時(shí)的區(qū)別

這四個(gè)作用域的可見范圍如下表所示。

說明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly。

作用域 當(dāng)前類 同一package 子孫類 其他package public √ √ √ √

protected √ √ √ × friendly √ √ × × private √ × × ×

備注:只要記住了有4種訪問權(quán)限,4個(gè)訪問范圍,然后將全選和范圍在水平和垂直方向上分別按排從小到大或從大到小的順序排列,就很容易畫出上面的圖了。

18、Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類型? Overload是重載的意思,Override是覆蓋的意思,也就是重寫。

重載Overload表示同一個(gè)類中可以有多個(gè)名稱相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù)個(gè)數(shù)或類型不同)。重寫Override表示子類中的方法可以與父類中的某個(gè)方法的名稱和參數(shù)完全相同,通過子類創(chuàng)建的實(shí)例對(duì)象調(diào)用這個(gè)方法時(shí),將調(diào)用子類中的定義方法,這相當(dāng)于把父類中定義的那個(gè)完全相同的方法給覆蓋了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。子類覆蓋父類的方法時(shí),只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因?yàn)樽宇惪梢越鉀Q父類的一些問題,不能比父類有更多的問題。子類方法的訪問權(quán)限只能比父類的更大,不能更小。如果父類的方法是private類型,那么,子類則不存在覆蓋的限制,相當(dāng)于子類中增加了一個(gè)全新的方法。

至于Overloaded的方法是否可以改變返回值的類型這個(gè)問題,要看你倒底想問什么呢?這個(gè)題目很模糊。如果幾個(gè)Overloaded的方法的參數(shù)列表不一樣,它們的返回者類型當(dāng)然也可以不一樣。但我估計(jì)你想問的問題是:如果兩個(gè)方法的參數(shù)列表完全一樣,是否可以讓它們的返回值不同來實(shí)現(xiàn)重載Overload。這是不行的,我們可以用反證法來說明這個(gè)問題,因?yàn)槲覀冇袝r(shí)候調(diào)用一個(gè)方法時(shí)也可以不定義返回結(jié)果變量,即不要關(guān)心其返回結(jié)果,例如,我們調(diào)用map.remove(key)方法時(shí),雖然remove方法有返回值,但是我們通常都不會(huì)定義接收返回結(jié)果的變量,這時(shí)候假設(shè)該類中有兩個(gè)名稱和參數(shù)列表完全相同的方法,僅僅是返回類型不同,java就無法確定編程者倒底是想調(diào)用哪個(gè)方法了,因?yàn)樗鼰o法通過返回結(jié)果類型來判斷。

override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個(gè)方法并且對(duì)其重寫,以求達(dá)到不同的作用。對(duì)我們來說最熟悉的覆蓋就是對(duì)接口方法的實(shí)現(xiàn),在接口中一般只是對(duì)方法進(jìn)行了聲明,而我們?cè)趯?shí)現(xiàn)時(shí),就需要實(shí)現(xiàn)接口聲明的所有方法。除了這個(gè)典型的用法以外,我們?cè)诶^承中也可能會(huì)在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點(diǎn):

1、覆蓋的方法的標(biāo)志必須要和被覆蓋的方法的標(biāo)志完全匹配,才能達(dá)到覆蓋的效果;

2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;

4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個(gè)方法,并沒有對(duì)其進(jìn)行覆蓋。

overload對(duì)我們來說可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入?yún)?shù)來區(qū)分這些方法,然后再調(diào)用時(shí),VM就會(huì)根據(jù)不同的參數(shù)樣式,來選擇合適的方法執(zhí)行。在使用重載要注意以下的幾點(diǎn):

1、在使用重載時(shí)只能通過不同的參數(shù)樣式。例如,不同的參數(shù)類型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序(當(dāng)然,同一方法內(nèi)的幾個(gè)參數(shù)類型必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));

2、不能通過訪問權(quán)限、返回類型、拋出的異常進(jìn)行重載;

3、方法的異常類型和數(shù)目不會(huì)對(duì)重載造成影響;

4、對(duì)于繼承來說,如果某一方法在父類中是訪問權(quán)限是private,那么就不能在子類對(duì)其進(jìn)行重載,如果定義的話,也只是定義了一個(gè)新方法,而不會(huì)達(dá)到重載的效果。

19、構(gòu)造器Constructor是否可被override? 構(gòu)造器Constructor不能被繼承,因此不能重寫Override,但可以被重載Overload。

20、接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)(implements)接口? 抽象類是否可繼承具體類(concrete class)? 抽象類中是否可以有靜態(tài)的main方法?

接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implements)接口,抽象類是否可繼承具體類。抽象類中可以有靜態(tài)的main方法。備注:只要明白了接口和抽象類的本質(zhì)和作用,這些問題都很好回答,你想想,如果你是java語言的設(shè)計(jì)者,你是否會(huì)提供這樣的支持,如果不提供的話,有什么理由嗎?如果你沒有道理不提供,那答案就是肯定的了。

只有記住抽象類與普通類的唯一區(qū)別就是不能創(chuàng)建實(shí)例對(duì)象和允許有abstract方法。

21、寫clone()方法時(shí),通常都有一行代碼,是什么?

clone 有缺省行為,super.clone();因?yàn)槭紫纫迅割愔械某蓡T復(fù)制到位,然后才是復(fù)制自己的成員。

22、面向?qū)ο蟮奶卣饔心男┓矫?/p>

計(jì)算機(jī)軟件系統(tǒng)是現(xiàn)實(shí)生活中的業(yè)務(wù)在計(jì)算機(jī)中的映射,而現(xiàn)實(shí)生活中的業(yè)務(wù)其實(shí)就是一個(gè)個(gè)對(duì)象協(xié)作的過程。面向?qū)ο缶幊叹褪前船F(xiàn)實(shí)業(yè)務(wù)一樣的方式將程序代碼按一個(gè)個(gè)對(duì)象進(jìn)行組織和編寫,讓計(jì)算機(jī)系統(tǒng)能夠識(shí)別和理解用對(duì)象方式組織和編寫的程序代碼,這樣就可以把現(xiàn)實(shí)生活中的業(yè)務(wù)對(duì)象映射到計(jì)算機(jī)系統(tǒng)中。

面向?qū)ο蟮木幊陶Z言有封裝、繼承、抽象、多態(tài)等4個(gè)主要的特征。

1封裝:

封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實(shí)現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來的變動(dòng)影響。在面向?qū)ο蟮木幊陶Z言中,對(duì)象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、更為有力。面向?qū)ο蟮姆庋b就是把描述一個(gè)對(duì)象的屬性和行為的代碼封裝在一個(gè)“模塊”中,也就是一個(gè)類中,屬性用變量定義,行為用方法進(jìn)行定義,方法可以直接訪問同一個(gè)對(duì)象中的屬性。通常情況下,只要記住讓變量和訪問這個(gè)變量的方法放在一起,將一個(gè)類中的成員變量全部定義成私有的,只有這個(gè)類自己的方法才可以訪問到這些成員變量,這就基本上實(shí)現(xiàn)對(duì)象的封裝,就很容易找出要分配到這個(gè)類上的方法了,就基本上算是會(huì)面向?qū)ο蟮木幊塘恕0盐找粋€(gè)原則:把對(duì)同一事物進(jìn)行操作的方法和相關(guān)的方法放在同一個(gè)類中,把方法和它操作的數(shù)據(jù)放在同一個(gè)類中。

例如,人要在黑板上畫圓,這一共涉及三個(gè)對(duì)象:人、黑板、圓,畫圓的方法要分配給哪個(gè)對(duì)象呢?由于畫圓需要使用到圓心和半徑,圓心和半徑顯然是圓的屬性,如果將它們?cè)陬愔卸x成了私有的成員變量,那么,畫圓的方法必須分配給圓,它才能訪問到圓心和半徑這兩個(gè)屬性,人以后只是調(diào)用圓的畫圓方法、表示給圓發(fā)給消息而已,畫圓這個(gè)方法不應(yīng)該分配在人這個(gè)對(duì)象上,這就是面向?qū)ο蟮姆庋b性,即將對(duì)象封裝成一個(gè)高度自治和相對(duì)封閉的個(gè)體,對(duì)象狀態(tài)(屬性)由這個(gè)對(duì)象自己的行為(方法)來讀取和改變。一個(gè)更便于理解的例子就是,司機(jī)將火車剎住了,剎車的動(dòng)作是分配給司機(jī),還是分配給火車,顯然,應(yīng)該分配給火車,因?yàn)樗緳C(jī)自身是不可能有那么大的力氣將一個(gè)火車給停下來的,只有火車自己才能完成這一動(dòng)作,火車需要調(diào)用內(nèi)部的離合器和剎車片等多個(gè)器件協(xié)作才能完成剎車這個(gè)動(dòng)作,司機(jī)剎車的過程只是給火車發(fā)了一個(gè)消息,通知火車要執(zhí)行剎車動(dòng)作而已。

抽象:

抽象就是找出一些事物的相似和共性之處,然后將這些事物歸為一個(gè)類,這個(gè)類只考慮這些事物的相似和共性之處,并且會(huì)忽略與當(dāng)前主題和目標(biāo)無關(guān)的那些方面,將注意力集中在與當(dāng)前目標(biāo)有關(guān)的方面。例如,看到一只螞蟻和大象,你能夠想象出它們的相同之處,那就是抽象。抽象包括行為抽象和狀態(tài)抽象兩個(gè)方面。例如,定義一個(gè)Person類,如下:

class Person{

} 人本來是很復(fù)雜的事物,有很多方面,但因?yàn)楫?dāng)前系統(tǒng)只需要了解人的姓名和年齡,所以上面定義的類中只包含姓名和年齡這兩個(gè)屬性,這就是一種抽像,使用抽象可以避免考慮一些與目標(biāo)無關(guān)的細(xì)節(jié)。我對(duì)抽象的理解就是不要用顯微鏡去看一個(gè)事物的所有方面,這樣涉及的內(nèi)容就太多了,而是要善于劃分問題的邊界,當(dāng)前系統(tǒng)需要什么,就只考慮什么。

繼承:

在定義和實(shí)現(xiàn)一個(gè)類的時(shí)候,可以在一個(gè)已經(jīng)存在的類的基礎(chǔ)之上來進(jìn)行,把這個(gè)已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干新的內(nèi)容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動(dòng)共享父類數(shù)據(jù)和方法的機(jī)制,這是類之間的一種關(guān)系,提高了軟件的可重用性和可擴(kuò)展性。

多態(tài):

多態(tài)是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實(shí)現(xiàn)上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。多態(tài)性增強(qiáng)了軟件的靈活性和擴(kuò)展性。例如,下面代碼中的UserDao是一個(gè)接口,它定義引用變量userDao指向的實(shí)例對(duì)象由daofactory.getDao()在執(zhí)行的時(shí)候返回,有時(shí)候指向的是UserJdbcDao這個(gè)實(shí)現(xiàn),有時(shí)候指向的是UserHibernateDao這個(gè)實(shí)現(xiàn),這樣,不用修改源代碼,就可以改變userDao指向的具體類實(shí)現(xiàn),從而導(dǎo)致userDao.insertUser()方法調(diào)用的具體代碼也隨之改變,即有時(shí)候調(diào)用的是UserJdbcDao的insertUser方法,有時(shí)候調(diào)用的是UserHibernateDao的insertUser方法:

UserDao userDao = daofactory.getDao();userDao.insertUser(user);

比喻:人吃飯,你看到的是左手,還是右手?

23、java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?

靠的是父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對(duì)象,而程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定,就是引用變量所指向的具體實(shí)例對(duì)象的方法,也就是內(nèi)存里正在運(yùn)行的那個(gè)對(duì)象的方法,而不是引用變量的類型中定義的方法。

24、abstract class和interface有什么區(qū)別?

含有abstract修飾符的class即為抽象類,abstract 類不能創(chuàng)建的實(shí)例對(duì)象。含有abstract方法的類必須定義為abstract String name;int age;

class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實(shí)現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法。如果的子類沒有實(shí)現(xiàn)抽象父類中的所有抽象方法,那么子類也必須定義為abstract類型。

接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為public abstract類型,接口中的成員變量類型默認(rèn)為public static final。

下面比較一下兩者的語法區(qū)別:

1.抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。2.抽象類中可以有普通成員變量,接口中沒有普通成員變量

3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。4.抽象類中的抽象方法的訪問類型可以是public,protected和(默認(rèn)類型,雖然

eclipse下不報(bào)錯(cuò),但應(yīng)該也不行),但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型。5.抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法

6.抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認(rèn)即為public static final類型。7.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。下面接著再說說兩者在應(yīng)用上的區(qū)別:

接口更多的是在系統(tǒng)架構(gòu)設(shè)計(jì)方法發(fā)揮作用,主要用于定義模塊之間的通信契約。而抽象類在代碼實(shí)現(xiàn)方面發(fā)揮作用,可以實(shí)現(xiàn)代碼的重用,例如,模板方法設(shè)計(jì)模式是抽象類的一個(gè)典型應(yīng)用,假設(shè)某個(gè)項(xiàng)目的所有Servlet類都要用相同的方式進(jìn)行權(quán)限判斷、記錄訪問日志和處理異常,那么就可以定義一個(gè)抽象的基類,讓所有的Servlet都繼承這個(gè)抽象基類,在抽象基類的service方法中完成權(quán)限判斷、記錄訪問日志和處理異常的代碼,在各個(gè)子類中只是完成各自的業(yè)務(wù)邏輯代碼,偽代碼如下:

public abstract class BaseServlet extends HttpServlet{

public final void service(HttpServletRequest

request,HttpServletResponse

response)

throws IOExcetion,ServletException { 記錄訪問日志 進(jìn)行權(quán)限判斷 if(具有權(quán)限){

}

} protected abstract void doService(HttpServletRequest request, HttpServletResponse response)throws try{ } catch(Excetpion e){ } 記錄異常信息 doService(request,response);IOExcetion,ServletException;//注意訪問權(quán)限定義成protected,顯得既專業(yè),又嚴(yán)謹(jǐn),因?yàn)樗菍iT給子類用的 }

public class MyServlet1 extends BaseServlet { protected

} 父類方法中間的某段代碼不確定,留給子類干,就用模板方法設(shè)計(jì)模式。

備注:這道題的思路是先從總體解釋抽象類和接口的基本概念,然后再比較兩者的語法細(xì)節(jié),最后再說兩者的應(yīng)用區(qū)別。比較兩者語法細(xì)節(jié)區(qū)別的條理是:先從一個(gè)類中的構(gòu)造方法、普通成員變量和方法(包括抽象方法),靜態(tài)變量和方法,繼承性等6個(gè)方面逐一去比較回答,接著從第三者繼承的角度的回答,特別是最后用了一個(gè)典型的例子來展現(xiàn)自己深厚的技術(shù)功底。{ } 本Servlet只處理的具體業(yè)務(wù)邏輯代碼 void doService(HttpServletRequest

request,HttpServletResponse

response)

throws IOExcetion,ServletException

25、abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized? abstract的method 不可以是static的,因?yàn)槌橄蟮姆椒ㄊ且蛔宇悓?shí)現(xiàn)的,而static與子類扯不上關(guān)系!

native方法表示該方法要用另外一種依賴平臺(tái)的編程語言實(shí)現(xiàn)的,不存在著被子類實(shí)現(xiàn)的問題,所以,它也不能是抽象的,不能與abstract混用。例如,F(xiàn)ileOutputSteam類要硬件打交道,底層的實(shí)現(xiàn)用的是操作系統(tǒng)相關(guān)的api實(shí)現(xiàn),例如,在windows用c語言實(shí)現(xiàn)的,所以,查看jdk 的源代碼,可以發(fā)現(xiàn)FileOutputStream的open方法的定義如下:

private native void open(String name)throws FileNotFoundException;如果我們要用java調(diào)用別人寫的c語言函數(shù),我們是無法直接調(diào)用的,我們需要按照java的要求寫一個(gè)c語言的函數(shù),又我們的這個(gè)c語言函數(shù)去調(diào)用別人的c語言函數(shù)。由于我們的c語言函數(shù)是按java的要求來寫的,我們這個(gè)c語言函數(shù)就可以與java對(duì)接上,java那邊的對(duì)接方式就是定義出與我們這個(gè)c函數(shù)相對(duì)應(yīng)的方法,java中對(duì)應(yīng)的方法不需要寫具體的代碼,但需要在前面聲明native。

關(guān)于synchronized與abstract合用的問題,我覺得也不行,因?yàn)樵谖規(guī)啄甑膶W(xué)習(xí)和開發(fā)中,從來沒見到過這種情況,并且我覺得synchronized應(yīng)該是作用在一個(gè)具體的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖對(duì)象是this,而抽象方法上無法確定this是什么。

26、什么是內(nèi)部類?Static Nested Class 和 Inner Class的不同。

內(nèi)部類就是在一個(gè)類的內(nèi)部定義的類,內(nèi)部類中不能定義靜態(tài)成員(靜態(tài)成員不是對(duì)象的特性,只是為了找一個(gè)容身之處,所以需要放到一個(gè)類中而已,這么一點(diǎn)小事,你還要把它放到類內(nèi)部的一個(gè)類中,過分了啊!提供內(nèi)部類,不是為讓你干這種事情,無聊,不讓你干。我想可能是既然靜態(tài)成員類似c語言的全局變量,而內(nèi)部類通常是用于創(chuàng)建內(nèi)部對(duì)象用的,所以,把“全局變量”放在內(nèi)部類中就是毫無意義的事情,既然是毫無意義的事情,就應(yīng)該被禁止),內(nèi)部類可以直接訪問外部類中的成員變量,內(nèi)部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中,如下所示:

public class Outer {

} 在方法體外面定義的內(nèi)部類的訪問類型可以是public,protecte,默認(rèn)的,private等4種類型,這就好像類中定義的成員變量有4種訪問類型一樣,它們決定這個(gè)內(nèi)部類的定義對(duì)其他類是否可見;對(duì)于這種情況,我們也可以在外面創(chuàng)建內(nèi)部類的實(shí)例對(duì)象,創(chuàng)建內(nèi)部類的實(shí)例對(duì)象時(shí),一定要先創(chuàng)建外部類的實(shí)例對(duì)象,然后用這個(gè)外部類的實(shí)例對(duì)象去創(chuàng)建內(nèi)部類的實(shí)例對(duì)象,代碼如下:

Outer outer = new Outer();Outer.Inner1 inner1 = outer.new Innner1();

在方法內(nèi)部定義的內(nèi)部類前面不能有訪問類型修飾符,就好像方法中定義的局部變量一樣,但這種內(nèi)部類的前面可以使用final或abstract修飾符。這種內(nèi)部類對(duì)其他類是不可見的其他類無法引用這種內(nèi)部類,但是這種內(nèi)部類創(chuàng)建的實(shí)例對(duì)象可以傳遞給其他類訪問。這種內(nèi)部類必須是先定義,后使用,即內(nèi)部類的定義代碼必須出現(xiàn)在使用該類之前,這與方法中的局部變量必須先定義后使用的道理也是一樣的。這種內(nèi)部類可以訪問方法體中的局部變量,但是,該局部變量前必須加final修飾符。

對(duì)于這些細(xì)節(jié),只要在eclipse寫代碼試試,根據(jù)開發(fā)工具提示的各類錯(cuò)誤信息就可以馬上了解到。public class Inner1 //在方法體外面定義的內(nèi)部類 { } int out_x = 0;public void method(){

} Inner1 inner1 = new Inner1();public class Inner2 //在方法體內(nèi)部定義的內(nèi)部類 {

} Inner2 inner2 = new Inner2();public method(){ } out_x = 3;

在方法體內(nèi)部還可以采用如下語法來創(chuàng)建一種匿名內(nèi)部類,即定義某一接口或類的子類的同時(shí),還創(chuàng)建了該子類的實(shí)例對(duì)象,無需為該子類定義名稱:

public class Outer {

public void start(){ new Thread(new Runable(){ }).start();

}

最后,在方法外部定義的內(nèi)部類前面可以加上static關(guān)鍵字,從而成為Static Nested Class,它不再具有內(nèi)部類的特性,所有,從狹義上講,它不是內(nèi)部類。Static Nested Class與普通類在運(yùn)行時(shí)的行為和功能上沒有什么區(qū)別,只是在編程引用時(shí)的語法上有一些差別,它可以定義成public、protected、默認(rèn)的、private等多種類型,而普通類只能定義成public和默認(rèn)的這兩種類型。在外面引用Static Nested Class類的名稱為“外部類名.內(nèi)部類名”。在外面不需要?jiǎng)?chuàng)建外部類的實(shí)例對(duì)象,就可以直接創(chuàng)建Static Nested Class,例如,假設(shè)Inner是定義在Outer類中的Static Nested Class,那么可以使用如下語句創(chuàng)建Inner類:

Outer.Inner inner = new Outer.Inner();由于static Nested Class不依賴于外部類的實(shí)例對(duì)象,所以,static Nested Class能訪問外部類的非static成員變量。當(dāng)在外部類中訪問Static Nested Class時(shí),可以直接使用Static Nested Class的名字,而不需要加上外部類的名字了,在Static Nested Class中也可以直接引用外部類的static的成員變量,不需要加上外部類的名字。

在靜態(tài)方法中定義的內(nèi)部類也是Static Nested Class,這時(shí)候不能在類前面加static關(guān)鍵字,靜態(tài)方法中的Static Nested Class與普通方法中的內(nèi)部類的應(yīng)用方式很相似,它除了可以直接訪問外部類中的static的成員變量,還可以訪問靜態(tài)方法中的局部變量,但是,該局部變量前必須加final修飾符。

備注:首先根據(jù)你的印象說出你對(duì)內(nèi)部類的總體方面的特點(diǎn):例如,在兩個(gè)地方可以定義,可以訪問外部類的成員變量,不能定義靜態(tài)成員,這是大的特點(diǎn)。然后再說一些細(xì)節(jié)方面的知識(shí),例如,幾種定義方式的語法區(qū)別,靜態(tài)內(nèi)部類,以及匿名內(nèi)部類。

27、內(nèi)部類可以引用它的包含類的成員嗎?有沒有什么限制?

完全可以。如果不是靜態(tài)內(nèi)部類,那沒有什么限制!

如果你把靜態(tài)嵌套類當(dāng)作內(nèi)部類的一種特例,那在這種情況下不可以訪問外部類的普通成員變量,而只能訪問外部類中的靜態(tài)成員,例如,下面的代碼:

class Outer { static int x;static class Inner {

} }

答題時(shí),也要能察言觀色,揣摩提問者的心思,顯然人家希望你說的是靜態(tài)內(nèi)部類不能訪問外部類的成員,但你一上來就頂牛,這不好,要先順著人家,讓人家滿意,然后再說特殊情況,讓人家吃驚。

28、Anonymous Inner Class(匿名內(nèi)部類)是否可以extends(繼承)其它類,是否可以implements(實(shí)現(xiàn))interface(接口)? 可以繼承其他類或?qū)崿F(xiàn)其他接口。不僅是可以,而是必須!void test(){ } syso(x);} public void run(){};

29、super.getClass()方法調(diào)用 下面程序的輸出結(jié)果是多少? import java.util.Date;public class Test extends Date{

}

很奇怪,結(jié)果是Test 這屬于腦筋急轉(zhuǎn)彎的題目,在一個(gè)qq群有個(gè)網(wǎng)友正好問過這個(gè)問題,我覺得挺有趣,就研究了一下,沒想到今天還被你面到了,哈哈。

在test方法中,直接調(diào)用getClass().getName()方法,返回的是Test類名 由于getClass()在Object類中定義成了final,子類不能覆蓋該方法,所以,在

test方法中調(diào)用getClass().getName()方法,其實(shí)就是在調(diào)用從父類繼承的getClass()方法,等效于調(diào)用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也應(yīng)該是Test。如果想得到父類的名稱,應(yīng)該用如下代碼: getClass().getSuperClass().getName();30、String是最基本的數(shù)據(jù)類型嗎? 基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。

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

31、String s = ”Hello“;s = s + ” world!“;這兩行代碼執(zhí)行后,原始的String對(duì)象中的內(nèi)容到底變了沒有?

沒有。因?yàn)镾tring被設(shè)計(jì)成不可變(immutable)類,所以它的所有對(duì)象都是不可變對(duì)象。在這段代碼中,s原先指向一個(gè)String對(duì)象,內(nèi)容是 ”Hello“,然后我們對(duì)s進(jìn)行了+操作,那么s所指向的那個(gè)對(duì)象是否發(fā)生了改變呢?答案是沒有。這時(shí),s不指向原來那個(gè)對(duì)象了,而指向了另一個(gè) String對(duì)象,內(nèi)容為”Hello world!“,原來那個(gè)對(duì)象還存在于內(nèi)存之中,只是s這個(gè)引用變量不再指向它了。

通過上面的說明,我們很容易導(dǎo)出另一個(gè)結(jié)論,如果經(jīng)常對(duì)字符串進(jìn)行各種各樣的修改,或者說,不可預(yù)見的修改,那么使用String來代表字符串的話會(huì)引起很大的內(nèi)存開銷。因?yàn)?String對(duì)象建立之后不能再改變,所以對(duì)于每一個(gè)不同的字符串,都需要一個(gè)String對(duì)象來表示。這時(shí),應(yīng)該考慮使用StringBuffer類,它允許修改,而不是每個(gè)不同的字符串都要生成一個(gè)新的對(duì)象。并且,這兩種類的對(duì)象轉(zhuǎn)換十分容易。

同時(shí),我們還可以知道,如果要使用內(nèi)容相同的字符串,不必每次都new一個(gè)String。例如我們要在構(gòu)造器中對(duì)一個(gè)名叫s的String引用變量進(jìn)行初始化,把它設(shè)置為初始值,應(yīng)當(dāng)這樣做: public class Demo { private String s;...public Demo { s = ”Initial Value“;}...} 而非

s = new String(”Initial Value“);后者每次都會(huì)調(diào)用構(gòu)造器,生成新對(duì)象,性能低下且內(nèi)存開銷大,并且沒有意義,因?yàn)镾tring對(duì)象不可改變,所以對(duì)于內(nèi)容相同的字符串,只要一個(gè)String對(duì)象來表示就可以了。也就說,多次調(diào)用上面的構(gòu)造器創(chuàng)建多個(gè)對(duì)象,他們的String類型屬性s都指向同一個(gè)對(duì)象。

上面的結(jié)論還基于這樣一個(gè)事實(shí):對(duì)于字符串常量,如果內(nèi)容相同,Java認(rèn)為它們代表同一個(gè)String對(duì)象。而用關(guān)鍵字new調(diào)用構(gòu) public static void main(String[] args){ }

public void test(){ } System.out.println(super.getClass().getName());new Test().test();

造器,總是會(huì)創(chuàng)建一個(gè)新的對(duì)象,無論內(nèi)容是否相同。

至于為什么要把String類設(shè)計(jì)成不可變類,是它的用途決定的。其實(shí)不只String,很多Java標(biāo)準(zhǔn)類庫中的類都是不可變的。在開發(fā)一個(gè)系統(tǒng)的時(shí)候,我們有時(shí)候也需要設(shè)計(jì)不可變類,來傳遞一組相關(guān)的值,這也是面向?qū)ο笏枷氲捏w現(xiàn)。不可變類有一些優(yōu)點(diǎn),比如因?yàn)樗膶?duì)象是只讀的,所以多線程并發(fā)訪問也不會(huì)有任何問題。當(dāng)然也有一些缺點(diǎn),比如每個(gè)不同的狀態(tài)都要一個(gè)對(duì)象來代表,可能會(huì)造成性能上的問題。所以Java標(biāo)準(zhǔn)類庫還提供了一個(gè)可變版本,即 StringBuffer。

32、是否可以繼承String類? String類是final類故不可以繼承。

33、String s = new String(”xyz“);創(chuàng)建了幾個(gè)String Object? 二者之間有什么區(qū)別?

兩個(gè)或一個(gè),”xyz”對(duì)應(yīng)一個(gè)對(duì)象,這個(gè)對(duì)象放在字符串常量緩沖區(qū),常量”xyz”不管出現(xiàn)多少遍,都是緩沖區(qū)中的那一個(gè)。New String每寫一遍,就創(chuàng)建一個(gè)新的對(duì)象,它一句那個(gè)常量”xyz”對(duì)象的內(nèi)容來創(chuàng)建出一個(gè)新String對(duì)象。如果以前就用過’xyz’,這句代表就不會(huì)創(chuàng)建”xyz”自己了,直接從緩沖區(qū)拿。

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

JAVA平臺(tái)提供了兩個(gè)類:String和StringBuffer,它們可以儲(chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。這個(gè)String類提供了數(shù)值不可改變的字符串。而這個(gè)StringBuffer類提供的字符串進(jìn)行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時(shí)候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。另外,String實(shí)現(xiàn)了equals方法,new String(“abc”).equals(new String(“abc”)的結(jié)果為true,而StringBuffer沒有實(shí)現(xiàn)equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的結(jié)果為false。

接著要舉一個(gè)具體的例子來說明,我們要把1到100的所有數(shù)字拼起來,組成一個(gè)串。StringBuffer sbf = new StringBuffer();for(int i=0;i<100;i++){ } 上面的代碼效率很高,因?yàn)橹粍?chuàng)建了一個(gè)StringBuffer對(duì)象,而下面的代碼效率很低,因?yàn)閯?chuàng)建了101個(gè)對(duì)象。String str = new String();for(int i=0;i<100;i++){ } 在講兩者區(qū)別時(shí),應(yīng)把循環(huán)的次數(shù)搞成10000,然后用endTime-beginTime來比較兩者執(zhí)行的時(shí)間差異,最后還要講講StringBuilder與StringBuffer的區(qū)別。

String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode方法,所以,將StringBuffer對(duì)象存儲(chǔ)進(jìn)Java集合類中時(shí)會(huì)出現(xiàn)問題。

35、如何把一段逗號(hào)分割的字符串轉(zhuǎn)換成一個(gè)數(shù)組? 如果不查jdk api,我很難寫出來!我可以說說我的思路:

1.用正則表達(dá)式,代碼大概為:String [] result = orgStr.split(“,”);2.用 StingTokenizer ,代碼為:StringTokenizer tokener = StringTokenizer(orgStr,”,”);String [] result = new String[tokener.countTokens()];Int i=0;while(tokener.hasNext(){result[i++]=toker.nextToken();}

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

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

37、下面這條語句一共創(chuàng)建了多少個(gè)對(duì)象:String s=”a“+”b“+”c“+”d“;答:對(duì)于如下代碼: String s1 = ”a“;String s2 = s1 + ”b“;str = str + i;sbf.append(i);

String s3 = ”a“ + ”b“;System.out.println(s2 == ”ab“);System.out.println(s3 == ”ab“);第一條語句打印的結(jié)果為false,第二條語句打印的結(jié)果為true,這說明javac編譯可以對(duì)字符串常量直接相加的表達(dá)式進(jìn)行優(yōu)化,不必要等到運(yùn)行期去進(jìn)行加法運(yùn)算處理,而是在編譯時(shí)去掉其中的加號(hào),直接將其編譯成一個(gè)這些常量相連的結(jié)果。

題目中的第一行代碼被編譯器在編譯時(shí)優(yōu)化后,相當(dāng)于直接定義了一個(gè)”abcd”的字符串,所以,上面的代碼應(yīng)該只創(chuàng)建了一個(gè)String對(duì)象。寫如下兩行代碼,String s = ”a“ + ”b“ + ”c“ + ”d“;System.out.println(s == ”abcd“);最終打印的結(jié)果應(yīng)該為true。

38、try {}里有一個(gè)return語句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后? 也許你的答案是在return之前,但往更細(xì)地說,我的答案是在return中間執(zhí)行,請(qǐng)看下面程序代碼的運(yùn)行結(jié)果: public class Test {

static int test(){

} }

---------執(zhí)行結(jié)果---------1

運(yùn)行結(jié)果是1,為什么呢?主函數(shù)調(diào)用子函數(shù)并得到結(jié)果的過程,好比主函數(shù)準(zhǔn)備一個(gè)空罐子,當(dāng)子函數(shù)要返回結(jié)果時(shí),先把結(jié)果放在罐子里,然后再將程序邏輯返回到主函數(shù)。所謂返回,就是子函數(shù)說,我不運(yùn)行了,你主函數(shù)繼續(xù)運(yùn)行吧,這沒什么結(jié)果可言,結(jié)果是在說這話之前放進(jìn)罐子里的。

39、下面的程序代碼輸出的結(jié)果是多少? public class smallT {

public static void main(String args[]){ smallT t = new smallT();int b = t.get();int x = 1;try { } finally { } ++x;return x;/** * @param args add by zxx ,Dec 9, 2008 */ public static void main(String[] args){

} // TODO Auto-generated method stub System.out.println(new Test().test());;

}

返回的結(jié)果是2。

我可以通過下面一個(gè)例子程序來幫助我解釋這個(gè)答案,從下面例子的運(yùn)行結(jié)果中可以發(fā)現(xiàn),try中的return語句調(diào)用的函數(shù)先于finally中調(diào)用的函數(shù)執(zhí)行,也就是說return語句先執(zhí)行,finally語句后執(zhí)行,所以,返回的結(jié)果是2。Return并不是讓函數(shù)馬上返回,而是return語句執(zhí)行后,將把返回結(jié)果放置進(jìn)函數(shù)棧中,此時(shí)函數(shù)并不是馬上返回,它要執(zhí)行finally語句后才真正開始返回。

在講解答案時(shí)可以用下面的程序來幫助分析: public class Test {

int test(){

}

int func1(){

} int func2(){ System.out.println(”func1“);return 1;try { } finally { } return func2();return func1();/** * @param args add by zxx ,Dec 9, 2008 */ public static void main(String[] args){ } // TODO Auto-generated method stub System.out.println(new Test().test());;}

public int get(){

} try { } finally { } return 2;return 1;System.out.println(b);

}-----------執(zhí)行結(jié)果-----------------func1 func2 2

結(jié)論:finally中的代碼比return 和break語句后執(zhí)行

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

final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內(nèi)部類要訪問局部變量,局部變量必須定義成final類型,例如,一段代碼??

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

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

41、運(yùn)行時(shí)異常與一般異常有何異同?

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

42、error和exception有什么區(qū)別? error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。exception 表示一種設(shè)計(jì)或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。

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

異常是指java程序運(yùn)行時(shí)(非編譯)所發(fā)生的非正常情況或錯(cuò)誤,與現(xiàn)實(shí)生活中的事件很相似,現(xiàn)實(shí)生活中的事件可以包含事件發(fā)生的時(shí)間、地點(diǎn)、人物、情節(jié)等信息,可以用一個(gè)對(duì)象來表示,Java使用面向?qū)ο蟮姆绞絹硖幚懋惓#殉绦蛑邪l(fā)生的每個(gè)異常也都分別封裝到一個(gè)對(duì)象來表示的,該對(duì)象中包含有異常的信息。

Java對(duì)異常進(jìn)行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個(gè)子類:Error和Exception,Error 表示應(yīng)用程序本身無法克服和恢復(fù)的一種嚴(yán)重問題,程序只有死的份了,例如,說內(nèi)存溢出和線程死鎖等系統(tǒng)問題。Exception表示程序還能夠克服和恢復(fù)的問題,其中又分為系統(tǒng)異常和普通異常,系統(tǒng)異常是軟件本身缺陷所導(dǎo)致的問題,也就是軟件開發(fā)人員考慮不周所導(dǎo)致的問題,軟件使用者無法克服和恢復(fù)這種問題,但在這種問題下還可以讓軟件系統(tǒng)繼續(xù)運(yùn)行或者讓軟件死掉,例如,數(shù)組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉(zhuǎn)換異常(ClassCastException);普通異常是運(yùn)行環(huán)境的變化或異常所導(dǎo)致的問題,是用戶能夠克服的問題,例如,網(wǎng)絡(luò)斷線,硬盤空間不夠,發(fā)生這樣的異常后,程序不應(yīng)該死掉。

java為系統(tǒng)異常和普通異常提供了不同的解決方案,編譯器強(qiáng)制普通異常必須try..catch處理或用throws聲明繼續(xù)拋給上層調(diào)用方法處理,所以普通異常也稱為checked異常,而系統(tǒng)異常可以處理也可以不處理,所以,編譯器不強(qiáng)制用try..catch處理或用throws聲明,所以系統(tǒng)異常也稱為unchecked異常。

提示答題者:就按照三個(gè)級(jí)別去思考:虛擬機(jī)必須宕機(jī)的錯(cuò)誤,程序可以死掉也可以不死掉的錯(cuò)誤,程序不應(yīng)該死掉的錯(cuò)誤;

44、請(qǐng)寫出你最常見到的5個(gè)runtime exception。

這道題主要考你的代碼量到底多大,如果你長期寫代碼的,應(yīng)該經(jīng)常都看到過一些系統(tǒng)方面的異常,你不一定真要回答出5個(gè)具體的系統(tǒng)異常,但你要能夠說出什么是系統(tǒng)異常,以及幾個(gè)系統(tǒng)異常就可以了,當(dāng)然,這些異常完全用其英文名稱來寫是最好的,如果實(shí)在寫不出,那就用中文吧,有總比沒有強(qiáng)!

所謂系統(tǒng)異常,就是?..,它們都是RuntimeException的子類,在jdk doc中查RuntimeException類,就可以看到其所有的子類列表,也就是看到了所有的系統(tǒng)異常。我比較有印象的系統(tǒng)異常有:NullPointerException、ArrayIndexOutOfBoundsException、} System.out.println(”func2“);return 2;

ClassCastException。

45、JAVA語言如何進(jìn)行異常處理,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎?

46、java中有幾種方法可以實(shí)現(xiàn)一個(gè)線程?用什么關(guān)鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?

java5以前,有如下兩種: 第一種:

new Thread(){}.start();這表示調(diào)用Thread子類對(duì)象的run方法,new Thread(){}表示一個(gè)Thread的匿名子類的實(shí)例對(duì)象,子類加上run方法后的代碼如下: new Thread(){ public void run(){ } }.start();

第二種:

new Thread(new Runnable(){}).start();這表示調(diào)用Thread對(duì)象接受的Runnable對(duì)象的run方法,new Runnable(){}表示一個(gè)Runnable的匿名子類的實(shí)例對(duì)象,runnable的子類加上run方法后的代碼如下: new Thread(new Runnable(){

從java5開始,還有如下一些線程池創(chuàng)建多線程的方式: ExecutorService pool = Executors.newFixedThreadPool(3)for(int i=0;i<10;i++){ pool.execute(new Runable(){public void run(){}});} Executors.newCachedThreadPool().execute(new Runable(){public void run(){}});Executors.newSingleThreadExecutor().execute(new Runable(){public void run(){}});

有兩種實(shí)現(xiàn)方法,分別使用new Thread()和new Thread(runnable)形式,第一種直接調(diào)用thread的run方法,所以,我們往往使用Thread子類,即new SubThread()。第二種調(diào)用runnable的run方法。

有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable接口 用synchronized關(guān)鍵字修飾同步方法

反對(duì)使用stop(),是因?yàn)樗话踩K鼤?huì)解除由線程獲取的所有鎖定,而且如果對(duì)象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問題所在。suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時(shí)候,目標(biāo)線程會(huì)停下來,但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線程都不能訪問鎖定的資源,除非被”掛起“的線程恢復(fù)運(yùn)行。對(duì)任何線程來說,如果它們想恢復(fù)目標(biāo)線程,同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會(huì)造成死鎖。所以不應(yīng)該使用suspend(),而應(yīng)在自己的Thread類中置入一個(gè)標(biāo)志,指出線程應(yīng)該活動(dòng)還是掛起。若標(biāo)志指出線程應(yīng)該掛起,便用wait()命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個(gè)notify()重新啟動(dòng)線程。

47、sleep()和 wait()有什么區(qū)別?(網(wǎng)上的答案: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)。)

} public void run(){ }).start();

sleep就是正在執(zhí)行的線程主動(dòng)讓出cpu,cpu去執(zhí)行其他線程,在sleep指定的時(shí)間過后,cpu才會(huì)回到這個(gè)線程上繼續(xù)往下執(zhí)行,如果當(dāng)前線程進(jìn)入了同步鎖,sleep方法并不會(huì)釋放鎖,即使當(dāng)前線程使用sleep方法讓出了cpu,但其他被同步鎖擋住了的線程也無法得到執(zhí)行。wait是指在一個(gè)已經(jīng)進(jìn)入了同步鎖的線程內(nèi),讓自己暫時(shí)讓出同步鎖,以便其他正在等待此鎖的線程可以得到同步鎖并運(yùn)行,只有其他線程調(diào)用了notify方法(notify并不釋放鎖,只是告訴調(diào)用過wait方法的線程可以去參與獲得鎖的競爭了,但不是馬上得到鎖,因?yàn)殒i還在別人手里,別人還沒釋放。如果notify方法后面的代碼還有很多,需要這些代碼執(zhí)行完后才會(huì)釋放鎖,可以在notfiy方法后增加一個(gè)等待和一些代碼,看看效果),調(diào)用wait方法的線程就會(huì)解除wait狀態(tài)和程序可以再次得到鎖后繼續(xù)向下運(yùn)行。對(duì)于wait的講解一定要配合例子代碼來說明,才顯得自己真明白。package com.huawei.interview;

public class MultiThread {

@Override public void run(){ // TODO Auto-generated method stub /** * @param args */ public static void main(String[] args){

}

private static class Thread1 implements Runnable { // TODO Auto-generated method stub new Thread(new Thread1()).start();try {

} new Thread(new Thread2()).start();

Thread.sleep(10);// TODO Auto-generated catch block e.printStackTrace();} catch(InterruptedException e){ //由于這里的Thread1和下面的Thread2內(nèi)部run方法要用同一對(duì)象作為監(jiān)視器,我們這里不能用this,因?yàn)樵赥hread2里面的this和這個(gè)Thread1的this不是同一個(gè)對(duì)象。我們用MultiThread.class這個(gè)字節(jié)碼對(duì)象,當(dāng)前虛擬機(jī)里引用這個(gè)變量時(shí),指向的都是同一個(gè)對(duì)象。

System.out.println(”enter thread1...“);

System.out.println(”thread1 is waiting“);try { synchronized(MultiThread.class){ //釋放鎖有兩種方式,第一種方式是程序自然離開監(jiān)視器的范圍,也就是離開了synchronized關(guān)鍵字管轄的代碼范圍,}

System.out.println(”thread1 is going on...“);MultiThread.class.wait();// TODO Auto-generated catch block e.printStackTrace();另一種方式就是在synchronized關(guān)鍵字管轄的代碼內(nèi)部調(diào)用監(jiān)視器對(duì)象的wait方法。這里,使用wait方法釋放鎖。

} catch(InterruptedException e){

@Override public void run(){

// TODO Auto-generated method stub synchronized(MultiThread.class){

System.out.println(”enter thread2...“);

System.out.println(”thread2 notify other thread can release wait status..“);

}

private static class Thread2 implements Runnable {

} } System.out.println(”thread1 is being over!“);

//由于notify方法并不釋放鎖,即使thread2調(diào)用下面的sleep方法休息了10毫秒,但thread1仍然不會(huì)執(zhí)行,因?yàn)閠hread2沒有釋放鎖,所以Thread1無法得不到鎖。

}

48、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。

如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進(jìn)行同步存取。

當(dāng)應(yīng)用程序在對(duì)象上調(diào)用了一個(gè)需要花費(fèi)很長時(shí)間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率。

49.下面兩個(gè)方法同步嗎?(自己發(fā)明)class Test { synchronized static void sayHello3()

}

}

} MultiThread.class.notify();

System.out.println(”thread2 is sleeping ten millisecond...“);try {

}

System.out.println(”thread2 is going on...“);System.out.println(”thread2 is being over!“);Thread.sleep(10);// TODO Auto-generated catch block e.printStackTrace();} catch(InterruptedException e){

} 50、多線程有幾種實(shí)現(xiàn)方法?同步有幾種實(shí)現(xiàn)方法? 多線程有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable接口 同步的實(shí)現(xiàn)方面有兩種,分別是synchronized,wait與notify wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對(duì)象的lock。

sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException異常。

notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM確定喚醒哪個(gè)線程,而且不是按優(yōu)先級(jí)。

Allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖,而是讓它們競爭。

51、啟動(dòng)一個(gè)線程是用run()還是start()?.啟動(dòng)一個(gè)線程是調(diào)用start()方法,使線程就緒狀態(tài),以后可以被調(diào)度為運(yùn)行狀態(tài),一個(gè)線程必須關(guān)聯(lián)一些具體的執(zhí)行代碼,run()方法是該線程所關(guān)聯(lián)的執(zhí)行代碼。

52、當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法? 分幾種情況:

1.其他方法前是否加了synchronized關(guān)鍵字,如果沒加,則能。2.如果這個(gè)方法內(nèi)部調(diào)用了wait,則可以進(jìn)入其他synchronized方法。

3.如果其他個(gè)方法都加了synchronized關(guān)鍵字,并且內(nèi)部沒有調(diào)用wait,則不能。

53、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系

一個(gè)程序中可以有多條執(zhí)行線索同時(shí)執(zhí)行,一個(gè)線程就是程序中的一條執(zhí)行線索,每個(gè)線程上都關(guān)聯(lián)有要執(zhí)行的代碼,即可以有多段程序代碼同時(shí)運(yùn)行,每個(gè)程序至少都有一個(gè)線程,即main方法執(zhí)行的那個(gè)線程。如果只是一個(gè)cpu,它怎么能夠同時(shí)執(zhí)行多段程序呢?這是從宏觀上來看的,cpu一會(huì)執(zhí)行a線索,一會(huì)執(zhí)行b線索,切換時(shí)間很快,給人的感覺是a,b在同時(shí)執(zhí)行,好比大家在同一個(gè)辦公室上網(wǎng),只有一條鏈接到外部網(wǎng)線,其實(shí),這條網(wǎng)線一會(huì)為a傳數(shù)據(jù),一會(huì)為b傳數(shù)據(jù),由于切換時(shí)間很短暫,所以,大家感覺都在同時(shí)上網(wǎng)。

狀態(tài):就緒,運(yùn)行,synchronize阻塞,wait和sleep掛起,結(jié)束。wait必須在synchronized內(nèi)部調(diào)用。

調(diào)用線程的start方法后線程進(jìn)入就緒狀態(tài),線程調(diào)度系統(tǒng)將就緒狀態(tài)的線程轉(zhuǎn)為運(yùn)行狀態(tài),遇到synchronized語句時(shí),由運(yùn)行狀態(tài)轉(zhuǎn)為阻塞,當(dāng)synchronized獲得鎖后,由阻塞轉(zhuǎn)為運(yùn)行,在這種情況可以調(diào)用wait方法轉(zhuǎn)為掛起狀態(tài),當(dāng)線程關(guān)聯(lián)的代碼執(zhí)行完后,線程變?yōu)榻Y(jié)束狀態(tài)。

54、簡述synchronized和java.util.concurrent.locks.Lock的異同 ?

主要相同點(diǎn):Lock能完成synchronized所實(shí)現(xiàn)的所有功能

主要不同點(diǎn):Lock有比synchronized更精確的線程語義和更好的性能。synchronized會(huì)自動(dòng)釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。Lock還有更強(qiáng)大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。舉例說明(對(duì)下面的題用lock進(jìn)行了改寫): package com.huawei.interview;

import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;

public class ThreadTest { 4.如果其他方法是static,它用的同步鎖是當(dāng)前類的字節(jié)碼,與非靜態(tài)的方法不能同步,因?yàn)榉庆o態(tài)的方法用的是this。synchronized void getX(){} { }

@Override public void run(){

// TODO Auto-generated method stub while(true){ /*synchronized(ThreadTest.this){

}

private class Adder implements Runnable { @Override public void run(){

} // TODO Auto-generated method stub while(true){

} /*synchronized(ThreadTest.this){

}*/ lock.lock();try { { } lock.unlock();System.out.println(”j--=“ + j--);}finally //這里拋異常了,鎖能釋放嗎?

System.out.println(”j--=“ + j--);private class Subtractor implements Runnable { /** * @param args */

private int j;private Lock lock = new ReentrantLock();public static void main(String[] args){

} // TODO Auto-generated method stub ThreadTest tt = new ThreadTest();for(int i=0;i<2;i++){

} new Thread(tt.new Adder()).start();new Thread(tt.new Subtractor()).start();

}

55、設(shè)計(jì)4個(gè)線程,其中兩個(gè)線程每次對(duì)j增加1,另外兩個(gè)線程對(duì)j每次減少1。寫出程序。

以下程序使用內(nèi)部類實(shí)現(xiàn)線程,對(duì)j增減的時(shí)候沒有考慮順序問題。public class ThreadTest1 { private int j;public static void main(String args[]){ ThreadTest1 tt=new ThreadTest1();Inc inc=tt.new Inc();Dec dec=tt.new Dec();for(int i=0;i<2;i++){ Thread t=new Thread(inc);t.start();t=new Thread(dec);t.start();} } private synchronized void inc(){ j++;System.out.println(Thread.currentThread().getName()+”-inc:“+j);} private synchronized void dec(){ j--;System.out.println(Thread.currentThread().getName()+”-dec:“+j);} class Inc implements Runnable{ public void run(){ for(int i=0;i<100;i++){ inc();} } } class Dec implements Runnable{ public void run(){ for(int i=0;i<100;i++){ dec();}

}

}

} System.out.println(”j++=“ + j++);}*/ lock.lock();try { { } lock.unlock();

System.out.println(”j++=“ + j++);}finally

} } }

----------隨手再寫的一個(gè)-------------class A { JManger j =new JManager();main(){ new A().call();}

void call { for(int i=0;i<2;i++){

} } }

class JManager { private j = 0;

public synchronized void subtract(){

}

public synchronized void accumulate(){

}

}

56、子線程循環(huán)10次,接著主線程循環(huán)100,接著又回到子線程循環(huán)10次,接著再回到主線程又循環(huán)100,如此循環(huán)50次,請(qǐng)寫出程序。

最終的程序代碼如下: public class ThreadTest {

/** * @param args */ public static void main(String[] args){ j++;j--new Thread(new Runnable(){ public void run(){while(true){j.accumulate()}}}).start();new Thread(new Runnable(){ public void run(){while(true){j.sub()}}}).start();

}

private class Business {

boolean bShouldSub = true;//這里相當(dāng)于定義了控制該誰執(zhí)行的一個(gè)信號(hào)燈 public synchronized void MainThread(int i){

} if(bShouldSub)

{ } bShouldSub = true;this.notify();System.out.println(Thread.currentThread().getName()+ ”:i=“ + i +”,j=“ + j);try {

} this.wait();// TODO Auto-generated catch block e.printStackTrace();} catch(InterruptedException e){).start();

for(int i=0;i<50;i++){ } business.MainThread(i);

} public void run(){

} for(int i=0;i<50;i++){ } business.SubThread(i);

public void init(){

final Business business = new Business();new Thread(new Runnable(){ } // TODO Auto-generated method stub new ThreadTest().init();for(int j=0;j<5;j++)

}

備注:不可能一上來就寫出上面的完整代碼,最初寫出來的代碼如下,問題在于兩個(gè)線程的代碼要參照同一個(gè)變量,即這兩個(gè)線程的代碼要共享數(shù)據(jù),所以,把這兩個(gè)線程的執(zhí)行代碼搬到同一個(gè)類中去:

package com.huawei.interview.lym;

public class ThreadTest {

new Thread(new Runnable()

private static boolean bShouldMain = false;

public static void main(String[] args){

// TODO Auto-generated method stub /*new Thread(){ public void run(){

}

//final String str = new String(”“);for(int i=0;i<50;i++){

} for(int j=0;j<10;j++){ } System.out.println(”i=“ + i + ”,j=“ + j);

}

public synchronized void SubThread(int i){

} if(!bShouldSub)

{ } bShouldSub = false;this.notify();

System.out.println(Thread.currentThread().getName()+ ”:i=“ + i +”,j=“ + j);try {

} this.wait();// TODO Auto-generated catch block e.printStackTrace();} catch(InterruptedException e){ for(int j=0;j<10;j++)}.start();*/

}

for(int i=0;i<50;i++){

} synchronized(ThreadTest.class){

} if(!bShouldMain){

} {

} bShouldMain = false;ThreadTest.class.notify();

System.out.println(Thread.currentThread().getName()+ ”i=“ + i + ”,j=“ + j);

try {

}

ThreadTest.class.wait();} e.printStackTrace();catch(InterruptedException e){

{

} public void run(){

} for(int i=0;i<50;i++){

} synchronized(ThreadTest.class){

}

if(bShouldMain){

}

for(int j=0;j<10;j++){

}

bShouldMain = true;ThreadTest.class.notify();

System.out.println(Thread.currentThread().getName()+ ”i=“ + i + ”,j=“ + j);

try {

}

ThreadTest.class.wait();} e.printStackTrace();catch(InterruptedException e){).start();for(int j=0;j<5;j++)

} 下面使用jdk5中的并發(fā)庫來實(shí)現(xiàn)的: import java.util.concurrent.Executors;import java.util.concurrent.ExecutorService;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.Condition;

public class ThreadTest {

private static Lock lock = new ReentrantLock();private static Condition subThreadCondition = lock.newCondition();private static boolean bBhouldSubThread = false;public static void main(String [] args){

ExecutorService threadPool = Executors.newFixedThreadPool(3);threadPool.execute(new Runnable(){

});threadPool.shutdown();for(int i=0;i<50;i++){

lock.lock();try {

if(bBhouldSubThread)subThreadCondition.await();

public void run(){

} for(int i=0;i<50;i++){

} lock.lock();try {

{ } finally { } lock.unlock();

{ } bBhouldSubThread = false;subThreadCondition.signal();

System.out.println(Thread.currentThread().getName()+ ”,j=“ + j);

if(!bBhouldSubThread)subThreadCondition.await();for(int j=0;j<10;j++)

}catch(Exception e)

}

57、介紹Collection框架的結(jié)構(gòu)

答:隨意發(fā)揮題,天南海北誰便談,只要讓別覺得你知識(shí)淵博,理解透徹即可。

58、Collection框架中實(shí)現(xiàn)比較要實(shí)現(xiàn)什么接口 comparable/comparator

59、ArrayList和Vector的區(qū)別 答:

這兩個(gè)類都實(shí)現(xiàn)了List接口(List接口繼承了Collection接口),他們都是有序集合,即存儲(chǔ)在這兩個(gè)集合中的元素的位置都是有順序的,相當(dāng)于一種動(dòng)態(tài)的數(shù)組,我們以后可以按位置索引號(hào)取出某個(gè)元素,并且其中的數(shù)據(jù)是允許重復(fù)的,這是HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號(hào)去檢索其中的元素,也不允許有重復(fù)的元素(本來題目問的與hashset沒有任何關(guān)系,但為了說清楚ArrayList與Vector的功能,我們使用對(duì)比方式,更有利于說明問題)。

接著才說ArrayList與Vector的區(qū)別,這主要包括兩個(gè)方面:.(1)同步性: Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個(gè)線程會(huì)訪問到集合,那最好是使用ArrayList,因?yàn)樗豢紤]線程安全,效率會(huì)高些;如果有多個(gè)線程會(huì)訪問到集合,那最好是使用Vector,因?yàn)椴恍枰覀冏约涸偃タ紤]和編寫線程安全的代碼。

備注:對(duì)于Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線程安全的,ArrayList與HashMap是java2時(shí)才提供的,它們是線程不安全的。所以,我們講課時(shí)先講老的。(2)數(shù)據(jù)增長: ArrayList與Vector都有一個(gè)初始的容量大小,當(dāng)存儲(chǔ)進(jìn)它們里面的元素的個(gè)數(shù)超過了容量時(shí),就需要增加ArrayList與Vector的存儲(chǔ)空間,每次要增加存儲(chǔ)空間時(shí),不是只增加一個(gè)存儲(chǔ)單元,而是增加多個(gè)存儲(chǔ)單元,每次增加的存儲(chǔ)單元的個(gè)數(shù)在內(nèi)存空間利用與程序效率之間要取得一定的平衡。Vector默認(rèn)增長為原來兩倍,而ArrayList的增長策略在文檔中沒有明確規(guī)定(從源代碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設(shè)置初始的空間大小,Vector還可以設(shè)置增長的空間大小,而ArrayList沒有提供設(shè)置增長空間的方法。

總結(jié):即Vector增長原來的一倍,ArrayList增加原來的0.5倍。60、HashMap和Hashtable的區(qū)別

(條理上還需要整理,也是先說相同點(diǎn),再說不同點(diǎn))

HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,在只有一個(gè)線程訪問的情況下,效率要高于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è)線程訪問Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)

}

}

{ } finally { } lock.unlock();

for(int j=0;j<10;j++){ } bBhouldSubThread = true;subThreadCondition.signal();

System.out.println(Thread.currentThread().getName()+ ”,j=“ + j);}catch(Exception e)

同步,而HashMap 就必須為之提供外同步。

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

就HashMap與HashTable主要從三方面來說。

一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn) 二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 三.值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value 61、List 和 Map 區(qū)別? 一個(gè)是存儲(chǔ)單列數(shù)據(jù)的集合,另一個(gè)是存儲(chǔ)鍵和值這樣的雙列數(shù)據(jù)的集合,List中存儲(chǔ)的數(shù)據(jù)是有順序,并且允許重復(fù);Map中存儲(chǔ)的數(shù)據(jù)是沒有順序的,其鍵是不能重復(fù)的,它的值是可以有重復(fù)的。62、List, Set, Map是否繼承自Collection接口? List,Set是,Map不是

63、List、Map、Set三個(gè)接口,存取元素時(shí),各有什么特點(diǎn)?

這樣的題屬于隨意發(fā)揮題:這樣的題比較考水平,兩個(gè)方面的水平:一是要真正明白這些內(nèi)容,二是要有較強(qiáng)的總結(jié)和表述能力。如果你明白,但表述不清楚,在別人那里則等同于不明白。

首先,List與Set具有相似性,它們都是單列元素的集合,所以,它們有一個(gè)功共同的父接口,叫Collection。Set里面不允許有重復(fù)的元素,所謂重復(fù),即不能有兩個(gè)相等(注意,不是僅僅是相同)的對(duì)象,即假設(shè)Set集合中有了一個(gè)A對(duì)象,現(xiàn)在我要向Set集合再存入一個(gè)B對(duì)象,但B對(duì)象與A對(duì)象equals相等,則B對(duì)象存儲(chǔ)不進(jìn)去,所以,Set集合的add方法有一個(gè)boolean的返回值,當(dāng)集合中沒有某個(gè)元素,此時(shí)add方法可成功加入該元素時(shí),則返回true,當(dāng)集合含有與某個(gè)元素equals相等的元素時(shí),此時(shí)add方法無法加入該元素,返回結(jié)果為false。Set取元素時(shí),沒法說取第幾個(gè),只能以Iterator接口取得所有的元素,再逐一遍歷各個(gè)元素。List表示有先后順序的集合,注意,不是那種按年齡、按大小、按價(jià)格之類的排序。當(dāng)我們多次調(diào)用add(Obj e)方法時(shí),每次加入的對(duì)象就像火車站買票有排隊(duì)順序一樣,按先來后到的順序排序。有時(shí)候,也可以插隊(duì),即調(diào)用add(int index,Obj e)方法,就可以指定當(dāng)前對(duì)象在集合中的存放位置。一個(gè)對(duì)象可以被反復(fù)存儲(chǔ)進(jìn)List中,每調(diào)用一次add方法,這個(gè)對(duì)象就被插入進(jìn)集合中一次,其實(shí),并不是把這個(gè)對(duì)象本身存儲(chǔ)進(jìn)了集合中,而是在集合中用一個(gè)索引變量指向這個(gè)對(duì)象,當(dāng)這個(gè)對(duì)象被add多次時(shí),即相當(dāng)于集合中有多個(gè)索引指向了這個(gè)對(duì)象,如圖x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍歷各個(gè)元素之外,還可以調(diào)用get(index i)來明確說明取第幾個(gè)。Map與List和Set不同,它是雙列的集合,其中有put方法,定義如下:put(obj key,obj value),每次存儲(chǔ)時(shí),要存儲(chǔ)一對(duì)key/value,不能存儲(chǔ)重復(fù)的key,這個(gè)重復(fù)的規(guī)則也是按equals比較相等。取則可以根據(jù)key獲得相應(yīng)的value,即get(Object key)返回值為key 所對(duì)應(yīng)的value。另外,也可以獲得所有的key的結(jié)合,還可以獲得所有的value的結(jié)合,還可以獲得key和value組合成的Map.Entry對(duì)象的集合。

List 以特定次序來持有元素,可有重復(fù)元素。Set 無法擁有重復(fù)元素,內(nèi)部排序。Map 保存key-value值,value可多值。

HashSet按照hashcode值的某種運(yùn)算方式進(jìn)行存儲(chǔ),而不是直接按hashCode值的大小進(jìn)行存儲(chǔ)。例如,”abc“---> 78,”def“---> 62,”xyz“---> 65在hashSet中的存儲(chǔ)順序不是62,65,78,這些問題感謝以前一個(gè)叫崔健的學(xué)員提出,最后通過查看源代碼給他解釋清楚,看本次培訓(xùn)學(xué)員當(dāng)中有多少能看懂源碼。LinkedHashSet按插入的順序存儲(chǔ),那被存儲(chǔ)對(duì)象的hashcode方法還有什么作用呢?學(xué)員想想!hashset集合比較兩個(gè)對(duì)象是否相等,首先看hashcode方法是否相等,然后看equals方法是否相等。new 兩個(gè)Student插入到HashSet中,看HashSet的size,實(shí)現(xiàn)hashcode和equals方法后再看size。

同一個(gè)對(duì)象可以在Vector中加入多次。往集合里面加元素,相當(dāng)于集合里用一根繩子連接到了目標(biāo)對(duì)象。往HashSet中卻加不了多次的。

64、說出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)即可,所以插入速度較快。

LinkedList也是線程不安全的,LinkedList提供了一些方法,使得LinkedList可以被當(dāng)作堆棧和隊(duì)列來使用。65、去掉一個(gè)Vector集合中重復(fù)的元素 Vector newVector = new Vector();For(int i=0;i

} 還有一種簡單的方式,HashSet set = new HashSet(vector);66、Collection 和 Collections的區(qū)別。

Collection是集合類的上級(jí)接口,繼承與他的接口主要有Set 和List.Collections是針對(duì)集合類的一個(gè)幫助類,他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程安全化等操作。67、Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別? Set里的元素是不能重復(fù)的,元素重復(fù)與否是使用equals()方法進(jìn)行判斷的。

equals()和==方法決定引用值是否指向同一對(duì)象equals()在類中被覆蓋,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類型相配的話,返回真值。

68、你所知道的集合類都有哪些?主要方法?

最常用的集合類是 List 和 Map。List 的具體實(shí)現(xiàn)包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構(gòu)建、存儲(chǔ)和操作任何類型對(duì)象的元素列表。List 適用于按數(shù)值索引訪問元素的情形。

Map 提供了一個(gè)更通用的元素存儲(chǔ)方法。Map 集合類用于存儲(chǔ)元素對(duì)(稱作”鍵“和”值“),其中每個(gè)鍵映射到一個(gè)值。

ArrayList/Vector?List ?Collection HashSet/TreeSet?Set

Propeties?HashTable

我記的不是方法名,而是思想,我知道它們都有增刪改查的方法,但這些方法的具體名稱,我記得不是很清楚,對(duì)于set,大概的方法是add,remove, contains;對(duì)于map,大概的方法就是put,remove,contains等,因?yàn)椋抑灰趀clispe下按點(diǎn)操作符,很自然的這些方法就出來了。我記住的一些思想就是List類會(huì)有g(shù)et(int index)這樣的方法,因?yàn)樗梢园错樞蛉≡兀鴖et類中沒有g(shù)et(int index)這樣的方法。List和set都可以迭代出所有元素,迭代時(shí)先要得到一個(gè)iterator對(duì)象,所以,set和list類都有一個(gè)iterator方法,用于返回那個(gè)iterator對(duì)象。map可以返回三個(gè)集合,一個(gè)是返回所有的key的集合,另外一個(gè)返回的是所有value的集合,再一個(gè)返回的key和value組合成的EntrySet對(duì)象的集合,map也有g(shù)et方法,參數(shù)是key,返回值是key對(duì)應(yīng)的value。

69、兩個(gè)對(duì)象值相同(x.equals(y)== true),但卻可有不同的hash code,這句話對(duì)不對(duì)? 對(duì)。

如果對(duì)象要保存在HashSet或HashMap中,它們的equals相等,那么,它們的hashcode值就必須相等。

如果不是要保存在HashSet或HashMap,則與hashcode沒有什么關(guān)系了,這時(shí)候hashcode不等是可以的,例如arrayList存儲(chǔ)的對(duì)象就不用實(shí)現(xiàn)hashcode,當(dāng)然,我們沒有理由不實(shí)現(xiàn),通常都會(huì)去實(shí)現(xiàn)的。

70、TreeSet里面放對(duì)象,如果同時(shí)放入了父類和子類的實(shí)例對(duì)象,那比較時(shí)使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常!

(應(yīng)該是沒有針對(duì)問題的確切的答案,當(dāng)前的add方法放入的是哪個(gè)對(duì)象,就調(diào)用哪個(gè)對(duì)象的compareTo方法,至于這個(gè)compareTo方法怎么做,就看當(dāng)前這個(gè)對(duì)象的類中是如何編寫這個(gè)方法的)實(shí)驗(yàn)代碼:

public class Parent implements Comparable { private int age = 0;?Map Treemap/HashMap if(!newVector.contains(obj);newVector.add(obj);

}

public class Child extends Parent {

}

public class TreeSetTest {

}

71、說出一些常用的類,包,接口,請(qǐng)各舉5個(gè)

要讓人家感覺你對(duì)java ee開發(fā)很熟,所以,不能僅僅只列core java中的那些東西,要多列你在做ssh項(xiàng)目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。

常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer java.util.Date,System,Class,List,HashMap

常用的包:java.lang java.io java.util java.sql ,javax.servlet,org.apache.strtuts.action,org.hibernate /** * @param args */ public static void main(String[] args){

} // TODO Auto-generated method stub TreeSet set = new TreeSet();set.add(new Parent(3));set.add(new Child());set.add(new Parent(4));System.out.println(set.size());}

// TODO Auto-generated method stub System.out.println(”method of child“);Child o1 =(Child)o;return 1;public Child(){ } public int compareTo(Object o){ super(3);public Parent(int age){ } public int compareTo(Object o){

} // TODO Auto-generated method stub System.out.println(”method of parent“);Parent o1 =(Parent)o;return age>o1.age?1:age

常用的接口:Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession 72、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請(qǐng)說出他們分別是哪些類?

字節(jié)流,字符流。字節(jié)流繼承于InputStream OutputStream,字符流繼承于InputStreamReader OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。

73、字節(jié)流與字符流的區(qū)別 要把一片二進(jìn)制數(shù)據(jù)數(shù)據(jù)逐一輸出到某個(gè)設(shè)備中,或者從某個(gè)設(shè)備中逐一讀取一片二進(jìn)制數(shù)據(jù),不管輸入輸出設(shè)備是什么,我們要用統(tǒng)一的方式來完成這些操作,用一種抽象的方式進(jìn)行描述,這個(gè)抽象描述方式起名為IO流,對(duì)應(yīng)的抽象類為OutputStream和InputStream,不同的實(shí)現(xiàn)類就代表不同的輸入和輸出設(shè)備,它們都是針對(duì)字節(jié)進(jìn)行操作的。在應(yīng)用中,經(jīng)常要完全是字符的一段文本輸出去或讀進(jìn)來,用字節(jié)流可以嗎?計(jì)算機(jī)中的一切最終都是二進(jìn)制的字節(jié)形式存在。對(duì)于“中國”這些字符,首先要得到其對(duì)應(yīng)的字節(jié),然后將字節(jié)寫入到輸出流。讀取時(shí),首先讀到的是字節(jié),可是我們要把它顯示為字符,我們需要將字節(jié)轉(zhuǎn)換成字符。由于這樣的需求很廣泛,人家專門提供了字符流的包裝類。

底層設(shè)備永遠(yuǎn)只接受字節(jié)數(shù)據(jù),有時(shí)候要寫字符串到底層設(shè)備,需要將字符串轉(zhuǎn)成字節(jié)再進(jìn)行寫入。字符流是字節(jié)流的包裝,字符流則是直接接受字符串,它內(nèi)部將串轉(zhuǎn)成字節(jié),再寫入底層設(shè)備,這為我們向IO設(shè)別寫入或讀取字符串提供了一點(diǎn)點(diǎn)方便。

字符向字節(jié)轉(zhuǎn)換時(shí),要注意編碼的問題,因?yàn)樽址D(zhuǎn)成字節(jié)數(shù)組,其實(shí)是轉(zhuǎn)成該字符的某種編碼的字節(jié)形式,讀取也是反之的道理。

講解字節(jié)流與字符流關(guān)系的代碼案例: import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.InputStreamReader;import java.io.PrintWriter;

public class IOTest { public static void main(String[] args)throws Exception {

String str = ”中國人“;/*FileOutputStream fos = new FileOutputStream(”1.txt“);

fos.write(str.getBytes(”UTF-8“));fos.close();*/

/*FileWriter fw = new FileWriter(”1.txt“);fw.write(str);fw.close();*/ PrintWriter pw = new PrintWriter(”1.txt“,”utf-8“);pw.write(str);pw.close();

/*FileReader fr = new FileReader(”1.txt“);char[] buf = new char[1024];int len = fr.read(buf);String myStr = new String(buf,0,len);System.out.println(myStr);*/ /*FileInputStream fr = new FileInputStream(”1.txt“);byte[] buf = new byte[1024];int len = fr.read(buf);String myStr = new String(buf,0,len,”UTF-8“);System.out.println(myStr);*/

} } 74、什么是java序列化,如何實(shí)現(xiàn)java序列化?或者請(qǐng)解釋Serializable接口的作用。

我們有時(shí)候?qū)⒁粋€(gè)java對(duì)象變成字節(jié)流的形式傳出去或者從一個(gè)字節(jié)流中恢復(fù)成一個(gè)java對(duì)象,例如,要將java對(duì)象存儲(chǔ)到硬盤或者傳送給網(wǎng)絡(luò)上的其他計(jì)算機(jī),這個(gè)過程我們可以自己寫代碼去把一個(gè)java對(duì)象變成某個(gè)格式的字節(jié)流再傳輸,但是,jre本身就提供了這種支持,我們可以調(diào)用OutputStream的writeObject方法來做,如果要讓java 幫我們做,要被傳輸?shù)膶?duì)象必須實(shí)現(xiàn)serializable接口,這樣,javac編譯時(shí)就會(huì)進(jìn)行特殊處理,編譯的類才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的類必須實(shí)現(xiàn)Serializable接口,該接口是一個(gè)mini接口,其中沒有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的。

例如,在web開發(fā)中,如果對(duì)象被保存在了Session中,tomcat在重啟時(shí)要把Session對(duì)象序列化到硬盤,這個(gè)對(duì)象就必須實(shí)現(xiàn)Serializable接口。如果對(duì)象要經(jīng)過分布式系統(tǒng)進(jìn)行網(wǎng)絡(luò)傳輸或通過rmi等遠(yuǎn)程調(diào)用,這就需要在網(wǎng)絡(luò)上傳輸對(duì)象,被傳輸?shù)膶?duì)象就必須實(shí)現(xiàn)Serializable接口。

75、描述一下JVM加載class文件的原理機(jī)制? JVM中類的裝載是由ClassLoader和它的子類來實(shí)現(xiàn)的,Java ClassLoader 是一個(gè)重要的Java運(yùn)行時(shí)系統(tǒng)組件。它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件的類。

76、heap和stack有什么區(qū)別。

java的內(nèi)存分為兩類,一類是棧內(nèi)存,一類是堆內(nèi)存。棧內(nèi)存是指程序進(jìn)入一個(gè)方法時(shí),會(huì)為這個(gè)方法單獨(dú)分配一塊私屬存儲(chǔ)空間,用于存儲(chǔ)這個(gè)方法內(nèi)部的局部變量,當(dāng)這個(gè)方法結(jié)束時(shí),分配給這個(gè)方法的棧會(huì)釋放,這個(gè)棧中的變量也將隨之釋放。堆是與棧作用不同的內(nèi)存,一般用于存放不放在當(dāng)前方法棧中的那些數(shù)據(jù),例如,使用new創(chuàng)建的對(duì)象都放在堆里,所以,它不會(huì)隨方法的結(jié)束而消失。方法中的局部變量使用final修飾后,放在堆中,而不是棧中。

77、GC是什么? 為什么要有GC?

GC是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動(dòng)監(jiān)測對(duì)象是否超過作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。

78、垃圾回收的優(yōu)點(diǎn)和原理。并考慮2種回收機(jī)制。

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

79、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存嗎?有什么辦法主動(dòng)通知虛擬機(jī)進(jìn)行垃圾回收?

對(duì)于GC來說,當(dāng)程序員創(chuàng)建對(duì)象時(shí),GC就開始監(jiān)控這個(gè)對(duì)象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對(duì)象。通過這種方式確定哪些對(duì)象是”可達(dá)的“,哪些對(duì)象是”不可達(dá)的“。當(dāng)GC確定一些對(duì)象為”不可達(dá)“時(shí),GC就有責(zé)任回收這些內(nèi)存空間。可以。程序員可以手動(dòng)執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語言規(guī)范并不保證GC BufferedReader br = new BufferedReader(new InputStreamReader();new FileInputStream(”1.txt“),”UTF-8“)String myStr = br.readLine();br.close();System.out.println(myStr);

一定會(huì)執(zhí)行。

80、什么時(shí)候用assert。

assertion(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式,很多開發(fā)語言中都支持這種機(jī)制。在實(shí)現(xiàn)中,assertion就是在程序中的一條語句,它對(duì)一個(gè)boolean表達(dá)式進(jìn)行檢查,一個(gè)正確程序必須保證這個(gè)boolean表達(dá)式的值為true;如果該值為false,說明程序已經(jīng)處于不正確的狀態(tài)下,assert將給出警告或退出。一般來說,assertion用于保證程序最基本、關(guān)鍵的正確性。assertion檢查通常在開發(fā)和測試時(shí)開啟。為了提高性能,在軟件發(fā)布后,assertion檢查通常是關(guān)閉的。package com.huawei.interview;

public class AssertTest {

}

81、java中會(huì)存在內(nèi)存泄漏嗎,請(qǐng)簡單描述。

所謂內(nèi)存泄露就是指一個(gè)不再被程序使用的對(duì)象或變量一直被占據(jù)在內(nèi)存中。java中有垃圾回收機(jī)制,它可以保證一對(duì)象不再被引用的時(shí)候,即對(duì)象編程了孤兒的時(shí)候,對(duì)象將自動(dòng)被垃圾回收器從內(nèi)存中清除掉。由于Java 使用有向圖的方式進(jìn)行垃圾回收管理,可以消除引用循環(huán)的問題,例如有兩個(gè)對(duì)象,相互引用,只要它們和根進(jìn)程不可達(dá)的,那么GC也是可以回收它們的,例如下面的代碼可以看到這種情況的內(nèi)存回收: package com.huawei.interview;

import java.io.IOException;

public class GarbageTest {

/** * @param args * @throws IOException */ public static void main(String[] args)throws IOException {

// TODO Auto-generated method stub try {

gcTest();// TODO Auto-generated catch block e.printStackTrace();} catch(IOException e){ /** * @param args */ public static void main(String[] args){

} // TODO Auto-generated method stub int i = 0;for(i=0;i<5;i++){ } //假設(shè)程序不小心多了一句--i;--i;assert i==5;System.out.println(i);

}

java中的內(nèi)存泄露的情況:長生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄露,盡管短生命周期對(duì)象已經(jīng)不再需要,但是因?yàn)殚L生命周期對(duì)象持有它的引用而導(dǎo)致不能被回收,這就是java中內(nèi)存泄露的發(fā)生場景,通俗地說,就是程序員可能創(chuàng)建了一個(gè)對(duì)象,以后一直不再使用這個(gè)對(duì)象,這個(gè)對(duì)象卻一直被引用,即這個(gè)對(duì)象無用但是卻無法被垃圾回收器回收的,這就是java中可能出現(xiàn)內(nèi)存泄露的情況,例如,緩存系統(tǒng),我們加載了一個(gè)對(duì)象放在緩存中(例如放在一個(gè)全局map對(duì)象中),然后一直不再使用它,這個(gè)對(duì)象一直被緩存引用,但卻不再被使用。

檢查java中的內(nèi)存泄露,一定要讓程序?qū)⒏鞣N分支情況都完整執(zhí)行到程序結(jié)束,然后看某個(gè)對(duì)象是否被使用過,如果沒有,則才能判定這個(gè)對(duì)象屬于內(nèi)存泄露。

如果一個(gè)外部類的實(shí)例對(duì)象的方法返回了一個(gè)內(nèi)部類的實(shí)例對(duì)象,這個(gè)內(nèi)部類對(duì)象被長期引用了,即使那個(gè)外部類實(shí)例對(duì)象不再被使用,但由于內(nèi)部類持久外部類的實(shí)例對(duì)象,這個(gè)外部類對(duì)象將不會(huì)被垃圾回收,這也會(huì)造成內(nèi)存泄露。

private static class Person {

} byte[] data = new byte[20000000];Person mate = null;public void setMate(Person other){ } mate = other;private static void gcTest()throws IOException {

} System.in.read();System.in.read();System.in.read();System.in.read();p1.setMate(p2);p2.setMate(p1);System.out.println(”before exit gctest!“);System.in.read();System.in.read();System.gc();System.out.println(”exit gctest!“);

Person p2 = new Person();

Person p1 = new Person();

} } System.out.println(”has exited gcTest!“);System.in.read();System.in.read();for(int i=0;i<100;i++){

} System.gc();System.in.read();System.in.read();

System.out.println(”out begin gc!“);

下面內(nèi)容來自于網(wǎng)上(主要特點(diǎn)就是清空堆棧中的某個(gè)元素,并不是徹底把它從數(shù)組中拿掉,而是把存儲(chǔ)的總數(shù)減少,本人寫得可以比這個(gè)好,在拿掉某個(gè)元素時(shí),順便也讓它從數(shù)組中消失,將那個(gè)元素所在的位置的值設(shè)置為null即可):

我實(shí)在想不到比那個(gè)堆棧更經(jīng)典的例子了,以致于我還要引用別人的例子,下面的例子不是我想到的,是書上看到的,當(dāng)然如果沒有在書上看到,可能過一段時(shí)間我自己也想的到,可是那時(shí)我說是我自己想到的也沒有人相信的。

public class Stack {

private Object[] elements=new Object[10];

private int size = 0;

public void push(Object e){

ensureCapacity();

elements[size++] = e;

}

public Object pop(){

if(size == 0)

throw new EmptyStackException();

return elements[--size];

}

private void ensureCapacity(){

if(elements.length == size){

Object[] oldElements = elements;

elements = new Object[2 * elements.length+1];

System.arraycopy(oldElements,0, elements, 0, size);

}

}

}

上面的原理應(yīng)該很簡單,假如堆棧加了10個(gè)元素,然后全部彈出來,雖然堆棧是空的,沒有我們要的東西,但是這是個(gè)對(duì)象是無法回收的,這個(gè)才符合了內(nèi)存泄露的兩個(gè)條件:無用,無法回收。

但是就是存在這樣的東西也不一定會(huì)導(dǎo)致什么樣的后果,如果這個(gè)堆棧用的比較少,也就浪費(fèi)了幾個(gè)K內(nèi)存而已,反正我們的內(nèi)存都上G了,哪里會(huì)有什么影響,再說這個(gè)東西很快就會(huì)被回收的,有什么關(guān)系。下面看兩個(gè)例子。

例子1

public class Bad{

public static Stack s=Stack();

static{

s.push(new Object());

s.pop();//這里有一個(gè)對(duì)象發(fā)生內(nèi)存泄露

s.push(new Object());//上面的對(duì)象可以被回收了,等于是自愈了

}

}

因?yàn)槭莝tatic,就一直存在到程序退出,但是我們也可以看到它有自愈功能,就是說如果你的Stack最多有100個(gè)對(duì)象,那么最多也就只有100個(gè)對(duì)象無法被回收其實(shí)這個(gè)應(yīng)該很容易理解,Stack內(nèi)部持有100個(gè)引用,最壞的情況就是他們都是無用的,因?yàn)槲覀円坏┓判碌倪M(jìn)取,以前的引用自然消失!

內(nèi)存泄露的另外一種情況:當(dāng)一個(gè)對(duì)象被存儲(chǔ)進(jìn)HashSet集合中以后,就不能修改這個(gè)對(duì)象中的那些參與計(jì)算哈希值的字段了,否則,對(duì)象修改后的哈希值與最初存儲(chǔ)進(jìn)HashSet集合中時(shí)的哈希值就不同了,在這種情況下,即使在contains方法使用該對(duì)象的當(dāng)前引用作為的參數(shù)去HashSet集合中檢索對(duì)象,也將返回找不到對(duì)象的結(jié)果,這也會(huì)導(dǎo)致無法從HashSet集合中單獨(dú)刪除當(dāng)前對(duì)象,造成內(nèi)存泄露。

82、能不能自己寫個(gè)類,也叫java.lang.String?

可以,但在應(yīng)用的時(shí)候,需要用自己的類加載器去加載,否則,系統(tǒng)的類加載器永遠(yuǎn)只是去加載jre.jar包中的那個(gè)java.lang.String。

由于在tomcat的web應(yīng)用程序中,都是由webapp自己的類加載器先自己加載WEB-INF/classess目錄中的類,然后才委托上級(jí)的類加載器加載,如果我們?cè)趖omcat的web應(yīng)用程序中寫一個(gè)java.lang.String,這時(shí)候Servlet程序加載的就是我們自己寫的java.lang.String,但是這么干就會(huì)出很多潛在的問題,原來所有用了java.lang.String類的都將出現(xiàn)問題。

雖然java提供了endorsed技術(shù),可以覆蓋jdk中的某些類,具體做法是?.。但是,能夠被覆蓋的類是有限制范圍,反正不包括java.lang這樣的包中的類。

(下面的例如主要是便于大家學(xué)習(xí)理解只用,不要作為答案的一部分,否則,人家懷疑是題目泄露了)例如,運(yùn)行下面的程序: package java.lang;

public class String {

} 報(bào)告的錯(cuò)誤如下:

java.lang.NoSuchMethodError: main Exception in thread ”main“ 這是因?yàn)榧虞d了jre自帶的java.lang.String,而該類中沒有main方法。

83.Java代碼查錯(cuò) 1.abstract class Name {

private String name;

public abstract boolean isStupidName(String name){} } 大俠們,這有何錯(cuò)誤? 答案: 錯(cuò)。abstract method必須以分號(hào)結(jié)尾,且不帶花括號(hào)。2.public class Something {

void doSomething(){

private String s = ”“;

int l = s.length();

} } 有錯(cuò)嗎? 答案: 錯(cuò)。局部變量前不能放置任何訪問修飾符(private,public,和protected)。final可以用來修飾局部變量(final如同abstract和strictfp,都是非訪問修飾符,strictfp只能修飾class和method而非variable)。3.abstract class Something {

private abstract String doSomething();} 這好像沒什么錯(cuò)吧? 答案: 錯(cuò)。abstract的methods不能以private修飾。abstract的methods就是讓子類implement(實(shí)現(xiàn))具體細(xì)節(jié)的,怎么可以用private把a(bǔ)bstract /** * @param args */ public static void main(String[] args){

} // TODO Auto-generated method stub System.out.println(”string“);

method封鎖起來呢?(同理,abstract method前不能加final)。4.public class Something {

public int addOne(final int x){

return ++x;

} } 這個(gè)比較明顯。

答案: 錯(cuò)。int x被修飾成final,意味著x不能在addOne method中被修改。5.public class Something {

public static void main(String[] args){

Other o = new Other();

new Something().addOne(o);

}

public void addOne(final Other o){

o.i++;

} } class Other {

public int i;} 和上面的很相似,都是關(guān)于final的問題,這有錯(cuò)嗎? 答案: 正確。在addOne method中,參數(shù)o被修飾成final。如果在addOne method里我們修改了o的reference(比如: o = new Other();),那么如同上例這題也是錯(cuò)的。但這里修改的是o的member vairable(成員變量),而o的reference并沒有改變。6.class Something {

int i;

public void doSomething(){

System.out.println(”i = “ + i);

} } 有什么錯(cuò)呢? 看不出來啊。

答案: 正確。輸出的是”i = 0“。int i屬於instant variable(實(shí)例變量,或叫成員變量)。instant variable有default value。int的default value是0。7.class Something {

final int i;

public void doSomething(){

System.out.println(”i = “ + i);

} } 和上面一題只有一個(gè)地方不同,就是多了一個(gè)final。這難道就錯(cuò)了嗎? 答案: 錯(cuò)。final int i是個(gè)final的instant variable(實(shí)例變量,或叫成員變量)。final的instant variable沒有default value,必須在constructor(構(gòu)造器)結(jié)束之前被賦予一個(gè)明確的值。可以修改為”final int i = 0;“。8.public class Something {

public static void main(String[] args){

Something s = new Something();

System.out.println(”s.doSomething()returns “ + doSomething());

}

public String doSomething(){

return ”Do something...“;

} } 看上去很完美。

答案: 錯(cuò)。看上去在main里call doSomething沒有什么問題,畢竟兩個(gè)methods都在同一個(gè)class里。但仔細(xì)看,main是static的。static method不能直接call non-static methods。可改成”System.out.println(“s.doSomething()returns ” + s.doSomething());“。同理,static method不能訪問non-static instant variable。9.此處,Something類的文件名叫OtherThing.java class Something {

private static void main(String[] something_to_do){

System.out.println(”Do something...“);

} } 這個(gè)好像很明顯。

答案: 正確。從來沒有人說過Java的Class名字必須和其文件名相同。但public class的名字必須和文件名相同。10.

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();

} } 答案:錯(cuò)誤。在編譯時(shí)會(huì)發(fā)生錯(cuò)誤(錯(cuò)誤描述不同的JVM有不同的信息,意思就是未明確的x調(diào)用,兩個(gè)x都匹配(就象在同時(shí)import java.util和java.sql兩個(gè)包時(shí)直接聲明Date一樣)。對(duì)于父類的變量,可以用super.x來明確,而接口的屬性默認(rèn)隱含為 public static final.所以可以通過A.x來明確。11.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());

} } 這個(gè)錯(cuò)誤不容易發(fā)現(xiàn)。

答案: 錯(cuò)。”interface Rollable extends Playable, Bounceable“沒有問題。interface可繼承多個(gè)interfaces,所以這里沒錯(cuò)。問題出在interface Rollable里的”Ball ball = new Ball(“PingPang”);“。任何在interface里聲明的interface variable(接口變量,也可稱成員變量),默認(rèn)為public static final。也就是說”Ball ball = new Ball(“PingPang”);“實(shí)際上是”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是不能被改變r(jià)eference的。因此編譯器將在”ball = new Ball(“Football”);“這里顯示有錯(cuò)。二.算法與編程

1、編寫一個(gè)程序,將a.txt文件中的單詞與b.txt文件中的單詞交替合并到c.txt文件中,a.txt文件中的單詞用回車符分隔,b.txt文件中用回車或空格進(jìn)行分隔。答:

import java.io.File;import java.io.FileReader;import java.io.FileWriter;

public class MainClass{

}

class FileManager{

String[] words = null;public static void main(String[] args)throws Exception{

} FileManager a = new FileManager(”a.txt“,new char[]{'n'});FileManager b = new FileManager(”b.txt“,new char[]{'n',' '});FileWriter c = new FileWriter(”c.txt“);String aWord = null;String bWord = null;while((aWord = a.nextWord())!=null){

}

while((bWord = b.nextWord())!= null){ } c.write(bWord + ”n“);c.write(aWord + ”n“);bWord = b.nextWord();if(bWord!= null)c.write(bWord + ”n“);

package cn.itcast;c.close();

}

2、編寫一個(gè)程序,將d:java目錄下的所有.java文件復(fù)制到d:jad目錄下,并將原來文件的擴(kuò)展名從.java改為.jad。(大家正在做上面這道題,網(wǎng)上遲到的朋友也請(qǐng)做做這道題,找工作必須能編寫這些簡單問題的代碼!)

答:listFiles方法接受一個(gè)FileFilter對(duì)象,這個(gè)FileFilter對(duì)象就是過慮的策略對(duì)象,不同的人提供不同的FileFilter實(shí)現(xiàn),即提供了不同的過濾策略。import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FilenameFilter;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;

public class Jad2Java {);

} public boolean accept(File dir, String name){ } return name.endsWith(”.java“);public static void main(String[] args)throws Exception {

File srcDir = new File(”java“);if(!(srcDir.exists()&& srcDir.isDirectory()))throw new Exception(”目錄不存在“);File[] files = srcDir.listFiles(new FilenameFilter(){ int pos = 0;public FileManager(String filename,char[] seperators)throws Exception{

}

public String nextWord(){

} if(pos == words.length)return null;return words[pos++];File f = new File(filename);FileReader reader = new FileReader(f);char[] buf = new char[(int)f.length()];int len = reader.read(buf);String results = new String(buf,0,len);String regex = null;if(seperators.length >1){

} words = results.split(regex);regex = ”“ + seperators[0] + ”|“ + seperators[1];regex = ”“ + seperators[0];}else{

}

由本題總結(jié)的思想及策略模式的解析: 1.class jad2java{

}

分析listFiles方法內(nèi)部的策略模式實(shí)現(xiàn)原理 File[] listFiles(FileFilter filter){

File[] files = listFiles();//Arraylist acceptedFilesList = new ArrayList();File[] acceptedFiles = new File[files.length];int pos = 0;1.得到某個(gè)目錄下的所有的java文件集合 1.1 得到目錄 File srcDir = new File(”d:java“);1.2 得到目錄下的所有java文件:File[] files = srcDir.listFiles(new MyFileFilter());1.3 只想得到.java的文件: class MyFileFilter implememyts FileFilter{

}

2.1 得到目標(biāo)目錄,如果目標(biāo)目錄不存在,則創(chuàng)建之

2.2 根據(jù)源文件名得到目標(biāo)文件名,注意要用正則表達(dá)式,注意.的轉(zhuǎn)義。2.3 根據(jù)表示目錄的File和目標(biāo)文件名的字符串,得到表示目標(biāo)文件的File。

//要在硬盤中準(zhǔn)確地創(chuàng)建出一個(gè)文件,需要知道文件名和文件的目錄。//方法接受的參數(shù)類型盡量面向父類,越抽象越好,這樣適應(yīng)面更寬廣。2.4 將源文件的流拷貝成目標(biāo)文件流,拷貝方法獨(dú)立成為一個(gè)方法,方法的參數(shù)采用抽象流的形式。public boolean accept(File pathname){ } return pathname.getName().endsWith(”.java“)}

}

private static void copy(InputStream ips,OutputStream ops)throws Exception{

int len = 0;byte[] buf = new byte[1024];while((len = ips.read(buf))!=-1){ } ops.write(buf,0,len);

System.out.println(files.length);File destDir = new File(”jad“);if(!destDir.exists())destDir.mkdir();for(File f :files){

} FileInputStream fis = new FileInputStream(f);String destFileName = f.getName().replaceAll(”.java$“, ”.jad“);FileOutputStream fos = new FileOutputStream(new File(destDir,destFileName));copy(fis,fos);fis.close();fos.close();2.將每個(gè)文件復(fù)制到另外一個(gè)目錄,并改擴(kuò)展名

}

3、編寫一個(gè)截取字符串的函數(shù),輸入為一個(gè)字符串和字節(jié)數(shù),輸出為按字節(jié)截取的字符串,但要保證漢字不被截取半個(gè),如“我ABC”,4,應(yīng)該截取“我AB”,輸入“我ABC漢DEF”,6,應(yīng)該輸出“我ABC”,而不是“我ABC+漢的半個(gè)”。答:

首先要了解中文字符有多種編碼及各種編碼的特征。

public static void main(String[] args)throws Exception{

}

public static int trimGBK(byte[] buf,int n){

} int num = 0;boolean bChineseFirstHalf = false;for(int i=0;i

} return num;if(buf[i]<0 &&!bChineseFirstHalf){

} bChineseFirstHalf = true;num++;bChineseFirstHalf = false;

}else{ String str = ”我a愛中華abc我愛傳智def';String str = “我ABC漢”;int num = trimGBK(str.getBytes(“GBK”),5);System.out.println(str.substring(0,num));假設(shè)n為要截取的字節(jié)數(shù)。for(File file: files){

}

Arrays.copyOf(acceptedFiles,pos);//return(File[])accpetedFilesList.toArray();boolean accepted = filter.accept(file);if(accepted){

} //acceptedFilesList.add(file);acceptedFiles[pos++] = file;

4、有一個(gè)字符串,其中包含中文字符、英文字符和數(shù)字字符,請(qǐng)統(tǒng)計(jì)和打印出各個(gè)字符的個(gè)數(shù)。答:哈哈,其實(shí)包含中文字符、英文字符、數(shù)字字符原來是出題者放的煙霧彈。String content = “中國aadf的111薩bbb菲的zz薩菲”;HashMap map = new HashMap();for(int i=0;i

char c = content.charAt(i);Integer num = map.get(c);if(num == null)num = 1;num = num + 1;else map.put(c,num);

} for(Map.EntrySet entry : map){ } 估計(jì)是當(dāng)初面試的那個(gè)學(xué)員表述不清楚,問題很可能是:

如果一串字符如“aaaabbc中國1512”要分別統(tǒng)計(jì)英文字符的數(shù)量,中文字符的數(shù)量,和數(shù)字字符的數(shù)量,假設(shè)字符中沒有中文字符、英文字符、數(shù)字字符之外的其他特殊字符。int engishCount;int chineseCount;int digitCount;for(int i=0;i

} System.out.println(?????);

5、說明生活中遇到的二叉樹,用java實(shí)現(xiàn)二叉樹 這是組合設(shè)計(jì)模式。

我有很多個(gè)(假設(shè)10萬個(gè))數(shù)據(jù)要保存起來,以后還需要從保存的這些數(shù)據(jù)中檢索是否存在某個(gè)數(shù)據(jù),(我想說出二叉樹的好處,該怎么說呢?那就是說別人的缺點(diǎn)),假如存在數(shù)組中,那么,碰巧要找的數(shù)字位于99999那個(gè)地方,那查找的速度將很慢,因?yàn)橐獜牡?個(gè)依次往后取,取出來后進(jìn)行比較。平衡二叉樹(構(gòu)建平衡二叉樹需要先排序,我們這里就不作考慮了)可以很好地解決這個(gè)問題,但二叉樹的遍歷(前序,中序,后序)效率要比數(shù)組低很多,原理如下圖: char ch = str.charAt(i);if(ch>=’0’ && ch<=’9’){ } else if((ch>=’a’ && ch<=’z’)||(ch>=’A’ && ch<=’Z’)){ } else { } chineseCount++;engishCount++;digitCount++ system.out.println(entry.getkey()+ “:” + entry.getValue());

代碼如下:

package com.huawei.interview;

public class Node {

public int value;public Node left;public Node right;

public void store(int value){

if(value

} else if(value>this.value){

} if(right == null){

} else { } right.store(value);right = new Node();right.value=value;if(left == null){

} else { } left.store(value);left = new Node();left.value=value;

}

public void preList(){

}

public void middleList(){

} public void afterList(){

} {

int [] data = new int[20];for(int i=0;i

} System.out.println();

Node root = new Node();data[i] =(int)(Math.random()*100)+ 1;System.out.print(data[i] + “,”);if(left!=null)left.preList();if(right!=null)right.preList();System.out.print(this.value + “,”);

if(left!=null)left.preList();System.out.print(this.value + “,”);if(right!=null)right.preList();

System.out.print(this.value + “,”);if(left!=null)left.preList();if(right!=null)right.preList();}

public boolean find(int value){

System.out.println(“happen ” + this.value);if(value == this.value){ } else if(value>this.value){

{

} if(left == null)return false;return left.find(value);if(right == null)return false;return right.find(value);return true;}else public static void main(String [] args)

}-----------------又一次臨場寫的代碼---------------------------import java.util.Arrays;import java.util.Iterator;

public class Node {

private Node left;private Node right;private int value;//private int num;

public Node(int value){ } public void add(int value){

}

if(value > this.value){

} else{

} if(left!= null){

} Node node = new Node(value);left = node;

left.add(value);else if(right!= null){

} Node node = new Node(value);right = node;

right.add(value);else this.value = value;

} root.value = data[0];for(int i=1;i

root.find(data[19]);

root.preList();System.out.println();root.middleList();System.out.println();root.afterList();

root.store(data[i]);

第二篇:JAVA軟件工程師面試筆試試卷

JAVA軟件工程師筆試試題

JAVA軟件工程師筆試試題

(考試時(shí)間:120分鐘 試卷分值:150分)

一、邏輯推理題【10分】

1、甲、乙、丙、丁四位同學(xué)中有一位同學(xué)為海嘯災(zāi)區(qū)捐款1000元,當(dāng)老師詢問時(shí),他們分別這樣回答:

甲:這1000元不是我捐的 乙:這1000元是丁捐的 丙:這1000元是乙捐的 丁:這1000元不是我捐的

這四人中只有一個(gè)人說了真話,由此可見這1000元是誰捐的()。【2分】

A.甲 B.乙 C.丙 D.丁

2、甲、乙、丙三人是同一家公司的員工,他們的未婚妻A、B、C也都是這家公司的職員。知情者介紹說:“A的未婚夫是乙的好友,并在三個(gè)男子中最年輕;丙的年齡比C的未婚夫大。”依據(jù)該知情者提供的情況,我們可以推出三對(duì)組合分別是()。【3分】

A.甲—A,乙—B,丙—C

B.甲—B,乙—A,丙—C

C.甲—C,乙—B,丙—A

D.甲—A,乙—C,丙—B

3、甲乙丙丁四人的車分別為白色、銀色、藍(lán)色和紅色。在問到他們各自車的顏色時(shí),甲說:“乙的車不是白色。” 乙說:“丙的車是紅色的。” 丙說:“丁的車不是藍(lán)色的。”,丁說:“甲、乙、丙三人中有一個(gè)人的車是紅色的,而且只有這個(gè)人說的是實(shí)話。” 如果丁說的是實(shí)話,那么以下說法正確的是(): 【2分】

A.甲的車是白色的,乙的車是銀色的 B.乙的車是藍(lán)色的,丙的車是紅色的 C.丙的車是白色的,丁的車是藍(lán)色的 D.丁的車是銀色的,甲的車是紅色的 JAVA軟件工程師筆試試題

二、基礎(chǔ)理論題【20分】

1.Java是一種先________后_______運(yùn)行的語言。(提示:填編譯或者解釋)【1分】

2.棧是_________________的線性表,隊(duì)列是____________的線性表。【2分】

3.面向?qū)ο蟮幕咎卣鱛_______,_________,__________。【3分】

4.事務(wù)包含4個(gè)基本特征,即ACID,它們分別__________,__________,__________,__________【2分】

5.Math.round(11.5)等于______。Math.round(-11.5)等于______。【2分】

6.Java中數(shù)據(jù)類型包括_____________和______________。【1分】

7.Java程序控制語句中的循環(huán)語法分________,________和________三種。【3分】

8.構(gòu)造方法__________(能或者不能)被public、private、protected修飾。【1分】

9.Java的訪問控制有四種: ______、______、______、______。【2分】

10.AJAX的核心對(duì)象是_____________。【1分】

指JAVA軟件工程師筆試試題

三、JAVA基礎(chǔ)題【45分】

1.下列選項(xiàng)中不屬于java關(guān)鍵字的有()【1分】

[A] TRUE

[B] sizeof [D] super

[E] void [C] const

2.下面哪些是合法的標(biāo)識(shí)符()【1分】

[A] $persons [C] *point

[B] TwoUsers

[D] this [E] _endline 3.下列選項(xiàng)中不是原始數(shù)據(jù)類型的有?()【1分】

[A].short [C].Unit

[B].Boolean [D].float 4.下列選項(xiàng)中那些語句片段會(huì)發(fā)生異常 【1分】

[A] String s = “Gone with the wind”;String t = “good ”;String k = s + t;[B] String s = “Gone with the wind”;String t;t = s[3] + “one”;[C] String s = “Gone with the wind”;String standard = s.toUpperCase();[D] String s = “home directory”;String t = s-“directory”;5.以下選項(xiàng)中,合法的賦值語句是()【1分】

A.a == 1;B.++i;C.a = a + 1 = 5;D.y =(int)I;6.以下選項(xiàng)中,代碼執(zhí)行完畢后輸出結(jié)果是()【1分】

boolean bool = true;if(bool = false){ System.out.println(“a”);JAVA軟件工程師筆試試題

} else if(bool){ System.out.println(“b”);} else if(!bool){ System.out.println(“c”);} else { System.out.println(“d”);} A.a B.b C.c D.d E.Compilation fails 7.以下選項(xiàng)中,正確的是()【1分】

public class Alpha1 { public static void main(String[] args){

boolean flag;int i=0;

do {

flag = false;

System.out.println(i++);

flag = i < 10;

continue;

} while((flag)? true:false);

} } A.000000000 B.0123456789 C.Compilation fails.D.The code runs with no output.E.The code enters an infinite loop.F.An exception is thrown at runtime.JAVA軟件工程師筆試試題

8.以下代碼片段執(zhí)行后,正確輸出的結(jié)果是()【1分】

public class Delta { static boolean foo(char c){ System.out.print(c);return true;} public static void main(String[] argv){ int i =0;for(foo(?A?);foo(?B?)&&(i<2);foo(?C?)){

i++;foo(?D?);} } } A.ABDCBDCB B.ABCDABCD C.Compilation fails.D.An exception is thrown at runtime.9.有以下代碼片段

if(x>0){ System.out.println(“first”);} else if(x>-3){

System.out.println(“second”);} else {

System.out.println(“third”);} x的取值在什么范圍內(nèi)時(shí)將打印字符串“second”? JAVA軟件工程師筆試試題

A.x > 0 B.x >-3 C.x <=-3 D.x <= 0 & x >-3

10.有以下代碼片段

1)class Person { 2)

3)

4)} 5)public class Teacher extends Person { 6)

7)

8)9)public void printValue(){/*...*/ } public void printValue(int i){/*...*/} public static void main(String args[]){ Person t = new Teacher();Teacher t1 = new(Teacher)Person();

10)

11)} } 第十行加粗部分的聲明將調(diào)用哪些方法? [A] on line 2 [C] on line 6

11.在// point x處的哪些申明是句法上合法的是()【1分】

class Person {

private int a;

public int change(int m){ return m;}

}

public class Teacher extends Person {

public int b;

public static void main(String arg[]){ [B] on line 3 [D] on line 7 t.printValue(10);public void printValue(int i, int j){/*…*/ } public void printValue(int i){/*...*/ } JAVA軟件工程師筆試試題

Person p = new Person();

Teacher t = new Teacher();

int i;

// point x

}

} [A] i = m;

[B] i = b;

[D] i = p.change(30);[E] i = t.b.[C] i = p.a;

12.下列程序在執(zhí)行完循環(huán)后的結(jié)果為【1分】

int i=1,j=10;do{ if(i++>--j)

continue;} while(i<5);

A.i = 6 B.i = 5 C.i = 6 D.i = 5

13.判斷下列聲明是否正確,如果正確請(qǐng)標(biāo)記(√),錯(cuò)誤請(qǐng)標(biāo)記(×)【1分】

1.接口是可以繼承接口()2.接口可以實(shí)現(xiàn)接口()3.接口可以聲明為私有的()4.是否可以繼承String類()5.抽象類可以實(shí)現(xiàn)接口()6.抽象類可以繼承實(shí)體類()

14.下列哪種定義接口的方式是正確的【1分】

A.public interface A{ int a();} B.public interface A implement B{} C.interface C { int a;} j = 5 j = 5 j = 4 j = 6 JAVA軟件工程師筆試試題

D.private interface D{} E.abstract interface E{}

15.下列說法正確的有【1分】

A.類中的構(gòu)造函數(shù)不可省略

B.構(gòu)造函數(shù)必須與class同名,但方法不能與class同名 C.構(gòu)造函數(shù)在一個(gè)對(duì)象被new時(shí)執(zhí)行 D.一個(gè)class只能定義一個(gè)構(gòu)造函數(shù)

四、問答題【30分】

1.說說數(shù)據(jù)連接池的工作機(jī)制是什么【3分】

2.一個(gè)“.java”源文件中是否可以包括多個(gè)類(不是內(nèi)部類)?有什么限制。【

3.forward 和redirect的區(qū)別。【3分】

4.MVC的各個(gè)部分都有那些技術(shù)來實(shí)現(xiàn)?如何實(shí)現(xiàn)? 【3分】

3分】 JAVA軟件工程師筆試試題

5.頁面間對(duì)象傳遞的方法有哪幾種? 【3分】

6.說說jsp中動(dòng)態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?【3分】

7.jsp有哪些動(dòng)作?作用分別是什么?【3分】

8.抽象類abstract class和接口interface有什么區(qū)別? 【3分】

9.異常處理經(jīng)常用到的throws,throw,try,catch,finally分別代表什么?3分】 【 JAVA軟件工程師筆試試題

10.方法的重寫Overriding和重載Overloading的區(qū)別是什么?【3分】

五、SQL基礎(chǔ)題(任選一題)【25分】

題目一

假設(shè)有四個(gè)樣表:

學(xué)生表:students(學(xué)號(hào):stuNO,姓名:stuName,性別:stuSex,出生日期:stuBirthday,班級(jí):className)

教師表:techers(教師號(hào):techNo,姓名:techName,性別:techSex,出生日期:techBirthday,職稱:title,系別:department)

課程表:course(課程號(hào):couNo,課程名:couName,教師號(hào):techNo)成績表:score(學(xué)號(hào):stuNO,課程號(hào):couNo,成績:score)

1)在學(xué)生表中檢索與學(xué)號(hào)為2012040326的同學(xué)同年同日出生的所有學(xué)生的學(xué)號(hào)、姓名、出生日期.【5分】 JAVA軟件工程師筆試試題

2)查詢所有學(xué)生的姓名、課程號(hào)、成績【5分】

3)在成績表中查詢平均成績超過80分的學(xué)生學(xué)號(hào)、平均成績.【5分】

4)查出‘計(jì)算機(jī)系’教師所教課程的成績表【5分】

5)查詢所有任課教師的姓名和所在系【5分】

題目二

假設(shè)有四個(gè)樣表:

雇員表:EMP(編號(hào):EMPNO,姓名:ENAME,工作職位:JOB,領(lǐng)導(dǎo)編號(hào):MGR,雇傭日期:HIREDATE,月薪(工資):SAL,獎(jiǎng)金:COMM,部門編號(hào):DEPTNO)JAVA軟件工程師筆試試題

部門表:Dept(部門編號(hào):DEPTNO,部門名稱:DNAME,部門位置:LOC)工資等級(jí)表:Salgrade(等級(jí)名稱:GRADE,此等級(jí)的最低工資:LOSAL,此等級(jí)的最低工資:HISAL)

獎(jiǎng)金表:Bonus(雇員姓名:ENAME,工作職位:JOB,雇員工資:SAL,雇員獎(jiǎng)金:COMM)1)查詢?cè)诓块T30中員工的所有信息【3分】

2)檢索每個(gè)員工獎(jiǎng)金和工資的總和【5分】

3)找出沒有獎(jiǎng)金或者獎(jiǎng)金低于500的員工【5分】

4)列出員工表中每個(gè)部門的員工數(shù)(員工數(shù)必須大于3),和部門名稱【6分】

5)檢索每個(gè)月工資總數(shù)最少的那個(gè)部門的部門編號(hào),部門名稱,部門位置【6分】

JAVA軟件工程師筆試試題

6)檢索每個(gè)部門,,每個(gè)職位的平均工資和平均獎(jiǎng)金(平均值包括沒有獎(jiǎng)金),如果平均獎(jiǎng)金大于300,顯示“獎(jiǎng)金不錯(cuò)”,如果平均獎(jiǎng)金100到300,顯示“獎(jiǎng)金一般”,如果平均獎(jiǎng)金小于100,顯示“基本沒有獎(jiǎng)金”,按部門編號(hào)降序,平均工資降序排列【選做】

六、JAVA編程題【20分】

1.編寫一個(gè)簡單的實(shí)現(xiàn)冒泡排序的算法【10分】

JAVA軟件工程師筆試試題

2.寫一個(gè)或一組實(shí)現(xiàn)Singleton[單例]。【10分】

JAVA軟件工程師筆試試題

第三篇:Java軟件工程師

Java軟件工程師

Java軟件工程師,從1995年正式推出這么多年以為,java已從編程語言發(fā)展成為全球第一大統(tǒng)一開發(fā)平臺(tái)。Java技術(shù)已成為計(jì)算機(jī)行業(yè)主要公司所采納。越來越多的國家化標(biāo)準(zhǔn)化組織所接受。在短短的十幾年的時(shí)間,java團(tuán)體已經(jīng)發(fā)展成為擁有數(shù)百萬的群體,java的前景是非常之廣大的。

而且,先階段,在所有的軟件開發(fā)人才中,java軟件工程師需求量最大,市場需求已經(jīng)達(dá)到了70%左右,而且java軟件工程師薪水相對(duì)較高,一般的開發(fā)人員薪資年薪在10萬以上,更多的人想成為java軟件工程師,可以通過參加java技術(shù)培訓(xùn),成為高薪的java工程師。

2009年是3G牌照發(fā)放元年,隨著三大運(yùn)營商以千億計(jì)的3G網(wǎng)絡(luò)建設(shè)逐步展開,3G網(wǎng)絡(luò)資費(fèi)也隨著三大運(yùn)營商對(duì)入網(wǎng)用戶的爭奪逐步被廣大用戶所接受,各大IT產(chǎn)品公司也紛紛招兵買馬擴(kuò)充實(shí)力,然而,國內(nèi)3G人才嚴(yán)重匱乏,專業(yè)的3G終端應(yīng)用開發(fā)人才不足1000人,3G終端開發(fā)人才培訓(xùn)迫在眉睫。

3G夢工場由四維創(chuàng)意教育科技有限公司承辦,公司同時(shí)擁有四維夢工場知名動(dòng)漫游戲教育品牌,是湖北省最權(quán)威的動(dòng)漫游戲人才實(shí)訓(xùn)機(jī)構(gòu),3G夢工場致力于3G前端應(yīng)用開發(fā)工程師、iphone 軟件應(yīng)用開發(fā)工程師、Android開發(fā)工程師、MTK高級(jí)開發(fā)工程師: J2ME開發(fā)工程師:Windows Mobile開發(fā)工程師、Symbian初級(jí)、中級(jí)、高級(jí)開發(fā)工程師、3G移動(dòng)嵌入式軟件開發(fā)人才培養(yǎng),為各大企業(yè)提供優(yōu)質(zhì)3G應(yīng)用軟件開發(fā)人才。培養(yǎng)人才重點(diǎn)針對(duì)電信巨頭的人才需求,如中國移動(dòng)、中國電信、中國聯(lián)通以及國外蘋果、微軟、google、黑莓、索尼等巨頭企業(yè)。3G夢工場技術(shù)產(chǎn)品以與中國聯(lián)通、中國電信、iphone、google、微軟手機(jī)軟件商店取得戰(zhàn)略合作,提供優(yōu)質(zhì)技術(shù)產(chǎn)品的同時(shí)同時(shí)提供人才保障。

學(xué)院為確保教學(xué)質(zhì)量和學(xué)員項(xiàng)目開發(fā)能力,聘請(qǐng)了數(shù)十位來自盛大、騰訊、日本LYC、Com2Us、掌上明珠等一線行業(yè)知名企業(yè)項(xiàng)目研發(fā)工程師及項(xiàng)目經(jīng)理,分別掌握J(rèn)2ME、Symbian、Windows Mobile、MTK、iPhone、Android等最新3G開發(fā)技術(shù)、五年以上開發(fā)經(jīng)驗(yàn)的一線項(xiàng)目經(jīng)理擔(dān)任專職講師,形成了IT培訓(xùn)行業(yè)內(nèi)實(shí)戰(zhàn)經(jīng)驗(yàn)最豐富、最專業(yè)、最有責(zé)任心、最強(qiáng)大的師資陣容。

第四篇:Java 軟件工程師面試筆試題

Java 軟件工程師面試筆試題.txt﹃根網(wǎng)線''盡賺了多少人的青春い有時(shí)候感動(dòng)的就是身邊微不足道的小事。﹎破碎不是最殘酷的 最殘酷的是踩著這些碎片卻假裝不疼痛 固執(zhí)的尋找﹎將來就算我遇見再怎么完美的人,都有一個(gè)缺點(diǎn),他不是你,_____下輩子要做男生,娶一個(gè)像我這樣的女生。

一、你對(duì)MVC的理解,MVC有什么優(yōu)缺點(diǎn)?結(jié)合Struts,說明在一個(gè)Web應(yīng)用如何去使用? 答:

MVC設(shè)計(jì)模式(應(yīng)用觀察者模式的框架模式)

M: Model(Business process layer),模型,操作數(shù)據(jù)的業(yè)務(wù)處理層,并獨(dú)立于表現(xiàn)層(Independent of presentation)。

V: View(Presentation layer),視圖,通過客戶端數(shù)據(jù)類型顯示數(shù)據(jù),并回顯模型層的執(zhí)行結(jié)果。

C: Controller(Control layer),控制器,也就是視圖層和模型層橋梁,控制數(shù)據(jù)的流向,接受視圖層發(fā)出的事件,并重繪視圖

MVC框架的一種實(shí)現(xiàn)模型 模型二(Servlet-centric):

JSP+Servlet+JavaBean,以控制為核心,JSP只負(fù)責(zé)顯示和收集數(shù)據(jù),Sevlet,連接視圖和模型,將視圖層數(shù)據(jù),發(fā)送給模型層,JavaBean,分為業(yè)務(wù)類和數(shù)據(jù)實(shí)體,業(yè)務(wù)類處理業(yè)務(wù)數(shù)據(jù),數(shù)據(jù)實(shí)體,承載數(shù)據(jù),基本上大多數(shù)的項(xiàng)目都是使用這種MVC的實(shí)現(xiàn)模式。

StrutsMVC框架(Web application frameworks)

Struts是使用MVC的實(shí)現(xiàn)模式二來實(shí)現(xiàn)的,也就是以控制器為核心。

Struts提供了一些組件使用MVC開發(fā)應(yīng)用程序:

Model:Struts沒有提供model類。這個(gè)商業(yè)邏輯必須由Web應(yīng)用程序的開發(fā)者以JavaBean或EJB的形式提供

View:Struts提供了action form創(chuàng)建form bean, 用于在controller和view間傳輸數(shù)據(jù)。此外,Struts提供了自定義JSP標(biāo)簽庫,輔助開發(fā)者用JSP創(chuàng)建交互式的以表單為基礎(chǔ)的應(yīng)用程序,應(yīng)用程序資源文件保留了一些文本常量和錯(cuò)誤消息,可轉(zhuǎn)變?yōu)槠渌Z言,可用于JSP中。

Controller:Struts提供了一個(gè)核心的控制器ActionServlet,通過這個(gè)核心的控制器來調(diào)用其他用戶注冊(cè)了的自定義的控制器Action,自定義Action需要符合Struts的自定義Action規(guī)范,還需要在struts-config.xml的特定配置文件中進(jìn)行配置,接收J(rèn)SP輸入字段形成Action form,然后調(diào)用一個(gè)Action控制器。Action控制器中提供了model的邏輯接口。

二、什么是WebService? 答:

WebService是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴于語言,不依賴于平臺(tái),可以實(shí)現(xiàn)不同的語言間的相互調(diào)用,通過Internet進(jìn)行基于Http協(xié)議的網(wǎng)絡(luò)應(yīng)用間的交互。WebService實(shí)現(xiàn)不同語言間的調(diào)用,是依托于一個(gè)標(biāo)準(zhǔn),webservice是需要遵守WSDL(web服務(wù)定義語言)/SOAP(簡單請(qǐng)求協(xié)議)規(guī)范的。WebService=WSDL+SOAP+UDDI(webservice的注冊(cè))

Soap是由Soap的part和0個(gè)或多個(gè)附件組成,一般只有part,在part中有Envelope和Body。

Web Service是通過提供標(biāo)準(zhǔn)的協(xié)議和接口,可以讓不同的程序集成的一種SOA架構(gòu)。Web Service的優(yōu)點(diǎn)

(1)可以讓異構(gòu)的程序相互訪問(跨平臺(tái))

(2)松耦合

(3)基于標(biāo)準(zhǔn)協(xié)議(通用語言,允許其他程序訪問)Web Service的基本原理

(1)Service Provider采用WSDL描述服務(wù)

(2)Service Provider 采用UDDI將服務(wù)的描述文件發(fā)布到UDDI服務(wù)器(Register server)

(3)Service Requestor在UDDI服務(wù)器上查詢并 獲取WSDL文件

(4)Service requestor將請(qǐng)求綁定到SOAP,并訪問相應(yīng)的服務(wù)。

三、什么是中間件?

中間件就是程序中可織入的,可重用的,與業(yè)務(wù)邏輯無關(guān)的各種組件。

中間件(middleware)是基礎(chǔ)軟件的一大類,屬于可復(fù)用軟件的范疇。顧名思義,中間件處于操作系統(tǒng)軟件與用戶的應(yīng)用軟件的中間。中間件在操作系統(tǒng)、網(wǎng)絡(luò)和數(shù)據(jù)庫之上,應(yīng)用軟件的下層,總的作用是為處于自己上層的應(yīng)用軟件提供運(yùn)行與開發(fā)的環(huán)境,幫助用戶靈活、高效地開發(fā)和集成復(fù)雜的應(yīng)用軟件。

在眾多關(guān)于中間件的定義中,比較普遍被接受的是IDC表述的:中間件是一種獨(dú)立的系統(tǒng)軟件或服務(wù)程序,分布式應(yīng)用軟件借助這種軟件在不同的技術(shù)之間共享資源,中間件位于客戶機(jī)服務(wù)器的操作系統(tǒng)之上,管理計(jì)算資源和網(wǎng)絡(luò)通信。

分類:數(shù)據(jù)訪問中間件,遠(yuǎn)程調(diào)用中間件,消息中間件,交易中間件,對(duì)象中間件。

舉例:

1,RMI(Remote Method Invocations, 遠(yuǎn)程調(diào)用)

2,Load Balancing(負(fù)載均衡,將訪問負(fù)荷分散到各個(gè)服務(wù)器中)

3,Transparent Fail-over(透明的故障切換)

4,Clustering(集群,用多個(gè)小的服務(wù)器代替大型機(jī))

5,Back-end-Integration(后端集成,用現(xiàn)有的、新開發(fā)的系統(tǒng)如何去集成遺留的系統(tǒng))

6,Transaction事務(wù)(全局/局部)全局事務(wù)(分布式事務(wù))局部事務(wù)(在同一數(shù)據(jù)庫聯(lián)接內(nèi)的事務(wù))

7,Dynamic Redeployment(動(dòng)態(tài)重新部署,在不停止原系統(tǒng)的情況下,部署新的系統(tǒng))

8,System Management(系統(tǒng)管理)

9,Threading(多線程處理)

10,Message-oriented Middleware面向消息的中間件(異步的調(diào)用編程)

11,Component Life Cycle(組件的生命周期管理)

12,Resource pooling(資源池)

13,Security(安全)

14,Caching(緩存)

四、什么是典型的軟件三層結(jié)構(gòu)?軟件設(shè)計(jì)為什么要分層?軟件分層有什么好處? 答:(1)Presentation layer(表示層)

(1)表示邏輯(生成界面代碼)

(2)接收請(qǐng)求

(3)處理業(yè)務(wù)層拋出的異常

(4)負(fù)責(zé)規(guī)則驗(yàn)證(數(shù)據(jù)格式,數(shù)據(jù)非空等)

(5)流程控制

(2)Service layer(服務(wù)層/業(yè)務(wù)層)

(1)封裝業(yè)務(wù)邏輯處理,并且對(duì)外暴露接口

(2)負(fù)責(zé)事務(wù),安全等服務(wù)

(3)Persistence layer(持久層)

(1)封裝數(shù)據(jù)訪問的邏輯,暴露接口

(2)提供方便的數(shù)據(jù)訪問的方案(查詢語言,API,映射機(jī)制等)Domain layer(域?qū)樱?/p>

(1)業(yè)務(wù)對(duì)象以及業(yè)務(wù)關(guān)系的表示

(2)處理簡單的業(yè)務(wù)邏輯

(3)域?qū)拥膶?duì)象可以穿越表示層,業(yè)務(wù)層,持久層

軟件分層結(jié)構(gòu)使得代碼維護(hù)非常方便,設(shè)計(jì)明確,各層獨(dú)立,專注自己擅長的領(lǐng)域。

五、什么是OOP?OOP相對(duì)于面向過程編程有哪些優(yōu)點(diǎn)?

OOP,Object-Oriented Programming,面向?qū)ο缶幊滩煌诿嫦蜻^程編程:

(1)OOP關(guān)注對(duì)象和角色,也就是事物的本質(zhì)

1)OOP把客觀世界中的對(duì)象抽象成對(duì)應(yīng)的類;

2)通過類構(gòu)造實(shí)例;

3)通過依賴、繼承、實(shí)現(xiàn)等形式建立對(duì)象間的通信關(guān)系

(2)OOP易于擴(kuò)展,增加或改變業(yè)務(wù)的功能,無需大幅改動(dòng)改變?cè)创a

(3)OOP易于建模,OOP就是軟件架構(gòu)師在計(jì)算機(jī)高級(jí)語言中對(duì)客觀世界的抽象和再現(xiàn),人們可以很好地理解和建立起計(jì)算機(jī)中的抽象模型

六、談?wù)凮verload和Override的區(qū)別。

答:

方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫(Overriding)。子類的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類中的定義,對(duì)它而言,父類中的定義如同被“屏蔽”了。如果在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

七、談?wù)凥ashMap和Hashtable的區(qū)別。答:

HashMap是輕量級(jí)的(線程不安全的,效率高的)集合,Hashtable是重量級(jí)的(線程安全的,效率低的)集合。

都屬于Map接口的類,實(shí)現(xiàn)了將惟一鍵映射到特定的值上。

HashMap 類沒有分類或者排序。它允許一個(gè) null 鍵和多個(gè) null 值。

Hashtable 類似于 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因?yàn)樗峭降摹?/p>

八、請(qǐng)問abstract class和interface有什么區(qū)別?

答:

1)接口沒有任何的實(shí)現(xiàn),而抽象類它可以有部分的實(shí)現(xiàn)也可以沒有;

2)如果需要復(fù)用或者共享部分代碼,應(yīng)該用抽象類而不是接口;

3)繼承無法解決類型的轉(zhuǎn)換問題,接口就是為了解決這一問題而產(chǎn)生的(Java的單繼承是接口產(chǎn)生的根本原因)接口是一種抽象的第三方規(guī)范,跟對(duì)象沒什么直接關(guān)系。

九、請(qǐng)問軟件開發(fā)中的設(shè)計(jì)模式你會(huì)使用哪些?

答:我熟悉的設(shè)計(jì)模式有單例模式,DAO模式,模板方法,工廠模式,委托代理模式,MVC模式等。

Singleton模式主要作用是保證在Java應(yīng)用程序中,一個(gè)類Class只有一個(gè)實(shí)例存在。

Singleton模式一般形式: 定義一個(gè)類,它的構(gòu)造函數(shù)為private的,它有一個(gè)static的private的該類變量,在類初始化時(shí)實(shí)例話,通過一個(gè)public的getInstance方法獲取對(duì)它的引用,繼而調(diào)用其中的方法。

十、類的核心特性有哪些?

類具有封裝性、繼承性和多態(tài)性。

封裝性:

類的封裝性為類的成員提供公有、缺省、保護(hù)和私有等多級(jí)訪問權(quán)限,目的是隱藏類中的私有變量和類中方法的實(shí)現(xiàn)細(xì)節(jié)。

繼承性:

類的繼承性提供從已存在的類創(chuàng)建新類的機(jī)制,繼承(inheritance)使一個(gè)新類自動(dòng)擁有被繼承類(父類)的全部成員。

多態(tài)性:

類的多態(tài)性提供類中方法執(zhí)行的多樣性,多態(tài)性有兩種表現(xiàn)形式:重載和覆蓋。

十一、請(qǐng)問類與對(duì)象有什么區(qū)別?

類就是某一種事物的一般性的集合體,是相同或相似的各個(gè)事物共同特性的一種抽象。

對(duì)象

在面向?qū)ο蟾拍钪校瑢?duì)象(Object)是類的實(shí)例(instance)。對(duì)象與類的關(guān)系就像變量與數(shù)據(jù)類型的關(guān)系一樣。

十二、寫出生產(chǎn)者消費(fèi)者模型的實(shí)現(xiàn)

十三、用軟件工程和Java來敘述購物車(shopping cart)系統(tǒng)實(shí)現(xiàn)

十四、文件系統(tǒng)的幾個(gè)類:FileInputStream、FileOutputStream、FileReader、FileWriter的區(qū)別

十五、請(qǐng)寫出Java API中最常用的五個(gè)包,并且各舉兩個(gè)類加以說明。

十六、請(qǐng)問你在“電信運(yùn)營支撐系統(tǒng)”中遇到了哪些問題?你是怎么解決的?做這個(gè)項(xiàng)目你最大的收獲是什么?

十七、請(qǐng)說出幾個(gè)常用的異常類

答:NullpointException(空指針異常)

ClassNotFoundException(類找不到異常)

ClassCastException(類型轉(zhuǎn)換異常)

IllegalArgumentException(非法參數(shù)異常)

ArithmeticException(算術(shù)異常)

NumberFormatException(數(shù)據(jù)格式異常)

IndexOutOfBoundsException(數(shù)組下標(biāo)越界異常)

IllegalStateException(非法語句異常)

十八、什么是進(jìn)程和線程?兩者的區(qū)別是什么?

十九、請(qǐng)簡要描述一下你做的ShoppingCart項(xiàng)目。

二十、請(qǐng)問網(wǎng)絡(luò)7層協(xié)議,tcp/ip4 層協(xié)議是什么?

二十一、Java面向?qū)ο蟮乃拇筇攸c(diǎn)

二十二、public,private,protected,default訪問權(quán)限(可見性)

答:

public:全局可見

protected:繼承體系結(jié)構(gòu)之間可見

default(或不寫):同包可見

private:本類可見。

二十二、public,private,protected,default訪問權(quán)限(可見性)

答:

public:全局可見

protected:繼承體系結(jié)構(gòu)之間可見

default(或不寫):同包可見

private:本類可見。

二十三、名詞解釋

CRM

[Customer Relationship Management, 客戶關(guān)系管理] ERP

[Enterprise Resource Planning, 企業(yè)資源規(guī)劃] OSS

[Operation Support System, 運(yùn)營支撐系統(tǒng)] BSS

[Business Support System, 數(shù)據(jù)定義語言] BOSS

[Business Operation Support System, 數(shù)據(jù)定義語言] OA

[Office Automatization, 辦公自動(dòng)化] HTTP OOP SOA GUI DDL

[Data Definition Language, 數(shù)據(jù)定義語言] DML

[Data Manipulation Language, 數(shù)據(jù)操作語言]

WYSIWYG

所見即所得 [What You See is What You Get] CMP CMT B2B C2C B2C IDE DOM

Client/Server CMM ORM MIS MVC

MVC是Model-View-Controller的簡寫。“Model” 代表的是應(yīng)用的業(yè)務(wù)邏輯(通過JavaBean,EJB組件實(shí)現(xiàn)),“View” 是應(yīng)用的表示面(由JSP頁面產(chǎn)生),“Controller” 是提供應(yīng)用的處理過程控制(一般是一個(gè)Servlet),通過這種設(shè)計(jì)模型把應(yīng)用邏輯,處理過程和顯示邏輯分成不同的組件實(shí)現(xiàn)。這些組件可以進(jìn)行交互和重用。

OLE

CORBA

CORBA 標(biāo)準(zhǔn)是公共對(duì)象請(qǐng)求代理結(jié)構(gòu)(Common Object Request Broker Architecture),由對(duì)象管理組織(Object Management Group,縮寫為 OMG)標(biāo)準(zhǔn)化。它的組成是接口定義語言(IDL), 語言綁定(binding:也譯為聯(lián)編)和允許應(yīng)用程序間互操作的協(xié)議。其目的為:

用不同的程序設(shè)計(jì)語言書寫

在不同的進(jìn)程中運(yùn)行

為不同的操作系統(tǒng)開發(fā)。

UML

UML,標(biāo)準(zhǔn)建模語言,包含用例圖,靜態(tài)圖(包括類圖、對(duì)象圖和包圖),行為圖,交互圖(順序圖,合作圖),實(shí)現(xiàn)圖等。

XML CMMI JRE J2EE

J2EE是Sun公司提出的多層(multi-diered),分布式(distributed),基于組件(component-base)的企業(yè)級(jí)應(yīng)用模型(enterpriese application model).在這樣的一個(gè)應(yīng)用系統(tǒng)中,可按照功能劃分為不同的組件,這些組件又可在不同計(jì)算機(jī)上,并且處于相應(yīng)的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業(yè)信息系統(tǒng)(EIS)層。

JDK AOP OO

Container W3C JMS

Domain POJO JVM JNDI JTA SOAP

[Simple Object Access Protocol,簡單對(duì)象訪問協(xié)議] WSDL JDO

JDO是Java對(duì)象持久化的新的規(guī)范,為Java Data Object的簡稱,也是一個(gè)用于存取某種數(shù)據(jù)倉庫中的對(duì)象的標(biāo)準(zhǔn)化API。JDO提供了透明的對(duì)象存儲(chǔ),因此對(duì)開發(fā)人員來說,存儲(chǔ)數(shù)據(jù)對(duì)象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經(jīng)轉(zhuǎn)移到JDO產(chǎn)品提供商身上,使開發(fā)人員解脫出來,從而集中時(shí)間和精力在業(yè)務(wù)邏輯上。另外,JDO很靈活,因?yàn)樗梢栽谌魏螖?shù)據(jù)底層上運(yùn)行。JDBC只是面向關(guān)系數(shù)據(jù)庫(RDBMS)JDO更通用,提供到任何數(shù)據(jù)底層的存儲(chǔ)功能,比如關(guān)系數(shù)據(jù)庫、文件、XML以及對(duì)象數(shù)據(jù)庫(ODBMS)等等,使得應(yīng)用可移植性更強(qiáng)。

TDD DAO IoC

[Inversion of Control, 控制反轉(zhuǎn)] RMI DNS

[Internet Domain Name System, 因特網(wǎng)域名系統(tǒng)] URL URI

二十四、數(shù)據(jù)庫連接池的工作機(jī)制

二十五、互聯(lián)網(wǎng)提供哪些服務(wù)?

二十六、請(qǐng)寫出JSP的幾個(gè)隱含內(nèi)置對(duì)象

答:JSP中隱含內(nèi)置對(duì)象

名稱 類型

request javax.servlet.http.HttpServletRequest request

response javax.servlet.http.HttpServletResponse

注釋和范圍 response page javax.lang.Object page

Exception java.lang.Throwable page

pageContext javax.servlet.jsp.PageContext page

session javax.servlet.http.HttpSession session

application javax.servlet.ServletContext ServletContext out javax.servlet.jsp.JspWriter OutputStream

config javax.servlet.ServletConfig ServletConfig

JSP共有以下9種基本內(nèi)置組件(可與ASP的6種內(nèi)部組件相對(duì)應(yīng)):

request 用戶端請(qǐng)求,此請(qǐng)求會(huì)包含來自GET/POST請(qǐng)求的參數(shù)

response 網(wǎng)頁傳回用戶端的回應(yīng)

page JSP 網(wǎng)頁本身

exception 針對(duì)錯(cuò)誤網(wǎng)頁,未捕捉的例外

pageContext 網(wǎng)頁的屬性是在這里管理

session 與請(qǐng)求有關(guān)的會(huì)話期

application servlet 正在執(zhí)行的內(nèi)容

out 用來傳送回應(yīng)的輸出

config Servlet的構(gòu)架部件

二十七、請(qǐng)你談?wù)凷SH整合

答:SSH:

Struts(表示層)+Spring(業(yè)務(wù)層)+Hibernate(持久層)

Struts:

Struts是一個(gè)表示層框架,主要作用是界面展示,接收請(qǐng)求,分發(fā)請(qǐng)求。

在MVC框架中,Struts屬于VC層次,負(fù)責(zé)界面表現(xiàn),負(fù)責(zé)MVC關(guān)系的分發(fā)。(View:沿用JSP,HTTP,F(xiàn)orm,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action)

Hibernate:

Hibernate是一個(gè)持久層框架,它只負(fù)責(zé)與關(guān)系數(shù)據(jù)庫的操作。

Spring:

Spring是一個(gè)業(yè)務(wù)層框架,是一個(gè)整合的框架,能夠很好地黏合表示層與持久層。

二十八、應(yīng)用服務(wù)器與Web Server的區(qū)別

二十九、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()方法。

十、寫一個(gè)簡單的C/S結(jié)構(gòu)程序,Java 的通信編程,編程題(或問答),用JAVA SOCKET編程,讀服務(wù)器幾個(gè)字符,再寫入本地顯示?

答:Server端程序: package test;import java.net.*;import java.io.*;

public class Server { private ServerSocket ss;private Socket socket;private BufferedReader in;private PrintWriter out;public Server(){ try { ss=new ServerSocket(10000);while(true){ socket = ss.accept();String RemoteIP = socket.getInetAddress().getHostAddress();String RemotePort = “:”+socket.getLocalPort();System.out.println(“A client come in!IP:”+RemoteIP+RemotePort);in = new BufferedReader(new

InputStreamReader(socket.getInputStream()));String line = in.readLine();System.out.println(“Cleint send is :” + line);out = new PrintWriter(socket.getOutputStream(),true);out.println(“Your Message Received!”);out.close();in.close();socket.close();} }catch(IOException e){ out.println(“wrong”);} } public static void main(String[] args){ new Server();} };Client端程序: package test;import java.io.*;import java.net.*;

public class Client { Socket socket;BufferedReader in;PrintWriter out;public Client(){ try { System.out.println(“Try to Connect to 127.0.0.1:10000”);socket = new Socket(“127.0.0.1”,10000);System.out.println(“The Server Connected!”);System.out.println(“Please enter some Character:”);BufferedReader line = new BufferedReader(new

InputStreamReader(System.in));out = new PrintWriter(socket.getOutputStream(),true);out.println(line.readLine());in = new BufferedReader(new InputStreamReader(socket.getInputStream()));System.out.println(in.readLine());out.close();in.close();socket.close();}catch(IOException e){ out.println(“Wrong”);} } public static void main(String[] args){ new Client();} };

第五篇:軟件工程師筆試

一。填空

1在UNIX中用(cp)把A目錄下的F文件考貝到B目錄下

2在UNIX中用(find)找到但前目錄中的MOBILE文件

3在UNIX中-rxw。。其中的x是什么意思 執(zhí)行

4軟件工程包括幾個(gè)部分,每個(gè)叫什么

需求分析,系統(tǒng)設(shè)計(jì),編程實(shí)現(xiàn),測試,維護(hù)

5白盒測試又叫做(結(jié)構(gòu)化測試,基于代碼的測試)

二。選擇

一些對(duì)軟件測試看法的選擇

三。編程

1。關(guān)于SQL的告訴你一些學(xué)生的成績,所學(xué)科目,學(xué)號(hào)等等

要求a。編寫程序?qū)⒖颇烤幪?hào)為×××的成績?cè)黾印痢练?/p>

update student

set score = score + x

b。列出所有學(xué)生的班號(hào),學(xué)號(hào),所學(xué)科目等

selcet classno studyno course

from student

c。列出成績高于80分的學(xué)生班號(hào),學(xué)號(hào)等

select studyno classno

from student

where score > 80

2。關(guān)于C++中的引用

引用增加40,要求寫出輸出結(jié)果

引用所指向的變量增加60,要求寫輸出結(jié)果

四問答

1。如果你是測試人員你對(duì)客戶需求的理解與開發(fā)人員不同,發(fā)生爭執(zhí),主管來調(diào)解,要求你寫一份書面報(bào)告給主管看

2。用英語寫出來你適合這個(gè)職位的character

responsibility smart action focus fast study smart

3。有三條邊,在不同的情況下分別組成等邊三角形,等腰三角形,普通三角形,不組成三角形要求寫出測試用例

4。寫出你對(duì)軟件測試的看法和理解,你是怎么以軟件測試作為自己將來職業(yè)規(guī)劃的1.首先是五道判斷題,具體忘記了,我只對(duì)了三道。

記得的考點(diǎn)有1)JAVA變量名字的合法性,好像是$number是不是合法的2)在linux下查看隱藏文件的命令,ls –a

2.然后是十幾道單選題,考點(diǎn)有數(shù)據(jù)庫的范式,白盒測試,瀑布模型有什么缺點(diǎn),面向?qū)ο蟮幕局R(shí),軟件工程的基本知識(shí),LINUX的基本命令(都是很基本的知識(shí))

3.動(dòng)物都有咬的動(dòng)作,其中貓和狗咬人的動(dòng)作又有各自的特點(diǎn),用面向?qū)ο蟮亩鄳B(tài)性來描述cat 和 dog 的 bit(JAVA 或 C++)

4.給出一段代碼,請(qǐng)指出錯(cuò)誤。具體代碼忘記了,是考數(shù)組、數(shù)組指針的不同,還有傳參的方法(做錯(cuò)了)

5.寫出以下代碼的輸出

#define AREA(a,b)a+b

#include

void main()

{

cout<

}

6.寫出以下代碼的輸出(代碼忘記了,但是在C++的課本上有類似的題,考指針、引用的,如下)

#include

void main()

{

int a = 100;

int *b;

b= &a;

cout<<*b<

a += 20;

cout<

cout<<*b<

*b += 20;

cout<

cout<<*b<

}

7.一道簡單的計(jì)算題,移動(dòng)的話費(fèi)周一到周五9:00-23:00 1元/分鐘,周一到周五 23:00 – 9:00 0.5元一分鐘,周六周日全天0.8元/分鐘,節(jié)日全天0.7元/分鐘,小明9月30日晚上23:59:05 至第二天的 00:01:15,請(qǐng)問話費(fèi)是多少?(不足一分鐘按一分鐘算,如有重合,按最低的優(yōu)惠算)

8.智力題。一根材質(zhì)不均的繩子,從頭燒到尾要一個(gè)小時(shí),給你若干跟一模一樣的繩子,用燒繩子的方法計(jì)時(shí)一個(gè)小時(shí)十五分鐘。找出使用繩子最少的方法。

9.寫一篇英文文章,200+,描述大學(xué)生活中印象最深刻的一件事

10.職業(yè)生涯規(guī)劃的目標(biāo)是什么?如何實(shí)現(xiàn)?在今后3-5年的目標(biāo)是什么?

下載最新葵花寶典.Java軟件工程師筆試面試必備(定稿)word格式文檔
下載最新葵花寶典.Java軟件工程師筆試面試必備(定稿).doc
將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
點(diǎn)此處下載文檔

文檔為doc格式


聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

相關(guān)范文推薦

    java工程師面試

    精通java語言及面向?qū)ο笏枷?具有扎實(shí)的java編程基礎(chǔ)和良好的編程規(guī)范 精通 jsp語言 html語言 javascript腳本以及css 樣式 熟練掌握sqlserver oracle 數(shù)據(jù)庫熟練使用Spring......

    java軟件工程師面試試題集2

    第1 頁共59 頁 面試題集 面試題集共分為以下十個(gè)部分: 一、Core Java: 1 — 95 題1 — 24 頁 基礎(chǔ)及語法: 1 — 61 題1 — 13 頁 異常: 62 — 69 題13 — 15 頁 集合: 70 — 80......

    java軟件工程師前途

    java軟件工程師前途 java軟件工程師前途,3G的來臨,目前我國對(duì)軟件人才的需要已達(dá)到了百萬,并且每年在以30%的速率在增加。合格軟件人才的需求供給不足。其中以java軟件開發(fā)人才......

    JAVA軟件工程師個(gè)人簡歷—####

    個(gè)人簡歷 性別: 女 工作年限: 2年戶籍:湖南長沙 電子郵箱: 281282125@qq.com 個(gè)人信息 姓名: 年齡: 24 居 住 地: 天津 手機(jī)號(hào)碼: 086-5462825 教育經(jīng)歷 2003/9-2007/6 湖......

    java軟件工程師就業(yè)(推薦)

    java軟件工程師就業(yè) java軟件工程師就業(yè),java作為唯一在互聯(lián)網(wǎng)上開發(fā)的語言,java平臺(tái)以及移動(dòng)性、安全性和開放性受到了追捧。Java成為成長最快的語言之一,java受到了全世界IT......

    java軟件工程師英文簡歷

    java軟件工程師英文簡歷模板 Personal information: Name: Guoqing Feng (you have a good selection of the staff)Sex: MaleAge: 21 National: Hanorigin: Handan in Hebe......

    Java軟件工程師簡歷

    個(gè)人簡歷 ×× 聯(lián)系電話: 138******** 聯(lián)系郵箱:****@126.com 擇業(yè)目標(biāo)Java軟件工程師 基于Oracle數(shù)據(jù)庫MySql數(shù)據(jù)庫、Web應(yīng)用的Java軟件開發(fā)。 專業(yè)技能?精通Java,非常扎實(shí)的......

    Java軟件工程師個(gè)人簡歷

    Java軟件工程師個(gè)人簡歷 Java軟件工程師個(gè)人簡歷1 姓名:目前所在: 天河區(qū)年齡: 24戶口所在: 汕尾國籍: 中國婚姻狀況: 未婚民族: 漢族身高: 176 cm體重: 60 kg求職意向人才類型: 不限......

主站蜘蛛池模板: 伊人久久大香线蕉av色婷婷色| 亚洲a∨无码自慰专区| 亚洲日韩国产欧美一区二区三区| 中文字幕av中文字无码亚| 伊人色综合视频一区二区三区| 妺妺窝人体色www在线观看| 日韩人妻无码精品系列专区| 亚洲精品电影院| 国产在线亚州精品内射| 国产av仑乱内谢| 国产精品国产成人国产三级| 玩弄人妻少妇精品视频| 精品性影院一区二区三区内射| 无码精品久久一区二区三区| 美女裸体自慰在线观看| 精品精品国产欧美在线小说区| 强奷乱码欧妇女中文字幕熟女| 免费高清欧美一区二区三区| 国产av亚洲精品久久久久久| 欧洲熟妇色xxxx欧美老妇多毛| 国产精品原创巨作av女教师| 无码中文av有码中文av| 88国产精品欧美一区二区三区| 精品无码一区二区三区| 日韩人妻精品无码一区二区三区| 亚洲欧美日韩成人综合网| 色欲色香天天天综合网站免费| 欧美另类 自拍 亚洲 图区| 又黄又爽又色视频| 国产精品爱啪在线播放| 天天躁夜夜躁天干天干2020| 婷婷六月亚洲中文字幕| 日本动态120秒免费| 波多野结衣绝顶大高潮| 四川老熟女下面又黑又肥| 五月丁香六月激情综合在线视频| 国产精品无码永久免费不卡| 国产美女裸体无遮挡免费视频高潮| 国产精品香蕉在线观看| 4438xx亚洲最大五色丁香| 国产在线无遮挡免费观看|