java面試題(2)

學(xué)人智庫(kù) 時(shí)間:2018-02-10 我要投稿
【m.clearvueentertainment.com - 學(xué)人智庫(kù)】

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

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

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

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

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

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

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

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

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

  設(shè)計(jì):design

  模式:pattern

  框架:framework

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

  GoF設(shè)計(jì)模式

  A.創(chuàng)建模式

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

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

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

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

  設(shè)計(jì)模式之Builder

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

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

  保證一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn) 2002/10/9更新

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

  設(shè)計(jì)模式之Facade

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

  設(shè)計(jì)模式之Proxy

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

  設(shè)計(jì)模式之Adapter

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

  設(shè)計(jì)模式之Composite

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

  設(shè)計(jì)模式之Decorator

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

  設(shè)計(jì)模式之Bridge

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

  設(shè)計(jì)模式之Flyweight

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

  C.行為模式

  設(shè)計(jì)模式之Template

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

  設(shè)計(jì)模式之Memento

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

  設(shè)計(jì)模式之Observer

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

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

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

  設(shè)計(jì)模式之Command

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

  設(shè)計(jì)模式之State

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

  設(shè)計(jì)模式之Strategy

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

  設(shè)計(jì)模式之Mediator

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

  設(shè)計(jì)模式之Interpreter

  主要用來(lái)對(duì)語(yǔ)言的分析,應(yīng)用機(jī)會(huì)不多.

  設(shè)計(jì)模式之Visitor

  訪問(wèn)者在進(jìn)行訪問(wèn)時(shí),完成一系列實(shí)質(zhì)性操作,而且還可以擴(kuò)展.

  設(shè)計(jì)模式之Iterator

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

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

  Model:模型層

  View:視圖層

  Controller:控制層

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

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

  MVC如何工作

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

  視圖

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

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

  模型

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

  控制器

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

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

  為什么要使用 MVC

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

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

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

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

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

  MVC的缺點(diǎn)

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

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

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

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

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

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

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

  interface A

  {

  int x = 0;

  }

  class B

  {

  int x =1;

  }

  class C extends B implements A

  {

  public void pX()

  {

  System.out.println(x);

  }

  public static void main(String[] args) {

  new C().pX();

  }

  }

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

  下面的代碼運(yùn)行時(shí)會(huì)不會(huì)報(bào)錯(cuò)

  interface Playable

  {

  void play();

  }

  interface Bounceable

  {

  void play();

  }

  interface Rollable extends Playable, Bounceable

  {

  Ball ball = new Ball("PingPang");

  }

  class Ball implements Rollable

  {

  private String name;

  public String getName()

  {

  return name;

  }

  public Ball(String name)

  {

  this.name = name;

  }

  public void play()

  {

  ball = new Ball("Football");

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

  }

  }

  答案: 錯(cuò)。"interface 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 (接口變量,也可稱成員變量),默認(rèn)為public static final。也就是說(shuō)"Ball ball = new Ball("PingPang");"實(shí)際上是"public static final Ball ball = new Ball("PingPang");"。在Ball類的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ò)。

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

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

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

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

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

  10)請(qǐng)說(shuō)一下HTTP請(qǐng)求的基本過(guò)程(IBM)

  11)java中存在內(nèi)存泄漏問(wèn)題嗎?請(qǐng)舉例說(shuō)明?(IBM)

  會(huì)

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

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

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