欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      應(yīng)聘Java,jsp,j2ee軟件工程師筆試中可能出現(xiàn)的問

      時(shí)間:2019-05-13 12:42:07下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《應(yīng)聘Java,jsp,j2ee軟件工程師筆試中可能出現(xiàn)的問》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《應(yīng)聘Java,jsp,j2ee軟件工程師筆試中可能出現(xiàn)的問》。

      第一篇:應(yīng)聘Java,jsp,j2ee軟件工程師筆試中可能出現(xiàn)的問

      相信大家應(yīng)聘的時(shí)候第一關(guān)就是筆試,即使是一位很有經(jīng)驗(yàn)的工程師也不一定能夠順利通過,筆試不好,可能就無法進(jìn)行面試,即使能夠進(jìn)行面試,考官對(duì)你的印象也不會(huì)很好,問的問題也會(huì)很多,估計(jì)很難吃的消,當(dāng)然如果你是位很有經(jīng)驗(yàn)的高手,也是有可能通過面試,但也會(huì)影響到你的待遇.有可能有人會(huì)問,如果你真是個(gè)有一定開發(fā)經(jīng)驗(yàn)的java工程師,怎么可能通不過筆試,其實(shí)這種可能性是存在的,而且很大,因?yàn)楣P試的題目一般都很基礎(chǔ),有一些都是你平時(shí)不曾注意到的,可能你在開發(fā)中用到過,但不一定知道是什么,比如說:寫jsp的肯定都用到過out,request等但不一定知道它們叫jsp的內(nèi)置對(duì)象,如果考題問你:jsp的內(nèi)置對(duì)象有哪些,你就不一定答的上來,再比如說:在開發(fā)javabean的時(shí)候一般都會(huì)用到ArrayList,HashMap等,但你不一定就知道

      ArrayList和Vector的區(qū)別,HashMap和Hashtable的區(qū)別,可能你在開發(fā)中都是混用,也不會(huì)報(bào)錯(cuò),但效率會(huì)大大降低,如果在多線程開發(fā)中混用,可能就會(huì)產(chǎn)生錯(cuò)誤.可能這些都是小問題,如果有一定基礎(chǔ),看看書就知道所以然了,但筆試中答不上來或答錯(cuò)就可能影響到你是否能夠面試成功,如果面試公司是你非常想進(jìn)的公司,因?yàn)檫@些細(xì)節(jié)問題而最終沒能進(jìn)去,豈不是很遺憾.我寫這篇文章就是讓大部分的人少一份遺憾,多一份面試成功后的喜悅,也許有人會(huì)問:你才工作幾年啊,就在這里作總結(jié),你說的問題在筆試中可能出現(xiàn)嗎?我要說的是我工作時(shí)間的確很短(2002年畢業(yè)),但大大小小的公司也面試了不少,有時(shí)候就是因?yàn)檫@些筆試上的小問題而沒能進(jìn)想進(jìn)的公司,結(jié)果我自己總結(jié)了一下面試的得與失,重新看了看基礎(chǔ)知識(shí),結(jié)果成功應(yīng)聘在一家很大的公司,拿著相同工作經(jīng)驗(yàn)的比較高的工資,之所以我花時(shí)間要在這里總結(jié),目的就是為了大家能進(jìn)自己想進(jìn)的公司,拿到自己要求的工資.也許這些總結(jié)比幾篇技術(shù)文章帶給你的收獲都大,因?yàn)樗苯雍湍愕睦?前途掛鉤.本文適用于有一定開發(fā)能力但java,j2ee基礎(chǔ)欠扎實(shí)而又在找Java,jsp,j2ee開發(fā),維護(hù)方面工作的朋友,如果你的時(shí)間充足建議還是全面的看看基礎(chǔ)知識(shí),如果時(shí)間緊張可以側(cè)重看一下我下面列舉出來的問題,最好能由點(diǎn)到面的看.好了,閑話不多說了,下面列舉我筆試中遇到過的問題,以及這些問題的延伸,問題都比較基礎(chǔ),答案就不在這里說了,查查資料,看看書就能解決,我在此鄭重聲明:不是說懂了下面的問題就一定能夠面試成功,就是什么高手了,就不用看書了,我的總結(jié)只是提高你筆試的成功率,在你基礎(chǔ)不是很扎實(shí),時(shí)間很緊的情況下幫助你成功筆試.切記:它不是萬能的.Java基礎(chǔ)方面:

      1,作用域public,protected,private,以及不寫時(shí)的區(qū)別

      2,ArrayList和Vector的區(qū)別,HashMap和Hashtable的區(qū)別

      3,char型變量能不能定義為一個(gè)中文?為什么?可以

      4,多線程有幾種表示方法,都是什么?同步有幾種實(shí)現(xiàn)方法,都是什么?

      5,繼承時(shí)候類的執(zhí)行順序問題,一般都是選擇題,問你將會(huì)打印出什么?

      6,內(nèi)部類的實(shí)現(xiàn)方式?

      7,垃圾回收機(jī)制,如何優(yōu)化程序?

      8,float型float f=3.4是否正確?

      Jsp方面

      1,jsp有哪些內(nèi)置對(duì)象?作用分別是什么?

      2,jsp有哪些動(dòng)作?作用分別是什么?

      3,include的兩種實(shí)現(xiàn)方式的區(qū)別?

      4,兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別?

      Servlet方面

      1,說一說Servlet的生命周期?

      2,Servlet版本間(忘了問的是哪兩個(gè)版本了)的不同?

      Jdbc,Jdo方面

      1,可能會(huì)讓你寫一段Jdbc連Oracle的程序.2,Class.forName的作用?為什么要用?

      3,Jdo是什么?

      Xml方面

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

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

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

      EJB方面

      1,EJB2.0有哪些內(nèi)容?分別用在什么場(chǎng)合? EJB2.0和EJB1.1的區(qū)別?

      MVC方面

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

      設(shè)計(jì)模式方面:

      1,開發(fā)中都用到了那些設(shè)計(jì)模式?用在什么場(chǎng)合?

      JavaScript方面

      1,如何校驗(yàn)數(shù)字型?

      CORBA

      1,CORBA是什么?用途是什么?

      以上就是我的總結(jié),可能不是全部,因?yàn)闀r(shí)間問題,如果能夠記起來,我會(huì)再加上,有些問題描述的可能不準(zhǔn)確,希望大家批評(píng)指正,問題都很基礎(chǔ),即使不知道,花上一點(diǎn)時(shí)間查找(csdn/java版)就能弄懂,希望對(duì)正在找工作的朋友有所幫助,有所提醒.一份正確率很高的筆試卷可能會(huì)為你的面試減輕負(fù)擔(dān),少問不少問題.當(dāng)然我還是要提醒從事軟件開發(fā),維護(hù)工作的朋友們要重視基礎(chǔ),善于總結(jié)和比較,對(duì)什么都能追根究底.

      第二篇:最新葵花寶典.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語(yǔ)句能否作用在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、下面這條語(yǔ)句一共創(chuàng)建了多少個(gè)對(duì)象:String s=“a”+“b”+“c”+“d”;.....................................16

      38、try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(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ī)制的簡(jiǎn)單原理和應(yīng)用。..........................................................19

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

      45、JAVA語(yǔ)言如何進(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、簡(jiǎn)述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)簡(jiǎn)單描述。............................................................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)換成中國(guó)傳統(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、頁(yè)面間對(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),分開;然后可選擇升或者降序排序;按提交鍵就在另一頁(yè)面顯示按什么排序,結(jié)果為,提供reset...........................................................................................65 五.數(shù)據(jù)庫(kù)部分...........................................................................................65

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

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

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

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

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

      6、union和union all有什么不同?.....................................................................69 7.分頁(yè)語(yǔ)句..........................................................................................70 8.用一條SQL語(yǔ)句 查詢出每門課都大于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ù)庫(kù)中有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ù)量下的分頁(yè)解決方法。......................................................................81

      27、用 JDBC 查詢學(xué)生成績(jī)單, 把主要代碼寫出來(考試概率極大)........................................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、簡(jiǎn)述 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ì)模式?用在什么場(chǎng)合?.........................................................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)行解釋(或簡(jiǎ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è)簡(jiǎn)單的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、簡(jiǎn)要講一下 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、簡(jiǎn)述邏輯操作(&,|,^)與條件操作(&&,||)的區(qū)別。.....................................................94 十二.其他...............................................................................................94

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

      2、請(qǐng)把 http://tomcat.apache.org/ 首頁(yè)的這一段話用中文翻譯一下?.....................................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ǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)法,集合的語(yǔ)法,io 的語(yǔ)法,虛擬機(jī)方面的語(yǔ)法。

      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ì)增長(zhǎng),If(x==33 && ++y>0)不會(huì)增長(zhǎng)

      &還可以用作位運(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)語(yǔ)句前定義一個(gè)標(biāo)號(hào),然后在里層循環(huán)體的代碼中使用帶有標(biāo)號(hào)的break 語(yǔ)句,即可跳出外層循環(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語(yǔ)句能否作用在byte上,能否作用在long上,能否作用在String上? 在switch(condition)中,condition只能是一個(gè)整數(shù)表達(dá)式或者枚舉常量(更大字體),整數(shù)表達(dá)式可以是int基本類型或Integer包裝類型,由于,byte,short,char都可以隱式轉(zhuǎn)換為int,所以,這些類型以及這些類型的包裝類型也是可以的。顯然,long和String類型都不符合switch的語(yǔ)法規(guī)定,并且不能被隱式轉(zhuǎn)換成int類型,所以,它們不能作用于swtich語(yǔ)句中。

      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語(yǔ)言規(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類的源碼。面試的人也知道誰(shuí)都不可能在短時(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è)性、英語(yǔ)水平等多個(gè)方面的體現(xiàn),會(huì)給人留下很好的印象,在編程能力和其他方面條件差不多的情況下,英語(yǔ)好除了可以使你獲得更多機(jī)會(huì)外,薪水可以高出一千元。

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

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

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

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

      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è)人的長(zhǎng)相是否相同,它比較的兩個(gè)對(duì)象是獨(dú)立的。例如,對(duì)于下面的代碼:

      String a=new String(”foo“);String b=new String(”foo“);兩條new語(yǔ)句創(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ū)別?

      在語(yǔ)法定義上的區(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á)出沒有參加考試和考試成績(jī)?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語(yǔ)言的設(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(yǔ)言有封裝、繼承、抽象、多態(tài)等4個(gè)主要的特征。

      1封裝:

      封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實(shí)現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來的變動(dòng)影響。在面向?qū)ο蟮木幊陶Z(yǔ)言中,對(duì)象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語(yǔ)言的封裝更為清晰、更為有力。面向?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。

      下面比較一下兩者的語(yǔ)法區(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ì)模式。

      備注:這道題的思路是先從總體解釋抽象類和接口的基本概念,然后再比較兩者的語(yǔ)法細(xì)節(jié),最后再說兩者的應(yīng)用區(qū)別。比較兩者語(yǔ)法細(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)的編程語(yǔ)言實(shí)現(xiàn)的,不存在著被子類實(shí)現(xiàn)的問題,所以,它也不能是抽象的,不能與abstract混用。例如,F(xiàn)ileOutputSteam類要硬件打交道,底層的實(shí)現(xiàn)用的是操作系統(tǒng)相關(guān)的api實(shí)現(xiàn),例如,在windows用c語(yǔ)言實(shí)現(xiàn)的,所以,查看jdk 的源代碼,可以發(fā)現(xiàn)FileOutputStream的open方法的定義如下:

      private native void open(String name)throws FileNotFoundException;如果我們要用java調(diào)用別人寫的c語(yǔ)言函數(shù),我們是無法直接調(diào)用的,我們需要按照java的要求寫一個(gè)c語(yǔ)言的函數(shù),又我們的這個(gè)c語(yǔ)言函數(shù)去調(diào)用別人的c語(yǔ)言函數(shù)。由于我們的c語(yǔ)言函數(shù)是按java的要求來寫的,我們這個(gè)c語(yǔ)言函數(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語(yǔ)言的全局變量,而內(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)部還可以采用如下語(yǔ)法來創(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í)的語(yǔ)法上有一些差別,它可以定義成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,那么可以使用如下語(yǔ)句創(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í),例如,幾種定義方式的語(yǔ)法區(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)類庫(kù)中的類都是不可變的。在開發(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)類庫(kù)還提供了一個(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、下面這條語(yǔ)句一共創(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“);第一條語(yǔ)句打印的結(jié)果為false,第二條語(yǔ)句打印的結(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語(yǔ)句,那么緊跟在這個(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語(yǔ)句調(diào)用的函數(shù)先于finally中調(diào)用的函數(shù)執(zhí)行,也就是說return語(yǔ)句先執(zhí)行,finally語(yǔ)句后執(zhí)行,所以,返回的結(jié)果是2。Return并不是讓函數(shù)馬上返回,而是return語(yǔ)句執(zhí)行后,將把返回結(jié)果放置進(jìn)函數(shù)棧中,此時(shí)函數(shù)并不是馬上返回,它要執(zhí)行finally語(yǔ)句后才真正開始返回。

      在講解答案時(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語(yǔ)句后執(zhí)行

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

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

      finally是異常處理語(yǔ)句結(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ī)制的簡(jiǎn)單原理和應(yīng)用。

      異常是指java程序運(yùn)行時(shí)(非編譯)所發(fā)生的非正常情況或錯(cuò)誤,與現(xiàn)實(shí)生活中的事件很相似,現(xiàn)實(shí)生活中的事件可以包含事件發(fā)生的時(shí)間、地點(diǎn)、人物、情節(jié)等信息,可以用一個(gè)對(duì)象來表示,Java使用面向?qū)ο蟮姆绞絹硖幚懋惓?,它把程序中發(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。

      這道題主要考你的代碼量到底多大,如果你長(zhǎng)期寫代碼的,應(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語(yǔ)言如何進(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方法的線程可以去參與獲得鎖的競(jìng)爭(zhēng)了,但不是馬上得到鎖,因?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)很長(zhǎng)時(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ì)象的鎖,而是讓它們競(jìng)爭(zhēng)。

      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語(yǔ)句時(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、簡(jiǎn)述synchronized和java.util.concurrent.locks.Lock的異同 ?

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

      主要不同點(diǎn):Lock有比synchronized更精確的線程語(yǔ)義和更好的性能。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)于定義了控制該誰(shuí)執(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ā)庫(kù)來實(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ā)揮題,天南海北誰(shuí)便談,只要讓別覺得你知識(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ù)增長(zhǎng): 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)增長(zhǎng)為原來兩倍,而ArrayList的增長(zhǎng)策略在文檔中沒有明確規(guī)定(從源代碼看到的是增長(zhǎng)為原來的1.5倍)。ArrayList與Vector都可以設(shè)置初始的空間大小,Vector還可以設(shè)置增長(zhǎng)的空間大小,而ArrayList沒有提供設(shè)置增長(zhǎng)空間的方法。

      總結(jié):即Vector增長(zhǎng)原來的一倍,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

      } 還有一種簡(jiǎn)單的方式,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)?,我只要在eclispe下按點(diǎn)操作符,很自然的這些方法就出來了。我記住的一些思想就是List類會(huì)有g(shù)et(int index)這樣的方法,因?yàn)樗梢园错樞蛉≡?,而set類中沒有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ì)于“中國(guó)”這些字符,首先要得到其對(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 = ”中國(guó)人“;/*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)測(cè)對(duì)象是否超過作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語(yǔ)言沒有提供釋放已分配內(nèi)存的顯示操作方法。

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

      Java語(yǔ)言中一個(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)死亡的或者長(zhǎng)時(shí)間沒有使用的對(duì)象進(jìn)行清楚和回收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收?;厥諜C(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語(yǔ)言規(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ā)語(yǔ)言中都支持這種機(jī)制。在實(shí)現(xiàn)中,assertion就是在程序中的一條語(yǔ)句,它對(duì)一個(gè)boolean表達(dá)式進(jìn)行檢查,一個(gè)正確程序必須保證這個(gè)boolean表達(dá)式的值為true;如果該值為false,說明程序已經(jīng)處于不正確的狀態(tài)下,assert將給出警告或退出。一般來說,assertion用于保證程序最基本、關(guān)鍵的正確性。assertion檢查通常在開發(fā)和測(cè)試時(shí)開啟。為了提高性能,在軟件發(fā)布后,assertion檢查通常是關(guān)閉的。package com.huawei.interview;

      public class AssertTest {

      }

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

      所謂內(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)存泄露的情況:長(zhǎng)生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄露,盡管短生命周期對(duì)象已經(jīng)不再需要,但是因?yàn)殚L(zhǎng)生命周期對(duì)象持有它的引用而導(dǎo)致不能被回收,這就是java中內(nèi)存泄露的發(fā)生場(chǎng)景,通俗地說,就是程序員可能創(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ì)象被長(zhǎng)期引用了,即使那個(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)該很簡(jiǎn)單,假如堆棧加了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è)明確的值??梢孕薷臑椤眆inal 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ò)??瓷先ピ趍ain里call doSomething沒有什么問題,畢竟兩個(gè)methods都在同一個(gè)class里。但仔細(xì)看,main是static的。static method不能直接call non-static methods??筛某伞盨ystem.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ò)?!眎nterface 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)做做這道題,找工作必須能編寫這些簡(jiǎn)單問題的代碼?。?/p>

      答: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 = “中國(guó)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中國(guó)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)

      }-----------------又一次臨場(chǎng)寫的代碼---------------------------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元是誰(shuí)捐的()?!?分】

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

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

      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)行的語(yǔ)言。(提示:填編譯或者解釋)【1分】

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

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

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

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

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

      7.Java程序控制語(yǔ)句中的循環(huán)語(yǔ)法分________,________和________三種?!?分】

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

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

      10.AJAX的核心對(duì)象是_____________?!?分】

      指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)中那些語(yǔ)句片段會(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)中,合法的賦值語(yǔ)句是()【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)部類)?有什么限制?!?/p>

      3.forward 和redirect的區(qū)別?!?分】

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

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

      5.頁(yè)面間對(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)成績(jī)表:score(學(xué)號(hào):stuNO,課程號(hào):couNo,成績(jī):score)

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

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

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

      4)查出‘計(jì)算機(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è)簡(jiǎn)單的實(shí)現(xiàn)冒泡排序的算法【10分】

      JAVA軟件工程師筆試試題

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

      JAVA軟件工程師筆試試題

      第四篇:Java筆試可能出現(xiàn)問題及答案之J2EE-JAVA程序員JAVA工程師面試必看

      -JAVA程序員JAVA工程師面試必看

      Java筆試可能出現(xiàn)問題及答案之J2EE,MVC方面(轉(zhuǎn)載)(連載)

      J2EE,MVC方面

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

      答:MVC是Model-View-Controller的簡(jiǎn)寫?!癕odel” 代表的是應(yīng)用的業(yè)務(wù)邏輯(通過JavaBean,EJB組件實(shí)現(xiàn)),“View” 是應(yīng)用的表示面(由JSP頁(yè)面產(chǎn)生),“Controller” 是提供應(yīng)用的處理過程控制(一般是一個(gè)Servlet),通過這種設(shè)計(jì)模型把應(yīng)用邏輯,處理過程和顯示邏輯分成不同的組件實(shí)現(xiàn)。這些組件可以進(jìn)行交互和重用。

      115、J2EE是什么?

      答:Je22是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)層。

      116、WEB SERVICE名詞解釋。JSWDL開發(fā)包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。答:Web Service描述語(yǔ)言WSDL

      SOAP即簡(jiǎn)單對(duì)象訪問協(xié)議(Simple Object Access Protocol),它是用于交換XML編碼信息的輕量級(jí)協(xié)議。UDDI 的目的是為電子商務(wù)建立標(biāo)準(zhǔn);UDDI是一套基于Web的、分布式的、為Web Service提供的、信息注冊(cè)中心的實(shí)現(xiàn)標(biāo)準(zhǔn)規(guī)范,同時(shí)也包含一組使企業(yè)能將自身提供的Web Service注冊(cè),以使別的企業(yè)能夠發(fā)現(xiàn)的訪問協(xié)議的實(shí)現(xiàn)標(biāo)準(zhǔn)。

      117、J2EE是技術(shù)還是平臺(tái)還是框架?

      答:J2EE本身是一個(gè)標(biāo)準(zhǔn),一個(gè)為企業(yè)分布式應(yīng)用的開發(fā)提供的標(biāo)準(zhǔn)平臺(tái)。

      J2EE也是一個(gè)框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術(shù)。

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

      答:Struts是采用Java Servlet/JavaServer Pages技術(shù),開發(fā)Web應(yīng)用程序的開放源碼的framework。采用Struts能開發(fā)出基于MVC(Model-View-Controller)設(shè)計(jì)模式的應(yīng)用構(gòu)架。Struts有如下的主要功能:

      一.包含一個(gè)controller servlet,能將用戶的請(qǐng)求發(fā)送到相應(yīng)的Action對(duì)象。

      二.JSP自由tag庫(kù),并且在controller servlet中提供關(guān)聯(lián)支持,幫助開發(fā)員創(chuàng)建交互式表單應(yīng)用。

      三.提供了一系列實(shí)用對(duì)象:XML處理、通過Java reflection APIs自動(dòng)處理JavaBeans屬性、國(guó)際化的提示和消息。

      119、WEB SERVICE名詞解釋。JSWDL開發(fā)包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。答:Web ServiceWeb Service是基于網(wǎng)絡(luò)的、分布式的模塊化組件,它執(zhí)行特定的任務(wù),遵守具體的技術(shù)規(guī)范,這些規(guī)范使得Web Service能與其他兼容的組件進(jìn)行互操作。

      JAXP(Java API for XML Parsing)定義了在Java中使用DOM, SAX, XSLT的通用的接口。這樣在你的程序中你只要使用這些通用的接口,當(dāng)你需要改變具體的實(shí)現(xiàn)時(shí)候也不需要修改代碼。

      JAXM(Java API for XML Messaging)是為SOAP通信提供訪問方法和傳輸機(jī)制的API。

      WSDL是一種 XML 格式,用于將網(wǎng)絡(luò)服務(wù)描述為一組端點(diǎn),這些端點(diǎn)對(duì)包含面向文檔信息或面向過程信息的消息進(jìn)行操作。這種格式首先對(duì)操作和消息進(jìn)行抽象描述,然后將其綁定到具體的網(wǎng)絡(luò)協(xié)議和消息格式上以定義端點(diǎn)。相關(guān)的具體端點(diǎn)即組合成為抽象端點(diǎn)(服務(wù))。

      SOAP即簡(jiǎn)單對(duì)象訪問協(xié)議(Simple Object Access Protocol),它是用于交換XML編碼信息的輕量級(jí)協(xié)議。UDDI 的目的是為電子商務(wù)建立標(biāo)準(zhǔn);UDDI是一套基于Web的、分布式的、為Web Service提供的、信息注冊(cè)中心的實(shí)現(xiàn)標(biāo)準(zhǔn)規(guī)范,同時(shí)也包含一組使企業(yè)能將自身提供的Web Service注冊(cè),以使別的企業(yè)能夠發(fā)現(xiàn)的訪問協(xié)議的實(shí)現(xiàn)標(biāo)準(zhǔn)。

      120、C/S 與 B/S 區(qū)別:

      答:有如下八個(gè)方面的不同:

      1.硬件環(huán)境不同:

      C/S 一般建立在專用的網(wǎng)絡(luò)上, 小范圍里的網(wǎng)絡(luò)環(huán)境, 局域網(wǎng)之間再通過專門服務(wù)器提供連接和數(shù)據(jù)交換服務(wù).B/S 建立在廣域網(wǎng)之上的, 不必是專門的網(wǎng)絡(luò)硬件環(huán)境,例與電話上網(wǎng), 租用設(shè)備.信息自己管理.有比C/S更強(qiáng)的適應(yīng)范圍, 一般只要有操作系統(tǒng)和瀏覽器就行

      2.對(duì)安全要求不同

      C/S 一般面向相對(duì)固定的用戶群, 對(duì)信息安全的控制能力很強(qiáng).一般高度機(jī)密的信息系統(tǒng)采用C/S 結(jié)構(gòu)適宜.可以通過B/S發(fā)布部分可公開信息.B/S 建立在廣域網(wǎng)之上, 對(duì)安全的控制能力相對(duì)弱, 可能面向不可知的用戶。

      3.對(duì)程序架構(gòu)不同

      C/S 程序可以更加注重流程, 可以對(duì)權(quán)限多層次校驗(yàn), 對(duì)系統(tǒng)運(yùn)行速度可以較少考慮.B/S 對(duì)安全以及訪問速度的多重的考慮, 建立在需要更加優(yōu)化的基礎(chǔ)之上.比C/S有更高的要求 B/S結(jié)構(gòu)的程序架構(gòu)是發(fā)展的趨勢(shì), 從MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持網(wǎng)絡(luò)的構(gòu)件搭建的系統(tǒng).SUN 和IBM推的JavaBean 構(gòu)件技術(shù)等,使 B/S更加成熟.4.軟件重用不同

      C/S 程序可以不可避免的整體性考慮, 構(gòu)件的重用性不如在B/S要求下的構(gòu)件的重用性好.B/S 對(duì)的多重結(jié)構(gòu),要求構(gòu)件相對(duì)獨(dú)立的功能.能夠相對(duì)較好的重用.就入買來的餐桌可以再利用,而不是做在墻上的石頭桌子

      5.系統(tǒng)維護(hù)不同

      C/S 程序由于整體性, 必須整體考察, 處理出現(xiàn)的問題以及系統(tǒng)升級(jí).升級(jí)難.可能是再做一個(gè)全新的系統(tǒng)

      B/S 構(gòu)件組成,方面構(gòu)件個(gè)別的更換,實(shí)現(xiàn)系統(tǒng)的無縫升級(jí).系統(tǒng)維護(hù)開銷減到最小.用戶從網(wǎng)上自己下載安裝就可以實(shí)現(xiàn)升級(jí).6.處理問題不同

      C/S 程序可以處理用戶面固定, 并且在相同區(qū)域, 安全要求高需求, 與操作系統(tǒng)相關(guān).應(yīng)該都是相同的系統(tǒng)

      B/S 建立在廣域網(wǎng)上, 面向不同的用戶群, 分散地域, 這是C/S無法作到的.與操作系統(tǒng)平臺(tái)關(guān)系最小.7.用戶接口不同

      C/S 多是建立的Window平臺(tái)上,表現(xiàn)方法有限,對(duì)程序員普遍要求較高

      B/S 建立在瀏覽器上, 有更加豐富和生動(dòng)的表現(xiàn)方式與用戶交流.并且大部分難度減低,減低開發(fā)成本.8.信息流不同

      C/S 程序一般是典型的中央集權(quán)的機(jī)械式處理, 交互性相對(duì)低

      B/S 信息流向可變化, B-B B-C B-G等信息、流向的變化, 更像交易中心。

      121、什么是web容器

      答:給處于其中的應(yīng)用程序組件(JSP,SERVLET)提供一個(gè)環(huán)境,使JSP,SERVLET直接更容器中的環(huán)境變量接**互,不必關(guān)注其它系統(tǒng)問題。主要有WEB服務(wù)器來實(shí)現(xiàn)。例如:

      TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴(yán)格遵守J2EE規(guī)范中的WEB APPLICATION 標(biāo)準(zhǔn)。我們把遵守以上標(biāo)準(zhǔn)的WEB服務(wù)器就叫做J2EE中的WEB容器。122、什么是EJB容器

      答:Enterprise java bean 容器。更具有行業(yè)領(lǐng)域特色。他提供給運(yùn)行在其中的組件EJB各種管理功能。只要滿足J2EE規(guī)范的EJB放入該容器,馬上就會(huì)被容器進(jìn)行高效率的管理。并且可以通過現(xiàn)成的接口來獲得系統(tǒng)級(jí)別的服務(wù)。例如郵件服務(wù)、事務(wù)管理

      123、什么是JNDI

      答:(Java Naming & Directory Interface)JAVA命名目錄服務(wù)。主要提供的功能是:提供一個(gè)目錄系統(tǒng),讓其它各地的應(yīng)用程序在其上面留下自己的索引,從而滿足快速查找和定位分布式應(yīng)用程序的功能。124、什么是JMS

      答:(Java Message Service)JAVA消息服務(wù)。主要實(shí)現(xiàn)各個(gè)應(yīng)用程序之間的通訊。包括點(diǎn)對(duì)點(diǎn)和廣播。125、什么是JTA

      答:(Java Transaction API)JAVA事務(wù)服務(wù)。提供各種分布式事務(wù)服務(wù)。應(yīng)用程序只需調(diào)用其提供的接口即可。

      126、什么是JAF

      答:(Java Action FrameWork)JAVA安全認(rèn)證框架。提供一些安全控制方面的框架。讓開發(fā)者通過各種部署和自定義實(shí)現(xiàn)自己的個(gè)性安全控制策略。

      RMI/IIOP:(Remote Method Invocation /internet對(duì)象請(qǐng)求中介協(xié)議)他們主要用于通過遠(yuǎn)程調(diào)用服務(wù)。例如,遠(yuǎn)程有一臺(tái)計(jì)算機(jī)上運(yùn)行一個(gè)程序,它提供股票分析服務(wù),我們可以在本地計(jì)算機(jī)上實(shí)現(xiàn)對(duì)其直接調(diào)用。當(dāng)然這是要通過一定的規(guī)范才能在異構(gòu)的系統(tǒng)之間進(jìn)行通信。RMI是JAVA特有的。

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

      答:MVC是Model-View-Controller的簡(jiǎn)寫。“Model” 代表的是應(yīng)用的業(yè)務(wù)邏輯(通過JavaBean,EJB組件實(shí)現(xiàn)),“View” 是應(yīng)用的表示面(由JSP頁(yè)面產(chǎn)生),“Controller” 是提供應(yīng)用的處理過程控制(一般是一個(gè)Servlet),通過這種設(shè)計(jì)模型把應(yīng)用邏輯,處理過程和顯示邏輯分成不同的組件實(shí)現(xiàn)。這些組件可以進(jìn)行交互和重用。

      -JAVA程序員JAVA工程師面試必看

      下載應(yīng)聘Java,jsp,j2ee軟件工程師筆試中可能出現(xiàn)的問word格式文檔
      下載應(yīng)聘Java,jsp,j2ee軟件工程師筆試中可能出現(xiàn)的問.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)范文推薦