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

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

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

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

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

      2014電訊盈科java面試筆試試題-_-(最終5篇)

      時(shí)間:2019-05-12 18:37:55下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《2014電訊盈科java面試筆試試題-_-》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《2014電訊盈科java面試筆試試題-_-》。

      第一篇:2014電訊盈科java面試筆試試題-_-

      萃鋒筆試題之 一二

      編程題用java建立排序二叉樹(shù),并寫(xiě)出中序和后序遍歷用java編寫(xiě)100內(nèi)的質(zhì)數(shù)

      簡(jiǎn)答題String,StringBuilder和StringBuffer的區(qū)別

      2struts2與spring mvc,Ibtis與Hibernate的關(guān)系和區(qū)別。接口和抽象類(lèi)的區(qū)別。UML是什么?寫(xiě)出3種UML圖,在系統(tǒng)過(guò)程中分析其作用。寫(xiě)出單例模式(一種方式),和觀察者模式。

      楊舒合15:05:14

      好多我說(shuō)不出來(lái)的問(wèn)題,還有就是,你做的模塊是要給另一個(gè)人拿到就用的,那人不看你的注釋?zhuān)豢茨愦a,不看你的文檔,就把它當(dāng)成現(xiàn)成的,你要怎么跟他交接要注意的問(wèn)題 楊舒合15:07:39

      這個(gè)注意的內(nèi)容不是三言兩語(yǔ)就能說(shuō)完的,還不知道哪個(gè)人會(huì)接到你的模塊用,怎么交接注意的問(wèn)題

      第二篇:電訊盈科筆試面試題目

      筆試 :選擇題部分主要還是corejava部分,jsp,oracle 查詢,視圖 索引等基本概念編程題部分還是corejava部分,比較常見(jiàn)的題目,不難!

      英文翻譯題

      面試:先自我介紹(中英文的最好都先準(zhǔn)備下);

      還是主要圍繞corejava和數(shù)據(jù)庫(kù)這塊:

      數(shù)據(jù)庫(kù)偽列、Varchar2、體系結(jié)構(gòu)、面向?qū)ο蟆⒉樵冋Z(yǔ)句、查詢方式及優(yōu)勢(shì)等;沒(méi)怎么問(wèn)項(xiàng)目?jī)?nèi)容,問(wèn)做過(guò)什么項(xiàng)目,是在學(xué)校做的還是工作中自己做過(guò)?人事方面問(wèn)的很多,像:

      為什么換專(zhuān)業(yè)轉(zhuǎn)行?

      你的興趣愛(ài)好是什么?

      對(duì)這個(gè)行業(yè)和該公司的了解多少?怎么知道他們公司的招聘信息?

      在培訓(xùn)中你都學(xué)了什么內(nèi)容,什么對(duì)你來(lái)說(shuō)是最有用的?

      談下自己的職業(yè)規(guī)劃和目標(biāo)?

      比較看中自己的發(fā)展目標(biāo)和規(guī)劃的描述。(職業(yè)規(guī)劃這塊大家要對(duì)自己以后的發(fā)展有個(gè)大概的方向,在以后的1-3年之內(nèi)計(jì)劃做到什么樣的位置,比如說(shuō)項(xiàng)目經(jīng)理,技術(shù)總監(jiān)等,最好是把自己當(dāng)成已經(jīng)入職的員工,計(jì)劃進(jìn)公司后怎樣開(kāi)展工作更為實(shí)際和現(xiàn)實(shí)。)

      1.httpSession是否是線程安全的,如不是,怎樣管理

      2.從企業(yè)應(yīng)用角度考慮httpSession的管理的優(yōu)化。

      3.寫(xiě)出Struts的工作流程

      4.Spring 中事物的傳播特性PROPAGATION_REQUIRED_NEW 與 PROPAGATION_NEVER 的區(qū)別

      5.web應(yīng)用中include、forward、senRedire的區(qū)別

      6.Hibernate中的延遲加載的原理

      7.javaScript對(duì)字符串etg@@tui@@mkj中的@@ 進(jìn)行分隔并存入v1.v2.v3變量中

      8.javaScript 中使對(duì)象睡1秒鐘

      9.寫(xiě)函數(shù)對(duì)字符串進(jìn)行反轉(zhuǎn)

      10.用二分查找法查找字符串中的字符

      二》》數(shù)據(jù)庫(kù)

      create table emp(emp_id integer primary key;

      first_name varchar2(8),last_name varchar2(8),salay number(7,2),manager_id integer,dept_id references dept(dept_id));

      create table dept(dept_id integer primary key,dept_no integer,dept_msg varchar2(35));

      9.查詢出平均工資大于8000的員工姓名,部門(mén)信息

      10.查詢出員工的基本信息,包括沒(méi)有部門(mén)的員工

      11.查詢出員工的姓名,工資,相應(yīng)的部門(mén)信息

      HttpSession 是否線程安全?如果不是,在多線程下怎么才能解決線程不安全問(wèn)題?

      hibernate session 的生命周期

      hibernate 事務(wù)控制

      描述struts中 請(qǐng)求----> 相應(yīng)結(jié)果 的流程

      javax.servlet.RequestDispatcher 的include、forward HttpServletResponse.sendRedirect的不同之處

      數(shù)據(jù)庫(kù)SQL 連接查詢,分組查詢

      面試:

      Collection 與 Collections 的區(qū)別

      覆蓋equals()hashCode()的原則

      struts的2個(gè)關(guān)鍵類(lèi)

      面試地點(diǎn):PCCW Solutions 會(huì)議室(北三環(huán)安外大街小黃莊路19號(hào) 華泰證券大廈6層)

      請(qǐng)大家切記不可遲到!

      面試時(shí)一般會(huì)安排3人面試,1個(gè)人事,2個(gè)技術(shù),面試問(wèn)題集中在數(shù)據(jù)庫(kù)和corejava方面,比如ORACLE數(shù)據(jù)庫(kù)查詢方面,索引、視圖等等,項(xiàng)目實(shí)戰(zhàn)也要重點(diǎn)關(guān)注。一般是自己先做自我介紹,面試官先聽(tīng),根據(jù)個(gè)人介紹和簡(jiǎn)歷的內(nèi)容進(jìn)行提問(wèn)。大家保持良好的自信心,做好充分的準(zhǔn)備應(yīng)對(duì)就可以了。

      第三篇:電訊盈科學(xué)習(xí)體會(huì)

      服務(wù)為本 創(chuàng)新致勝

      ――電訊盈科學(xué)習(xí)體會(huì)

      6月下旬,在省公司安排下,我們參加了由香港電訊盈科舉辦為期5天的《卓越電信企業(yè)管理》培訓(xùn),培訓(xùn)時(shí)間雖然短暫,但讓我們領(lǐng)略了世界級(jí)運(yùn)營(yíng)商卓越的網(wǎng)絡(luò)管理能力、優(yōu)質(zhì)客戶服務(wù)水平和旺盛的創(chuàng)新能力。通過(guò)本次培訓(xùn),也讓我們看到杭州電信在網(wǎng)絡(luò)管理方面需要提升的空間和努力的目標(biāo),現(xiàn)就本次培訓(xùn)談幾點(diǎn)體會(huì): 體會(huì)一: “客戶服務(wù)”應(yīng)成為運(yùn)維管理的核心。

      負(fù)責(zé)電訊盈科全網(wǎng)運(yùn)維支撐的全資子公司――萃鋒公司為我們進(jìn)行了《現(xiàn)代網(wǎng)絡(luò)運(yùn)作及管理》、《項(xiàng)目管理》及市場(chǎng)營(yíng)銷(xiāo)相關(guān)課程的講解,整個(gè)學(xué)習(xí)過(guò)程讓我們強(qiáng)烈感受到作為一家綜合信息運(yùn)營(yíng)商對(duì)“服務(wù)”二字重要性的深刻理解,并把“以客戶為尊” 服務(wù)理念貫串于整個(gè)網(wǎng)絡(luò)管理的始終,就連內(nèi)設(shè)架構(gòu)的名稱(chēng)也含“服務(wù)”。萃鋒公司下設(shè)“客戶服務(wù)總處”分別負(fù)責(zé)接入層及客戶裝維工作,“網(wǎng)絡(luò)服務(wù)總處”負(fù)責(zé)網(wǎng)絡(luò)的維護(hù)支撐,這兩個(gè)部門(mén)等同于我公司的“客戶網(wǎng)絡(luò)支撐中心”和“網(wǎng)絡(luò)運(yùn)行中心”,所不同的是盈科把服務(wù)放在第一重要的位置。對(duì)服務(wù)工作的深入理解,還需要從電訊盈科對(duì)競(jìng)爭(zhēng)三要素的認(rèn)識(shí)來(lái)展開(kāi),電信運(yùn)營(yíng)商應(yīng)對(duì)競(jìng)爭(zhēng)的三個(gè)要素分別為“價(jià)格、技術(shù)和服務(wù)”,盈科對(duì)這三者關(guān)系有著全面和深刻認(rèn)識(shí),他們認(rèn)為:低價(jià)格可以換取部分市場(chǎng)份額,但只有短期效果;技術(shù)新可以獲得競(jìng)爭(zhēng)優(yōu)勢(shì),但成本高,同時(shí)新技術(shù)可以進(jìn)行復(fù)制,競(jìng)爭(zhēng)對(duì)手可以花錢(qián)從供應(yīng)商那里獲取更為先進(jìn)的技術(shù)。只有服務(wù)優(yōu)才可以得到用戶的信任,對(duì)企業(yè)有長(zhǎng)遠(yuǎn)的效益,因此服務(wù)能力應(yīng)視作電信運(yùn)營(yíng)商的核心競(jìng)爭(zhēng)力,服務(wù)的能力和水平將成為區(qū)別不同運(yùn)營(yíng)商的唯一標(biāo)志。正是對(duì)服務(wù)獨(dú)到的理解,使得盈科在運(yùn)維組織架構(gòu)的構(gòu)建、IT支撐系統(tǒng)的建設(shè)、客戶感知度指標(biāo)的設(shè)置等各項(xiàng)運(yùn)維體系都是圍繞如何提升服務(wù)來(lái)開(kāi)展的。在運(yùn)維組織架構(gòu)方面,設(shè)有“大客戶服務(wù)管理中心”,以客戶的視角向客戶提供貼心服務(wù),向客戶提供主動(dòng)式的網(wǎng)絡(luò)支持服務(wù),對(duì)重要大客戶實(shí)施了派駐制的服務(wù);在IT支撐系統(tǒng)建設(shè)方面,體現(xiàn)了電訊盈科長(zhǎng)期以來(lái)對(duì)服務(wù)工作更為深刻的認(rèn)識(shí),他們認(rèn)為,服務(wù)能力是運(yùn)營(yíng)商的運(yùn)行效率體現(xiàn),而IT支撐系統(tǒng)是確保其運(yùn)營(yíng)效率比競(jìng)爭(zhēng)對(duì)手更勝一籌的重要手段,因此盈科多年來(lái)保留了一支強(qiáng)大IT支撐系統(tǒng)開(kāi)發(fā)隊(duì)伍,把其對(duì)網(wǎng)絡(luò)運(yùn)營(yíng)和服務(wù)理念的獨(dú)特理解,轉(zhuǎn)變成強(qiáng)大IT支撐能力。如其開(kāi)發(fā)的運(yùn)維支撐系統(tǒng)ONE.BSS,把運(yùn)維支撐所需的業(yè)務(wù)開(kāi)通、大客戶管理、資源調(diào)配、故障管控、各專(zhuān)業(yè)網(wǎng)絡(luò)監(jiān)控、資產(chǎn)管理等各個(gè)系統(tǒng)有機(jī)融合在了一起,使企業(yè)內(nèi)各類(lèi)資源都得到了共享,形成了高效快捷的生產(chǎn)運(yùn)營(yíng)指揮體系,其中ONE.BSS的一個(gè)子系統(tǒng)(分配靈)可以把各類(lèi)業(yè)務(wù)開(kāi)通單和故障派修單與一線維護(hù)人員的技能和所在地理位置結(jié)合起來(lái)實(shí)行動(dòng)態(tài)的工單調(diào)度,一線維護(hù)人員人手1個(gè)PDA,隨時(shí)可以接收系統(tǒng)派來(lái)的工單和向系統(tǒng)反饋處理的結(jié)果,這一系統(tǒng)不但提高了一線維護(hù)人員的維護(hù)效率,更使前臺(tái)向客戶所作的承諾得以切實(shí)的呈現(xiàn)。盈科公司對(duì)外承諾寬帶、固話業(yè)務(wù)次日開(kāi)通正是在這樣的系統(tǒng)支撐下實(shí)現(xiàn)的。在運(yùn)維指標(biāo)方面,電訊盈科把網(wǎng)絡(luò)運(yùn)維投訴指標(biāo)、客戶不滿意度指標(biāo)放在重要位置,這類(lèi)指標(biāo)將以較高權(quán)重對(duì)維護(hù)部門(mén)和業(yè)務(wù)外包單位進(jìn)行績(jī)效考核。

      對(duì)服務(wù)的認(rèn)識(shí),電訊盈科還有更深一層的認(rèn)識(shí),即服務(wù)是需要成本的,服務(wù)應(yīng)成為創(chuàng)造利潤(rùn)的手段?;谶@一認(rèn)識(shí),他們把服務(wù)分成了差異化服務(wù)和標(biāo)準(zhǔn)化服務(wù),其中對(duì)400家大客戶提供了差異化的服務(wù),在電路的配置方案、業(yè)務(wù)開(kāi)通時(shí)間和故障處理方式等方面采用了與客戶商量的方法來(lái)確定服務(wù)標(biāo)準(zhǔn),并采用優(yōu)質(zhì)優(yōu)價(jià)的方式與客戶簽訂SLA協(xié)議,而對(duì)中小企業(yè)和公眾客戶則采用了標(biāo)準(zhǔn)化的服務(wù)。另外電訊盈科還注重對(duì)承諾服務(wù)的管理,把服務(wù)承諾與企業(yè)內(nèi)資源配置有機(jī)地結(jié)合起來(lái),確保每項(xiàng)承諾的服務(wù)實(shí)際水平高于客戶的心理期望。

      體會(huì)二:創(chuàng)新精神是企業(yè)擺脫困境的利器。

      本次培訓(xùn)使我們感到電訊盈科旺盛的創(chuàng)新能力。與中國(guó)電信一樣,電訊盈科也受到了政府不對(duì)稱(chēng)管制,1995年香港電信市場(chǎng)開(kāi)放以來(lái),這個(gè)僅有700萬(wàn)人口的港島上,從1家電信運(yùn)營(yíng)商發(fā)展到了15家,成為全球競(jìng)爭(zhēng)最為激烈的電信市場(chǎng)之一。在此期間,電訊盈科的固定電話市場(chǎng)占有率從100%下降到了68%。面對(duì)困境,電訊盈科解決問(wèn)題的辦法就是不斷對(duì)技術(shù)和業(yè)務(wù)地翻陳出新,用創(chuàng)新思路來(lái)拓展經(jīng)營(yíng)的內(nèi)涵,從一個(gè)電信業(yè)務(wù)提供商發(fā)展成了一個(gè)真正的綜合信息提供商,從經(jīng)營(yíng)范圍而言,業(yè)務(wù)已拓展到ICT系統(tǒng)集成、新興傳媒、物流等多個(gè)領(lǐng)域。近年來(lái)盈科參與承建了香港及全球大型ICT項(xiàng)目,如香港政府智能身份證識(shí)別系統(tǒng)、香港迪斯尼弱電系統(tǒng)等大型項(xiàng)目。

      在創(chuàng)新能力方面,給我們印象最深的是電訊盈科已把新產(chǎn)品開(kāi)發(fā)作為企業(yè)日常工作流程固定下來(lái),從創(chuàng)新意念衍生――>可行性研究-->產(chǎn)品設(shè)計(jì)――>產(chǎn)品開(kāi)發(fā)及試驗(yàn)――>營(yíng)銷(xiāo)策劃及推進(jìn)――>試點(diǎn)及修正――>全面推出到推進(jìn)后的評(píng)估,全過(guò)程每個(gè)環(huán)節(jié)都設(shè)了標(biāo)準(zhǔn)化的工作要求,如可行研究就需要通過(guò)業(yè)務(wù)需求量測(cè)算、收入與成本測(cè)算、財(cái)務(wù)收益評(píng)估、風(fēng)險(xiǎn)評(píng)估、法規(guī)及專(zhuān)利檢查等諾干項(xiàng)內(nèi)容研究,最后提交公司高層拍板決定是否開(kāi)發(fā)。通過(guò)這一標(biāo)準(zhǔn)化流程開(kāi)發(fā)的產(chǎn)品,保證了新開(kāi)發(fā)的產(chǎn)品的可用性,同時(shí)又保證了市場(chǎng)經(jīng)營(yíng)的有效性。電訊盈科公司產(chǎn)品開(kāi)發(fā)流程由市場(chǎng)部根據(jù)客戶的需求牽頭實(shí)施。產(chǎn)品創(chuàng)新方面,電訊盈科03年9份推進(jìn)now TV(IPTV)業(yè)務(wù)是最為成功的一個(gè)新產(chǎn)品,在不到4年的時(shí)間里,已發(fā)展到80萬(wàn)客戶(ARPU達(dá)到103港元),成為了世界第一個(gè)大規(guī)模商用的IP電視服務(wù)平臺(tái)。now TV業(yè)務(wù)的成功,應(yīng)歸功于電訊盈科的持續(xù)創(chuàng)新能力:在技術(shù)上:采用了速率達(dá)6M/秒的寬帶速率、采用了在DSLAM實(shí)現(xiàn)組播和預(yù)訂頻道的控制、采用了有效的防止盜看及盜版技術(shù),這些措施保證了客戶端視頻質(zhì)量、同時(shí)又保證內(nèi)容提供商的利益。在營(yíng)銷(xiāo)策略上:采用了now TV(IPTV)產(chǎn)品與寬帶進(jìn)行挷定銷(xiāo)售策略,由于now TV廣受歡迎,使寬帶業(yè)務(wù)也得到了更為有力的拓展。在資費(fèi)政策,這一產(chǎn)品采用了免開(kāi)通費(fèi)、免安裝調(diào)試費(fèi)、免機(jī)頂盒費(fèi)、創(chuàng)新地提出了按定制頻道(或頻道組合)收費(fèi)的全新收費(fèi)模式,確保了用戶可以根據(jù)需要來(lái)隨時(shí)定制收看自己喜歡的節(jié)目。

      在當(dāng)前中國(guó)電信正著力推進(jìn)轉(zhuǎn)型關(guān)鍵時(shí)期,更需要借鑒電訊盈科先進(jìn)管理經(jīng)驗(yàn)來(lái)提升我們的管理水平。從網(wǎng)絡(luò)管理的角度看,網(wǎng)絡(luò)管理工作如何跟上甚至超越企業(yè)轉(zhuǎn)型的步伐,是我們需要認(rèn)真考慮的并著力去做好的工作,我們認(rèn)為近期運(yùn)維轉(zhuǎn)型應(yīng)做好三個(gè)轉(zhuǎn)變:從以網(wǎng)絡(luò)為中心向以客戶為中心轉(zhuǎn)變,提高客戶的感知度;從網(wǎng)絡(luò)運(yùn)維向網(wǎng)絡(luò)運(yùn)營(yíng)轉(zhuǎn)變,深化運(yùn)維工作的內(nèi)涵;從粗獷型網(wǎng)絡(luò)管理向精確化管理轉(zhuǎn)變,提高資源運(yùn)營(yíng)效率。同時(shí)實(shí)現(xiàn)二個(gè)提升,服務(wù)水平的提升、創(chuàng)新能力提升。

      從以網(wǎng)絡(luò)為中心向以客戶為中心轉(zhuǎn)變,就是要優(yōu)化現(xiàn)行的運(yùn)維組織架構(gòu),使之適應(yīng)以客戶中心的服務(wù)理念在組織形式上得以保證;要著力建設(shè)一支具有“聽(tīng)得懂、說(shuō)得清、能達(dá)成”能力的客戶服務(wù)工程師,使他們具有近距離感知客戶需求和滿足客戶需求的能力。要逐步構(gòu)建客戶可感知的服務(wù)質(zhì)量體系,如要建立以客戶為單位的重復(fù)故障分析處理機(jī)制。從網(wǎng)絡(luò)運(yùn)維向網(wǎng)絡(luò)運(yùn)營(yíng)轉(zhuǎn)變,就是要在保證網(wǎng)絡(luò)運(yùn)行基本面穩(wěn)定可靠的情況下,不斷提升運(yùn)維工作內(nèi)涵,如為市場(chǎng)經(jīng)營(yíng)提供有針對(duì)性分析材料、主動(dòng)提出產(chǎn)品創(chuàng)新設(shè)想、努力拓展維護(hù)能力的產(chǎn)品化等等。從粗獷型網(wǎng)絡(luò)管理向精確化管理轉(zhuǎn)變,就是要不斷優(yōu)化IT支撐系統(tǒng),嚴(yán)格執(zhí)行規(guī)范和規(guī)程,使任何工作都有據(jù)可查。要提高網(wǎng)絡(luò)管理的效率,如提高“兩單”處理效率。

      服務(wù)水平的提升:首先要建立超越競(jìng)爭(zhēng)對(duì)手的服務(wù)水平意識(shí),使服務(wù)成為不同運(yùn)營(yíng)商的標(biāo)識(shí)符,成為企業(yè)的核心競(jìng)爭(zhēng)力。其次需要我們持續(xù)優(yōu)化內(nèi)部業(yè)務(wù)流程,用高效的運(yùn)營(yíng)效率來(lái)響應(yīng)客戶需求。第三是要改變普惠制的服務(wù)思想,在支撐資源有限的情況下,把優(yōu)質(zhì)服務(wù)資源投向高質(zhì)客戶和有效益的產(chǎn)品,實(shí)現(xiàn)真正意義上差異服務(wù)化服務(wù)。第四是要讓員工明白高質(zhì)的服務(wù)還需要員工奉獻(xiàn)精神,只有員工能真正體驗(yàn)到企業(yè)困難和優(yōu)質(zhì)服務(wù)的必要性時(shí),才有可能讓客戶感受到我們的服務(wù)是真誠(chéng)的。

      創(chuàng)新能力的提升:建立一個(gè)創(chuàng)新的激勵(lì)機(jī)制,形成一種人人參與創(chuàng)新的企業(yè)氛圍,使技術(shù)人員成為企業(yè)創(chuàng)新的主力軍,使他們能對(duì)已經(jīng)習(xí)以為常的事提出新的看法,讓他們有興趣去研究客戶、業(yè)務(wù)和網(wǎng)絡(luò)技術(shù)的變化,去探索固話、寬帶、無(wú)線產(chǎn)品組合的可能性,當(dāng)前需要重點(diǎn)去研究如何實(shí)現(xiàn)IP網(wǎng)絡(luò)的電信化和如何延長(zhǎng)小靈通網(wǎng)絡(luò)生命周期。總之,唯有提供誠(chéng)信服務(wù)、持續(xù)創(chuàng)新,才能最終感動(dòng)客戶,贏得未來(lái)。

      杭州分公司 2007年7月16日

      第四篇:盈科律師事務(wù)所面試分享

      面試的主考官是一位性李的合伙人,是律所公司部的律師,應(yīng)該主要是從事pE以及MA業(yè)務(wù)的合伙人。很親切,問(wèn)我怎么來(lái)北京的,是否有到處逛逛等?我開(kāi)玩笑說(shuō),還沒(méi)來(lái)得及,希望能被錄用,這樣就有時(shí)間看看北京了。面試主要是圍繞自己的簡(jiǎn)歷進(jìn)行的,主要是問(wèn)我經(jīng)歷中的一些具體事項(xiàng),做過(guò)的業(yè)務(wù),還有就是一些測(cè)試性格的題目,例如,自己的優(yōu)勢(shì)是什么?劣勢(shì)是什么?自己認(rèn)為律所的工作特點(diǎn)是社么等等。感覺(jué)比較順利

      面試問(wèn)題(1)過(guò)去做過(guò)的項(xiàng)目;

      (2)性格特點(diǎn);

      (3)自己的優(yōu)勢(shì)是什么,為甚么適合律師工作;

      (4)為什么要從事律師工作;

      (5)希望將來(lái)的老板是什么特點(diǎn);

      (6)薪水待遇的希望是多少。?

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

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

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

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

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

      3、說(shuō)說(shuō)&和&&的區(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)說(shuō)出作用域public,private,protected,以及不寫(xiě)時(shí)的區(qū)別.........................................9

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

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

      21、寫(xiě)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)部類(lèi)?Static Nested Class 和 Inner Class的不同。........................................13

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

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

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

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

      32、是否可以繼承String類(lèi)?..........................................................................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ù)組有沒(méi)有l(wèi)ength()這個(gè)方法? String有沒(méi)有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)寫(xiě)出你最常見(jiàn)到的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、同步和異步有何異同,在什么情況下分別使用他們?舉例說(shuō)明。........................................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。寫(xiě)出程序。.................25

      56、子線程循環(huán)10次,接著主線程循環(huán)100,接著又回到子線程循環(huán)10次,接著再回到主線程又循環(huán)100,如此循環(huán)50次,請(qǐng)寫(xiě)出程序。....................................................................................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、說(shuō)出ArrayList,Vector, LinkedList的存儲(chǔ)性能和特性...............................................32 65、去掉一個(gè)Vector集合中重復(fù)的元素.................................................................33 66、Collection 和 Collections的區(qū)別。...............................................................33 67、Set里的元素是不能重復(fù)的,那么用什么方法來(lái)區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別?.....33 68、你所知道的集合類(lèi)都有哪些?主要方法?............................................................33 69、兩個(gè)對(duì)象值相同(x.equals(y)== true),但卻可有不同的hash code,這句話對(duì)不對(duì)?.....................33 70、TreeSet里面放對(duì)象,如果同時(shí)放入了父類(lèi)和子類(lèi)的實(shí)例對(duì)象,那比較時(shí)使用的是父類(lèi)的compareTo方法,還是使用的子類(lèi)的compareTo方法,還是拋異常!................................................................33 71、說(shuō)出一些常用的類(lèi),包,接口,請(qǐng)各舉5個(gè)..........................................................34 72、java中有幾種類(lèi)型的流?JDK為每種類(lèi)型的流提供了一些抽象類(lèi)以供繼承,請(qǐng)說(shuō)出他們分別是哪些類(lèi)?......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、能不能自己寫(xiě)個(gè)類(lèi),也叫java.lang.String?........................................................39 83.Java代碼查錯(cuò)........................................................................................40 二.算法與編程...........................................................................................43

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

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

      3、編寫(xiě)一個(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、說(shuō)明生活中遇到的二叉樹(shù),用java實(shí)現(xiàn)二叉樹(shù)........................................................47

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

      7、寫(xiě)一個(gè)Singleton出來(lái)。...........................................................................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)寫(xiě)出用于校驗(yàn)HTML文本框中輸入的內(nèi)容全部為數(shù)字的javascript代碼.................................62

      5、說(shuō)說(shuō)你用過(guò)那些ajax技術(shù)和框架,說(shuō)說(shuō)它們的區(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、說(shuō)一說(shuō)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ù)來(lái)實(shí)現(xiàn)?如何實(shí)現(xiàn)?.......................................................65

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

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

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

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

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

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

      6、union和union all有什么不同?.....................................................................69 7.分頁(yè)語(yǔ)句..........................................................................................70 8.用一條SQL語(yǔ)句 查詢出每門(mén)課都大于80分的學(xué)生姓名..................................................72 9.所有部門(mén)之間的比賽組合............................................................................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多萬(wàn)個(gè)用戶,若要在每年第一天凌晨將積分清零,你將考慮什么,你將想什么辦法解決?.............................................................................78

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

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

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

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

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

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

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

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

      29、說(shuō)出數(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í)如何解決中文問(wèn)題?如何解析?..................................................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)清晰,使開(kāi)發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).....................87

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

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

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

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

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

      12、寫(xiě)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è)字段,也就是說(shuō)查詢出來(lái)的結(jié)果集沒(méi)有一個(gè)實(shí)體類(lèi)與之對(duì)應(yīng)如何解決;....................................................................................................89 17.介紹一下Hibernate的二級(jí)緩存.....................................................................89

      18、Spring 的依賴注入是什么意思? 給一個(gè) Bean 的 message 屬性, 字符串類(lèi)型, 注入值為 “Hello” 的 XML 配置文件該怎么寫(xiě)?...........................................................................................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ì)模式?說(shuō)明工廠模式。...............................................................90

      3、開(kāi)發(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)模式(開(kāi)發(fā)模式)與產(chǎn)品發(fā)布模式?.........................................92

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

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

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

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

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

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

      1、EJB是基于哪些技術(shù)實(shí)現(xiàn)的?并說(shuō)出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)說(shuō)出他們的生命周期,及如何管理事務(wù)的?..........................93

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

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

      7、EJB的幾種類(lèi)型....................................................................................93

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

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

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

      4、LINUX下線程,GDI類(lèi)的解釋。......................................................................94 5.問(wèn)得稀里糊涂的題......................................................................................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

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

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

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

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

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

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

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

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

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

      3、說(shuō)說(shuō)&和&&的區(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類(lèi)型時(shí),&表示按位與操作,我們通常使用0x0f來(lái)與一個(gè)整數(shù)進(jìn)行&運(yùn)算,來(lái)獲取該整數(shù)的最低4個(gè)bit位,例如,0x31 & 0x0f的結(jié)果為0x01。

      備注:這道題先說(shuō)兩者的共同點(diǎn),再說(shuō)出&&和&的特殊之處,并列舉一些經(jīng)典的例子來(lái)表明自己理解透徹深入、實(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基本類(lèi)型或Integer包裝類(lèi)型,由于,byte,short,char都可以隱式轉(zhuǎn)換為int,所以,這些類(lèi)型以及這些類(lèi)型的包裝類(lèi)型也是可以的。顯然,long和String類(lèi)型都不符合switch的語(yǔ)法規(guī)定,并且不能被隱式轉(zhuǎn)換成int類(lèi)型,所以,它們不能作用于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á)式的類(lèi)型,所以結(jié)果是int型,再賦值給short類(lèi)型s1時(shí),編譯器將報(bào)告需要強(qiáng)制轉(zhuǎn)換類(lèi)型的錯(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型變量是用來(lái)存儲(chǔ)Unicode編碼的字符的,unicode編碼字符集中包含了漢字,所以,char型變量中當(dāng)然可以存儲(chǔ)漢字啦。不過(guò),如果某個(gè)特殊的漢字沒(méi)有被包含在unicode編碼字符集中,那么,這個(gè)char型變量中就不能存儲(chǔ)這個(gè)特殊漢字。補(bǔ)充說(shuō)明:unicode編碼占用兩個(gè)字節(jié),所以,char類(lèi)型的變量也是占用兩個(gè)字節(jié)。

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

      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é)來(lái)存儲(chǔ)的數(shù)值,所以計(jì)算機(jī)中能夠表示的數(shù)值是有一定的范圍的,為了便于講解和理解,我們先以byte 類(lèi)型的整數(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í)的類(lèi)型提升,運(yùn)算后會(huì)產(chǎn)生進(jìn)位,二進(jìn)制結(jié)果為1,11111110,由于進(jìn)位后超過(guò)了byte類(lèi)型的存儲(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í)的類(lèi)型提升,運(yùn)算后會(huì)產(chǎn)生進(jìn)位,二進(jìn)制結(jié)果為1,00000000,由于進(jìn)位后超過(guò)了byte類(lèi)型的存儲(chǔ)空間,所以進(jìn)位部分被舍棄,即最終的結(jié)果為00000000,也就是0,這樣的結(jié)果顯然不是我們期望的,這說(shuō)明計(jì)算機(jī)中的算術(shù)運(yùn)算是會(huì)發(fā)生越界情況的,兩個(gè)數(shù)值的運(yùn)算結(jié)果不能超過(guò)計(jì)算機(jī)中的該類(lèi)型的數(shù)值范圍。由于Java中涉及表達(dá)式運(yùn)算時(shí)的類(lèi)型自動(dòng)提升,我們無(wú)法用byte類(lèi)型來(lái)做演示這種問(wèn)題和現(xiàn)象的實(shí)驗(yàn),大家可以用下面一個(gè)使用整數(shù)做實(shí)驗(yàn)的例子程序體驗(yàn)一下:

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

      ()這個(gè)類(lèi)內(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);

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

      a.append(” broken!“);

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

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

      param.append(”a“);

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

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

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

      如果一個(gè)變量指向的數(shù)據(jù)是對(duì)象類(lèi)型的,那么,這時(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ū)ο箢?lèi)型的變量,如果要比較兩個(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í)際開(kāi)發(fā)中,我們經(jīng)常要比較傳遞進(jìn)行來(lái)的字符串內(nèi)容是否等,例如,String input = ?;input.equals(“quit”),許多人稍不注意就使用==進(jìn)行比較了,這是錯(cuò)誤的,隨便從網(wǎng)上找?guī)讉€(gè)項(xiàng)目實(shí)戰(zhàn)的教學(xué)視頻看看,里面就有大量這樣的錯(cuò)誤。記住,字符串的比較基本上都是使用equals方法。

      如果一個(gè)類(lèi)沒(méi)有自己定義equals方法,那么它將繼承Object類(lèi)的equals方法,Object類(lèi)的equals方法的實(shí)現(xiàn)代碼如下: boolean equals(Object o){ return this==o;} 這說(shuō)明,如果一個(gè)類(lèi)沒(méi)有自己定義equals方法,它默認(rèn)的equals方法(從Object 類(lèi)繼承的)就是使用==操作符,也是在比較兩個(gè)變量指向的對(duì)象是否是同一對(duì)象,這時(shí)候使用equals和使用==會(huì)得到同樣的結(jié)果,如果比較的是兩個(gè)獨(dú)立的對(duì)象則總返回false。如果你編寫(xiě)的類(lèi)希望能夠比較該類(lèi)創(chuàng)建的兩個(gè)實(shí)例對(duì)象的內(nèi)容是否相同,那么你必須覆蓋equals方法,由你自己寫(xiě)代碼來(lái)決定在什么情況即可認(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ì)象,而是屬于類(lèi),所以也稱(chēng)為類(lèi)變量,只要程序加載了類(lèi)的字節(jié)碼,不用創(chuàng)建任何實(shí)例對(duì)象,靜態(tài)變量就會(huì)被分配空間,靜態(tài)變量就可以被使用了??傊?,實(shí)例變量必須創(chuàng)建對(duì)象后才可以通過(guò)這個(gè)對(duì)象來(lái)使用,靜態(tài)變量則可以直接使用類(lèi)名來(lái)引用。

      例如,對(duì)于下面的程序,無(wú)論創(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è)解答除了說(shuō)清楚兩者的區(qū)別外,最后還用一個(gè)具體的應(yīng)用例子來(lái)說(shuō)明兩者的差異,體現(xiàn)了自己有很好的解說(shuō)問(wèn)題和設(shè)計(jì)案例的能力,思維敏捷,超過(guò)一般程序員,有寫(xiě)作能力!

      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)用。也就是說(shuō),當(dāng)一個(gè)static方法被調(diào)用時(shí),可能還沒(méi)有創(chuàng)建任何實(shí)例對(duì)象,如果從一個(gè)static方法中發(fā)出對(duì)非static方法的調(diào)用,那個(gè)非static方法是關(guān)聯(lián)到哪個(gè)對(duì)象上的呢?這個(gè)邏輯無(wú)法成立,所以,一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用。

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

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

      在Hibernate中,如果將OID定義為Integer類(lèi)型,那么Hibernate就可以根據(jù)其值是否為null而判斷一個(gè)對(duì)象是否是臨時(shí)的,如果將OID定義為了int類(lèi)型,還需要在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類(lèi)中提供了三個(gè)與取整有關(guān)的方法:ceil、floor、round,這些方法的作用與它們的英文名稱(chēng)的含義相對(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),即將原來(lái)的數(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)說(shuō)出作用域public,private,protected,以及不寫(xiě)時(shí)的區(qū)別

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

      說(shuō)明:如果在修飾的元素上面沒(méi)有寫(xiě)任何訪問(wèn)修飾符,則表示friendly。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      clone 有缺省行為,super.clone();因?yàn)槭紫纫迅割?lèi)中的成員復(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é)作的過(guò)程。面向?qū)ο缶幊叹褪前船F(xiàn)實(shí)業(yè)務(wù)一樣的方式將程序代碼按一個(gè)個(gè)對(duì)象進(jìn)行組織和編寫(xiě),讓計(jì)算機(jī)系統(tǒng)能夠識(shí)別和理解用對(duì)象方式組織和編寫(xiě)的程序代碼,這樣就可以把現(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)聚、低耦合”,防止程序相互依賴性而帶來(lái)的變動(dòng)影響。在面向?qū)ο蟮木幊陶Z(yǔ)言中,對(duì)象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語(yǔ)言的封裝更為清晰、更為有力。面向?qū)ο蟮姆庋b就是把描述一個(gè)對(duì)象的屬性和行為的代碼封裝在一個(gè)“模塊”中,也就是一個(gè)類(lèi)中,屬性用變量定義,行為用方法進(jìn)行定義,方法可以直接訪問(wèn)同一個(gè)對(duì)象中的屬性。通常情況下,只要記住讓變量和訪問(wèn)這個(gè)變量的方法放在一起,將一個(gè)類(lèi)中的成員變量全部定義成私有的,只有這個(gè)類(lèi)自己的方法才可以訪問(wèn)到這些成員變量,這就基本上實(shí)現(xiàn)對(duì)象的封裝,就很容易找出要分配到這個(gè)類(lèi)上的方法了,就基本上算是會(huì)面向?qū)ο蟮木幊塘?。把握一個(gè)原則:把對(duì)同一事物進(jìn)行操作的方法和相關(guān)的方法放在同一個(gè)類(lèi)中,把方法和它操作的數(shù)據(jù)放在同一個(gè)類(lèi)中。

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

      抽象:

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

      class Person{

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

      繼承:

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

      多態(tài):

      多態(tài)是指程序中定義的引用變量所指向的具體類(lèi)型和通過(guò)該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒底會(huì)指向哪個(gè)類(lèi)的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類(lèi)中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類(lèi),這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類(lèi)實(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指向的具體類(lèi)實(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ī)制是什么?

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

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

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

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

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

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

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

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

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

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

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

      public abstract class BaseServlet extends HttpServlet{

      public final void service(HttpServletRequest

      request,HttpServletResponse

      response)

      throws IOExcetion,ServletException { 記錄訪問(wèn)日志 進(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;//注意訪問(wèn)權(quán)限定義成protected,顯得既專(zhuān)業(yè),又嚴(yán)謹(jǐn),因?yàn)樗菍?zhuān)門(mén)給子類(lèi)用的 }

      public class MyServlet1 extends BaseServlet { protected

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

      備注:這道題的思路是先從總體解釋抽象類(lèi)和接口的基本概念,然后再比較兩者的語(yǔ)法細(xì)節(jié),最后再說(shuō)兩者的應(yīng)用區(qū)別。比較兩者語(yǔ)法細(xì)節(jié)區(qū)別的條理是:先從一個(gè)類(lèi)中的構(gòu)造方法、普通成員變量和方法(包括抽象方法),靜態(tài)變量和方法,繼承性等6個(gè)方面逐一去比較回答,接著從第三者繼承的角度的回答,特別是最后用了一個(gè)典型的例子來(lái)展現(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)槌橄蟮姆椒ㄊ且蛔宇?lèi)實(shí)現(xiàn)的,而static與子類(lèi)扯不上關(guān)系!

      native方法表示該方法要用另外一種依賴平臺(tái)的編程語(yǔ)言實(shí)現(xiàn)的,不存在著被子類(lèi)實(shí)現(xiàn)的問(wèn)題,所以,它也不能是抽象的,不能與abstract混用。例如,F(xiàn)ileOutputSteam類(lèi)要硬件打交道,底層的實(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)用別人寫(xiě)的c語(yǔ)言函數(shù),我們是無(wú)法直接調(diào)用的,我們需要按照java的要求寫(xiě)一個(gè)c語(yǔ)言的函數(shù),又我們的這個(gè)c語(yǔ)言函數(shù)去調(diào)用別人的c語(yǔ)言函數(shù)。由于我們的c語(yǔ)言函數(shù)是按java的要求來(lái)寫(xiě)的,我們這個(gè)c語(yǔ)言函數(shù)就可以與java對(duì)接上,java那邊的對(duì)接方式就是定義出與我們這個(gè)c函數(shù)相對(duì)應(yīng)的方法,java中對(duì)應(yīng)的方法不需要寫(xiě)具體的代碼,但需要在前面聲明native。

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

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

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

      public class Outer {

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

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

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

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

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

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

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

      public class Outer {

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

      }

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

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

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

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

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

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

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

      class Outer { static int x;static class Inner {

      } }

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

      28、Anonymous Inner Class(匿名內(nèi)部類(lèi))是否可以extends(繼承)其它類(lèi),是否可以implements(實(shí)現(xiàn))interface(接口)? 可以繼承其他類(lèi)或?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)友正好問(wèn)過(guò)這個(gè)問(wèn)題,我覺(jué)得挺有趣,就研究了一下,沒(méi)想到今天還被你面到了,哈哈。

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

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

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

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

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

      通過(guò)上面的說(shuō)明,我們很容易導(dǎo)出另一個(gè)結(jié)論,如果經(jīng)常對(duì)字符串進(jìn)行各種各樣的修改,或者說(shuō),不可預(yù)見(jiàn)的修改,那么使用String來(lái)代表字符串的話會(huì)引起很大的內(nèi)存開(kāi)銷(xiāo)。因?yàn)?String對(duì)象建立之后不能再改變,所以對(duì)于每一個(gè)不同的字符串,都需要一個(gè)String對(duì)象來(lái)表示。這時(shí),應(yīng)該考慮使用StringBuffer類(lèi),它允許修改,而不是每個(gè)不同的字符串都要生成一個(gè)新的對(duì)象。并且,這兩種類(lèi)的對(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)存開(kāi)銷(xiāo)大,并且沒(méi)有意義,因?yàn)镾tring對(duì)象不可改變,所以對(duì)于內(nèi)容相同的字符串,只要一個(gè)String對(duì)象來(lái)表示就可以了。也就說(shuō),多次調(diào)用上面的構(gòu)造器創(chuàng)建多個(gè)對(duì)象,他們的String類(lèi)型屬性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ì)象,無(wú)論內(nèi)容是否相同。

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

      32、是否可以繼承String類(lèi)? String類(lèi)是final類(lèi)故不可以繼承。

      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每寫(xiě)一遍,就創(chuàng)建一個(gè)新的對(duì)象,它一句那個(gè)常量”xyz”對(duì)象的內(nèi)容來(lái)創(chuàng)建出一個(gè)新String對(duì)象。如果以前就用過(guò)’xyz’,這句代表就不會(huì)創(chuàng)建”xyz”自己了,直接從緩沖區(qū)拿。

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

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

      接著要舉一個(gè)具體的例子來(lái)說(shuō)明,我們要把1到100的所有數(shù)字拼起來(lái),組成一個(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來(lái)比較兩者執(zhí)行的時(shí)間差異,最后還要講講StringBuilder與StringBuffer的區(qū)別。

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

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

      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ù)組有沒(méi)有l(wèi)ength()這個(gè)方法? String有沒(méi)有l(wèi)ength()這個(gè)方法?

      數(shù)組沒(méi)有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,這說(shuō)明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ì)象。寫(xiě)如下兩行代碼,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ì)地說(shuō),我的答案是在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é)果的過(guò)程,好比主函數(shù)準(zhǔn)備一個(gè)空罐子,當(dāng)子函數(shù)要返回結(jié)果時(shí),先把結(jié)果放在罐子里,然后再將程序邏輯返回到主函數(shù)。所謂返回,就是子函數(shù)說(shuō),我不運(yùn)行了,你主函數(shù)繼續(xù)運(yùn)行吧,這沒(méi)什么結(jié)果可言,結(jié)果是在說(shuō)這話之前放進(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。

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

      在講解答案時(shí)可以用下面的程序來(lái)幫助分析: 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 用于聲明屬性,方法和類(lèi),分別表示屬性不可變,方法不可覆蓋,類(lèi)不可繼承。內(nèi)部類(lèi)要訪問(wèn)局部變量,局部變量必須定義成final類(lèi)型,例如,一段代碼??

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

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

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

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

      42、error和exception有什么區(qū)別? error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題。比如說(shuō)內(nèi)存溢出。不可能指望程序能處理這樣的情況。exception 表示一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題。也就是說(shuō),它表示如果程序運(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ì)象來(lái)表示,Java使用面向?qū)ο蟮姆绞絹?lái)處理異常,它把程序中發(fā)生的每個(gè)異常也都分別封裝到一個(gè)對(duì)象來(lái)表示的,該對(duì)象中包含有異常的信息。

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

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

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

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

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

      所謂系統(tǒng)異常,就是?..,它們都是RuntimeException的子類(lèi),在jdk doc中查RuntimeException類(lèi),就可以看到其所有的子類(lèi)列表,也就是看到了所有的系統(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子類(lèi)對(duì)象的run方法,new Thread(){}表示一個(gè)Thread的匿名子類(lèi)的實(shí)例對(duì)象,子類(lèi)加上run方法后的代碼如下: new Thread(){ public void run(){ } }.start();

      第二種:

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

      從java5開(kāi)始,還有如下一些線程池創(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子類(lèi),即new SubThread()。第二種調(diào)用runnable的run方法。

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

      反對(duì)使用stop(),是因?yàn)樗话踩K鼤?huì)解除由線程獲取的所有鎖定,而且如果對(duì)象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問(wèn)題所在。suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時(shí)候,目標(biāo)線程會(huì)停下來(lái),但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線程都不能訪問(wèn)鎖定的資源,除非被”掛起“的線程恢復(fù)運(yùn)行。對(duì)任何線程來(lái)說(shuō),如果它們想恢復(fù)目標(biāo)線程,同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會(huì)造成死鎖。所以不應(yīng)該使用suspend(),而應(yīng)在自己的Thread類(lèi)中置入一個(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是線程類(lèi)(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖。wait是Object類(lèi)的方法,對(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í)間過(guò)后,cpu才會(huì)回到這個(gè)線程上繼續(xù)往下執(zhí)行,如果當(dāng)前線程進(jìn)入了同步鎖,sleep方法并不會(huì)釋放鎖,即使當(dāng)前線程使用sleep方法讓出了cpu,但其他被同步鎖擋住了的線程也無(wú)法得到執(zhí)行。wait是指在一個(gè)已經(jīng)進(jìn)入了同步鎖的線程內(nèi),讓自己暫時(shí)讓出同步鎖,以便其他正在等待此鎖的線程可以得到同步鎖并運(yùn)行,只有其他線程調(diào)用了notify方法(notify并不釋放鎖,只是告訴調(diào)用過(guò)wait方法的線程可以去參與獲得鎖的競(jìng)爭(zhēng)了,但不是馬上得到鎖,因?yàn)殒i還在別人手里,別人還沒(méi)釋放。如果notify方法后面的代碼還有很多,需要這些代碼執(zhí)行完后才會(huì)釋放鎖,可以在notfiy方法后增加一個(gè)等待和一些代碼,看看效果),調(diào)用wait方法的線程就會(huì)解除wait狀態(tài)和程序可以再次得到鎖后繼續(xù)向下運(yùn)行。對(duì)于wait的講解一定要配合例子代碼來(lái)說(shuō)明,才顯得自己真明白。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){ //釋放鎖有兩種方式,第一種方式是程序自然離開(kāi)監(jiān)視器的范圍,也就是離開(kāi)了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沒(méi)有釋放鎖,所以Thread1無(wú)法得不到鎖。

      }

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

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

      當(dāng)應(yīng)用程序在對(duì)象上調(diào)用了一個(gè)需要花費(fèi)很長(zhǎng)時(shí)間來(lái)執(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類(lèi)與實(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)鍵字,如果沒(méi)加,則能。2.如果這個(gè)方法內(nèi)部調(diào)用了wait,則可以進(jìn)入其他synchronized方法。

      3.如果其他個(gè)方法都加了synchronized關(guān)鍵字,并且內(nèi)部沒(mé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í)行多段程序呢?這是從宏觀上來(lái)看的,cpu一會(huì)執(zhí)行a線索,一會(huì)執(zhí)行b線索,切換時(shí)間很快,給人的感覺(jué)是a,b在同時(shí)執(zhí)行,好比大家在同一個(gè)辦公室上網(wǎng),只有一條鏈接到外部網(wǎng)線,其實(shí),這條網(wǎng)線一會(huì)為a傳數(shù)據(jù),一會(huì)為b傳數(shù)據(jù),由于切換時(shí)間很短暫,所以,大家感覺(jué)都在同時(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方法可以非阻塞方式去拿鎖。舉例說(shuō)明(對(duì)下面的題用lock進(jìn)行了改寫(xiě)): package com.huawei.interview;

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

      public class ThreadTest { 4.如果其他方法是static,它用的同步鎖是當(dāng)前類(lèi)的字節(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。寫(xiě)出程序。

      以下程序使用內(nèi)部類(lèi)實(shí)現(xiàn)線程,對(duì)j增減的時(shí)候沒(méi)有考慮順序問(wèn)題。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

      } } }

      ----------隨手再寫(xiě)的一個(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)寫(xiě)出程序。

      最終的程序代碼如下: 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++)

      }

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

      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ù)來(lái)實(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í)便談,只要讓別覺(jué)得你知識(shí)淵博,理解透徹即可。

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

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

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

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

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

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

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

      HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,在只有一個(gè)線程訪問(wèn)的情況下,效率要高于Hashtable。HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許。

      HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。Hashtable繼承自Dictionary類(lèi),而HashMap是Java1.2引進(jìn)的Map interface的一個(gè)實(shí)現(xiàn)。

      最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問(wèn)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主要從三方面來(lái)說(shuō)。

      一.歷史原因:Hashtable是基于陳舊的Dictionary類(lèi)的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn) 二.同步性:Hashtable是線程安全的,也就是說(shuō)是同步的,而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ù)是沒(méi)有順序的,其鍵是不能重復(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)集合中沒(méi)有某個(gè)元素,此時(shí)add方法可成功加入該元素時(shí),則返回true,當(dāng)集合含有與某個(gè)元素equals相等的元素時(shí),此時(shí)add方法無(wú)法加入該元素,返回結(jié)果為false。Set取元素時(shí),沒(méi)法說(shuō)取第幾個(gè),只能以Iterator接口取得所有的元素,再逐一遍歷各個(gè)元素。List表示有先后順序的集合,注意,不是那種按年齡、按大小、按價(jià)格之類(lèi)的排序。當(dāng)我們多次調(diào)用add(Obj e)方法時(shí),每次加入的對(duì)象就像火車(chē)站買(mǎi)票有排隊(duì)順序一樣,按先來(lái)后到的順序排序。有時(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)來(lái)明確說(shuō)明取第幾個(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 以特定次序來(lái)持有元素,可有重復(fù)元素。Set 無(wú)法擁有重復(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,這些問(wèn)題感謝以前一個(gè)叫崔健的學(xué)員提出,最后通過(guò)查看源代碼給他解釋清楚,看本次培訓(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、說(shuō)出ArrayList,Vector, LinkedList的存儲(chǔ)性能和特性

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

      LinkedList也是線程不安全的,LinkedList提供了一些方法,使得LinkedList可以被當(dāng)作堆棧和隊(duì)列來(lái)使用。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是集合類(lèi)的上級(jí)接口,繼承與他的接口主要有Set 和List.Collections是針對(duì)集合類(lèi)的一個(gè)幫助類(lèi),他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程安全化等操作。67、Set里的元素是不能重復(fù)的,那么用什么方法來(lái)區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別? Set里的元素是不能重復(fù)的,元素重復(fù)與否是使用equals()方法進(jìn)行判斷的。

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

      68、你所知道的集合類(lèi)都有哪些?主要方法?

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

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

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

      Propeties?HashTable

      我記的不是方法名,而是思想,我知道它們都有增刪改查的方法,但這些方法的具體名稱(chēng),我記得不是很清楚,對(duì)于set,大概的方法是add,remove, contains;對(duì)于map,大概的方法就是put,remove,contains等,因?yàn)?,我只要在eclispe下按點(diǎn)操作符,很自然的這些方法就出來(lái)了。我記住的一些思想就是List類(lèi)會(huì)有g(shù)et(int index)這樣的方法,因?yàn)樗梢园错樞蛉≡?,而set類(lèi)中沒(méi)有g(shù)et(int index)這樣的方法。List和set都可以迭代出所有元素,迭代時(shí)先要得到一個(gè)iterator對(duì)象,所以,set和list類(lèi)都有一個(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沒(méi)有什么關(guān)系了,這時(shí)候hashcode不等是可以的,例如arrayList存儲(chǔ)的對(duì)象就不用實(shí)現(xiàn)hashcode,當(dāng)然,我們沒(méi)有理由不實(shí)現(xiàn),通常都會(huì)去實(shí)現(xiàn)的。

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

      (應(yīng)該是沒(méi)有針對(duì)問(wèn)題的確切的答案,當(dāng)前的add方法放入的是哪個(gè)對(duì)象,就調(diào)用哪個(gè)對(duì)象的compareTo方法,至于這個(gè)compareTo方法怎么做,就看當(dāng)前這個(gè)對(duì)象的類(lèi)中是如何編寫(xiě)這個(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、說(shuō)出一些常用的類(lèi),包,接口,請(qǐng)各舉5個(gè)

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

      常用的類(lèi):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中有幾種類(lèi)型的流?JDK為每種類(lèi)型的流提供了一些抽象類(lèi)以供繼承,請(qǐng)說(shuō)出他們分別是哪些類(lèi)?

      字節(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)一的方式來(lái)完成這些操作,用一種抽象的方式進(jìn)行描述,這個(gè)抽象描述方式起名為IO流,對(duì)應(yīng)的抽象類(lèi)為OutputStream和InputStream,不同的實(shí)現(xiàn)類(lèi)就代表不同的輸入和輸出設(shè)備,它們都是針對(duì)字節(jié)進(jìn)行操作的。在應(yīng)用中,經(jīng)常要完全是字符的一段文本輸出去或讀進(jìn)來(lái),用字節(jié)流可以嗎?計(jì)算機(jī)中的一切最終都是二進(jìn)制的字節(jié)形式存在。對(duì)于“中國(guó)”這些字符,首先要得到其對(duì)應(yīng)的字節(jié),然后將字節(jié)寫(xiě)入到輸出流。讀取時(shí),首先讀到的是字節(jié),可是我們要把它顯示為字符,我們需要將字節(jié)轉(zhuǎn)換成字符。由于這樣的需求很廣泛,人家專(zhuān)門(mén)提供了字符流的包裝類(lèi)。

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

      字符向字節(jié)轉(zhuǎn)換時(shí),要注意編碼的問(wèn)題,因?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ǔ)到硬盤(pán)或者傳送給網(wǎng)絡(luò)上的其他計(jì)算機(jī),這個(gè)過(guò)程我們可以自己寫(xiě)代碼去把一個(gè)java對(duì)象變成某個(gè)格式的字節(jié)流再傳輸,但是,jre本身就提供了這種支持,我們可以調(diào)用OutputStream的writeObject方法來(lái)做,如果要讓java 幫我們做,要被傳輸?shù)膶?duì)象必須實(shí)現(xiàn)serializable接口,這樣,javac編譯時(shí)就會(huì)進(jìn)行特殊處理,編譯的類(lèi)才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的類(lèi)必須實(shí)現(xiàn)Serializable接口,該接口是一個(gè)mini接口,其中沒(méi)有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的。

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

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

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

      java的內(nèi)存分為兩類(lèi),一類(lèi)是棧內(nèi)存,一類(lè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)問(wèn)題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動(dòng)監(jiān)測(cè)對(duì)象是否超過(guò)作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語(yǔ)言沒(méi)有提供釋放已分配內(nèi)存的顯示操作方法。

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

      Java語(yǔ)言中一個(gè)顯著的特點(diǎn)就是引入了垃圾回收機(jī)制,使c++程序員最頭疼的內(nèi)存管理的問(wèn)題迎刃而解,它使得Java程序員在編寫(xiě)程序的時(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í)間沒(méi)有使用的對(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來(lái)說(shuō),當(dāng)程序員創(chuàng)建對(duì)象時(shí),GC就開(kāi)始監(jiān)控這個(gè)對(duì)象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對(duì)象。通過(guò)這種方式確定哪些對(duì)象是”可達(dá)的“,哪些對(duì)象是”不可達(dá)的“。當(dāng)GC確定一些對(duì)象為”不可達(dá)“時(shí),GC就有責(zé)任回收這些內(nèi)存空間??梢?。程序員可以手動(dòng)執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語(yǔ)言規(guī)范并不保證GC 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(斷言)在軟件開(kāi)發(fā)中是一種常用的調(diào)試方式,很多開(kāi)發(fā)語(yǔ)言中都支持這種機(jī)制。在實(shí)現(xiàn)中,assertion就是在程序中的一條語(yǔ)句,它對(duì)一個(gè)boolean表達(dá)式進(jìn)行檢查,一個(gè)正確程序必須保證這個(gè)boolean表達(dá)式的值為true;如果該值為false,說(shuō)明程序已經(jīng)處于不正確的狀態(tài)下,assert將給出警告或退出。一般來(lái)說(shuō),assertion用于保證程序最基本、關(guān)鍵的正確性。assertion檢查通常在開(kāi)發(fā)和測(cè)試時(shí)開(kāi)啟。為了提高性能,在軟件發(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)的問(wè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)景,通俗地說(shuō),就是程序員可能創(chuàng)建了一個(gè)對(duì)象,以后一直不再使用這個(gè)對(duì)象,這個(gè)對(duì)象卻一直被引用,即這個(gè)對(duì)象無(wú)用但是卻無(wú)法被垃圾回收器回收的,這就是java中可能出現(xiàn)內(nèi)存泄露的情況,例如,緩存系統(tǒng),我們加載了一個(gè)對(duì)象放在緩存中(例如放在一個(gè)全局map對(duì)象中),然后一直不再使用它,這個(gè)對(duì)象一直被緩存引用,但卻不再被使用。

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

      如果一個(gè)外部類(lèi)的實(shí)例對(duì)象的方法返回了一個(gè)內(nèi)部類(lèi)的實(shí)例對(duì)象,這個(gè)內(nèi)部類(lèi)對(duì)象被長(zhǎng)期引用了,即使那個(gè)外部類(lèi)實(shí)例對(duì)象不再被使用,但由于內(nèi)部類(lèi)持久外部類(lèi)的實(shí)例對(duì)象,這個(gè)外部類(lèi)對(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)容來(lái)自于網(wǎng)上(主要特點(diǎn)就是清空堆棧中的某個(gè)元素,并不是徹底把它從數(shù)組中拿掉,而是把存儲(chǔ)的總數(shù)減少,本人寫(xiě)得可以比這個(gè)好,在拿掉某個(gè)元素時(shí),順便也讓它從數(shù)組中消失,將那個(gè)元素所在的位置的值設(shè)置為null即可):

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

      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è)元素,然后全部彈出來(lái),雖然堆棧是空的,沒(méi)有我們要的東西,但是這是個(gè)對(duì)象是無(wú)法回收的,這個(gè)才符合了內(nèi)存泄露的兩個(gè)條件:無(wú)用,無(wú)法回收。

      但是就是存在這樣的東西也不一定會(huì)導(dǎo)致什么樣的后果,如果這個(gè)堆棧用的比較少,也就浪費(fèi)了幾個(gè)K內(nèi)存而已,反正我們的內(nèi)存都上G了,哪里會(huì)有什么影響,再說(shuō)這個(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,就一直存在到程序退出,但是我們也可以看到它有自愈功能,就是說(shuō)如果你的Stack最多有100個(gè)對(duì)象,那么最多也就只有100個(gè)對(duì)象無(wú)法被回收其實(shí)這個(gè)應(yīng)該很容易理解,Stack內(nèi)部持有100個(gè)引用,最壞的情況就是他們都是無(wú)用的,因?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)致無(wú)法從HashSet集合中單獨(dú)刪除當(dāng)前對(duì)象,造成內(nèi)存泄露。

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

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

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

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

      (下面的例如主要是便于大家學(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,而該類(lèi)中沒(méi)有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ò)。局部變量前不能放置任何訪問(wèn)修飾符(private,public,和protected)。final可以用來(lái)修飾局部變量(final如同abstract和strictfp,都是非訪問(wèn)修飾符,strictfp只能修飾class和method而非variable)。3.abstract class Something {

      private abstract String doSomething();} 這好像沒(méi)什么錯(cuò)吧? 答案: 錯(cuò)。abstract的methods不能以private修飾。abstract的methods就是讓子類(lèi)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封鎖起來(lái)呢?(同理,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的問(wèn)題,這有錯(cuò)嗎? 答案: 正確。在addOne method中,參數(shù)o被修飾成final。如果在addOne method里我們修改了o的reference(比如: o = new Other();),那么如同上例這題也是錯(cuò)的。但這里修改的是o的member vairable(成員變量),而o的reference并沒(méi)有改變。6.class Something {

      int i;

      public void doSomething(){

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

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

      答案: 正確。輸出的是”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沒(méi)有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沒(méi)有什么問(wèn)題,畢竟兩個(gè)methods都在同一個(gè)class里。但仔細(xì)看,main是static的。static method不能直接call non-static methods??筛某伞盨ystem.out.println(“s.doSomething()returns ” + s.doSomething());“。同理,static method不能訪問(wèn)non-static instant variable。9.此處,Something類(lèi)的文件名叫OtherThing.java class Something {

      private static void main(String[] something_to_do){

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

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

      答案: 正確。從來(lái)沒(méi)有人說(shuō)過(guò)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ì)于父類(lèi)的變量,可以用super.x來(lái)明確,而接口的屬性默認(rèn)隱含為 public static final.所以可以通過(guò)A.x來(lái)明確。11.interface Playable {

      void play();} interface Bounceable {

      void play();} interface Rollable extends Playable, Bounceable {

      Ball ball = new Ball(”P(pán)ingPang“);} 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“沒(méi)有問(wèn)題。interface可繼承多個(gè)interfaces,所以這里沒(méi)錯(cuò)。問(wèn)題出在interface Rollable里的”Ball ball = new Ball(“PingPang”);“。任何在interface里聲明的interface variable(接口變量,也可稱(chēng)成員變量),默認(rèn)為public static final。也就是說(shuō)”Ball ball = new Ball(“PingPang”);“實(shí)際上是”public static final Ball ball = new Ball(“PingPang”);“。在Ball類(lèi)的Play()方法中,”ball = new Ball(“Football”);“改變了ball的reference,而這里的ball來(lái)自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改變r(jià)eference的。因此編譯器將在”ball = new Ball(“Football”);“這里顯示有錯(cuò)。二.算法與編程

      1、編寫(xiě)一個(gè)程序,將a.txt文件中的單詞與b.txt文件中的單詞交替合并到c.txt文件中,a.txt文件中的單詞用回車(chē)符分隔,b.txt文件中用回車(chē)或空格進(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、編寫(xiě)一個(gè)程序,將d:java目錄下的所有.java文件復(fù)制到d:jad目錄下,并將原來(lái)文件的擴(kuò)展名從.java改為.jad。(大家正在做上面這道題,網(wǎng)上遲到的朋友也請(qǐng)做做這道題,找工作必須能編寫(xiě)這些簡(jiǎn)單問(wèn)題的代碼?。?/p>

      答:listFiles方法接受一個(gè)FileFilter對(duì)象,這個(gè)FileFilter對(duì)象就是過(guò)慮的策略對(duì)象,不同的人提供不同的FileFilter實(shí)現(xiàn),即提供了不同的過(guò)濾策略。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。

      //要在硬盤(pán)中準(zhǔn)確地創(chuàng)建出一個(gè)文件,需要知道文件名和文件的目錄。//方法接受的參數(shù)類(lèi)型盡量面向父類(lèi),越抽象越好,這樣適應(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、編寫(xiě)一個(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愛(ài)中華abc我愛(ài)傳智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ù)字字符原來(lái)是出題者放的煙霧彈。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é)員表述不清楚,問(wèn)題很可能是:

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

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

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

      我有很多個(gè)(假設(shè)10萬(wàn)個(gè))數(shù)據(jù)要保存起來(lái),以后還需要從保存的這些數(shù)據(jù)中檢索是否存在某個(gè)數(shù)據(jù),(我想說(shuō)出二叉樹(shù)的好處,該怎么說(shuō)呢?那就是說(shuō)別人的缺點(diǎn)),假如存在數(shù)組中,那么,碰巧要找的數(shù)字位于99999那個(gè)地方,那查找的速度將很慢,因?yàn)橐獜牡?個(gè)依次往后取,取出來(lái)后進(jìn)行比較。平衡二叉樹(shù)(構(gòu)建平衡二叉樹(shù)需要先排序,我們這里就不作考慮了)可以很好地解決這個(gè)問(wèn)題,但二叉樹(shù)的遍歷(前序,中序,后序)效率要比數(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)寫(xiě)的代碼---------------------------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]);

      下載2014電訊盈科java面試筆試試題-_-(最終5篇)word格式文檔
      下載2014電訊盈科java面試筆試試題-_-(最終5篇).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)范文推薦

        2009銀監(jiān)會(huì)筆試面試試題

        然后下面為2009年銀監(jiān)分局,銀監(jiān)局機(jī)關(guān),銀監(jiān)會(huì)的面試真題和部分專(zhuān)業(yè)題,供大家參考。 2009年2月8號(hào)安徽各地銀監(jiān)分局的IT類(lèi)面試題,第一時(shí)間發(fā)出供大家參考。 1、介紹一下你的個(gè)人......

        java程序員(筆試)

        筆試 一. 選擇題 1. 從“員工”表的“姓名”字段中找出名字包含“瑪麗”的人,下面的哪條select語(yǔ)句正確 A. Select*from 員工 where姓名 =“__瑪麗__” B. Select*from 員工 w......

        java英語(yǔ)面試試題整理(5篇材料)

        1. What are java beans? JavaBeans is a portable, platform-independent component model written in the Java programming language, developed in collaboration with......

        JAVA面試

        馬老師: 您好,昨天下午面試的中軟資源。因?yàn)楣P試時(shí)間很短(她之前并沒(méi)說(shuō)多長(zhǎng)時(shí)間,我估計(jì)就只有30多分鐘就要收卷),而且題量很大,所以沒(méi)有記下題目,不過(guò)前面的題目都很簡(jiǎn)單,主要是咱們......

        大學(xué)輔導(dǎo)員筆試面試試題精選

        一、筆試 共三個(gè)題目(任選兩題,共100分,筆試權(quán)重為30%):(1)高校輔導(dǎo)員的工作職責(zé)有哪些? (2)大學(xué)生常見(jiàn)的心理問(wèn)題有哪些?你將如何應(yīng)對(duì)? (3)如何處理學(xué)生突發(fā)事件? 這三個(gè)問(wèn)題的答案,在這個(gè)......

        大學(xué)輔導(dǎo)員筆試面試試題[推薦]

        【高校輔導(dǎo)員】筆試與面試題錦 廣西大學(xué)輔導(dǎo)員面試題四個(gè)案例題,每題25分 1. 作為09級(jí)新生班主任,如何開(kāi)第一次班會(huì)? 2.娛樂(lè)界的“艷照門(mén)”事件,海師大的“艷照門(mén)”事件,如果你是......

        高校輔導(dǎo)員筆試面試試題匯總

        一、筆試 共三個(gè)題目(任選兩題,共100分,筆試權(quán)重為30%): (1)高校輔導(dǎo)員的工作職責(zé)有哪些? 1.輔導(dǎo)員應(yīng)對(duì)所在班全面負(fù)責(zé)。輔導(dǎo)員應(yīng)經(jīng)常深入到學(xué)生中去,分析研究學(xué)生的學(xué)習(xí)情況、思想狀......

        2012年銀監(jiān)會(huì)筆試面試試題

        2009年2月8號(hào)安徽各地銀監(jiān)分局的IT類(lèi)面試題,第一時(shí)間發(fā)出供大家參考。 1、介紹一下你的個(gè)人情況,包括你的年齡,學(xué)習(xí)經(jīng)歷,工作經(jīng)歷,學(xué)習(xí)情況,工作情況等。 2、假如你進(jìn)入銀監(jiān)會(huì)工作......