java大全經典的書面採訪

果學網  -專一IT在線www.prismcollege.comhtml

一、面向對象的特徵有哪些方面   前端

1.抽象:java

抽象就是忽略一個主題中與當前目標無關的那些方面。以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題。而僅僅是選擇當中的一部分,臨時不用部分細節。抽象包含兩個方面。一是過程抽象。二是數據抽象。c++

2.繼承:git

繼承是一種聯結類的層次模型。並且贊成和鼓舞類的重用。它提供了一種明白表述共性的方法。web

對象的一個新類可以從現有的類中派生。這個過程稱爲類繼承。新類繼承了原始類的特性,新類稱爲原始類的派生類(子類)。而原始類稱爲新類的基類(父類)。面試

派生類可以從它的基類那裏繼承方法和實例變量,並且類可以改動或添加新的方法使之更適合特殊的需要。算法

3.封裝:sql

封裝是把過程和數據包圍起來,對數據的訪問僅僅能經過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列全然自治、封裝的對象,這些對象經過一個受保護的接口訪問其它對象。數據庫

4. 多態性:

多態性是指贊成不一樣類的對象對同一消息做出響應。多態性包括參數化多態性和包括多態性。多態性語言具備靈活、抽象、行爲共享、代碼共享的優點,很是好的攻克了應用程序函數同名問題。

二、String是最主要的數據類型嗎?

基本數據類型包含byte、int、char、long、float、double、boolean和short。

java.lang.String類是final類型的。所以不可以繼承這個類、不能改動這個類。

爲了提升效率節省空間,咱們應該用StringBuffer類

三、int 和 Integer 有什麼差異

Java 提供兩種不一樣的類型:引用類型和原始類型(或內置類型)。Int是java的原始數據類型,Integer是java爲int提供的封裝類。Java爲每個原始類型提供了封裝類。

原始類型封裝類

booleanBoolean

charCharacter

byteByte

shortShort

intInteger

longLong

floatFloat

doubleDouble

引用類型和原始類型的行爲全然不一樣,並且它們具備不一樣的語義。引用類型和原始類型具備不一樣的特徵和使用方法,它們包含:大小和速度問題,這樣的類型以哪一種類型的數據結構存儲,當引用類型和原始類型用做某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值爲 null,而原始類型實例變量的缺省值與它們的類型有關。

四、String 和StringBuffer的差異

JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操做字符串。即包括多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行改動。當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字符數據。

五、執行時異常與通常異常有何異同?

異常表示程序執行過程當中可能出現的非正常狀態,執行時異常表示虛擬機的一般操做中可能遇到的異常,是一種常見執行錯誤。java編譯器要求方法必須聲明拋出可能發生的非執行時異常。但是並不要求必須聲明拋出未被捕獲的執行時異常。

*六、說出Servlet的生命週期。並說出Servlet和CGI的差異。

Servlet被server實例化後,容器執行其init方法。請求到達時執行其service方法,service方法本身主動派遣執行與請求相應的doXXX方法(doGet,doPost)等。當server決定將實例銷燬的時候調用其destroy方法。

與cgi的差異在於servlet處於server進程中,它經過多線程方式執行其service方法,一個實例可以服務於多個請求,並且事實上例通常不會銷燬,而CGI對每個請求都產生新的進程,服務完畢後就銷燬。因此效率上低於servlet

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

ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便添加和插入元素,它們都贊成直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操做,因此索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),一般性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時僅僅需要記錄本項的先後項就能夠,因此插入速度較快。

八、EJB是基於哪些技術實現的?並說出SessionBean和EntityBean的差異,StatefulBean和StatelessBean的差異。

    EJB包含Session Bean、Entity Bean、Message DrivenBean,基於JNDI、RMI、JTA等技術實現。

SessionBean在J2EE應用程序中被用來完畢一些server端的業務操做,好比訪問數據庫、調用其它EJB組件。EntityBean被用來表明應用系統中用到的數據。

對於客戶機,SessionBean是一種非持久性對象。它實現某些在server上執行的業務邏輯。

對於客戶機,EntityBean是一種持久性對象。它表明一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現有企業應用程序實現的實體。

Session Bean 還可以再細分爲 Stateful Session Bean 與 Stateless SessionBean ,這兩種的 Session Bean都可以將系統邏輯放在 method之中運行,不一樣的是 Stateful SessionBean 可以記錄呼叫者的狀態,所以一般來講,一個使用者會有一個相相應的 Stateful SessionBean 的實體。Stateless SessionBean 儘管也是邏輯組件,但是他卻不負責記錄使用者狀態。也就是說當使用者呼叫 Stateless SessionBean 的時候。EJB Container 並不會找尋特定的 Stateless SessionBean 的實體來運行這個 method。

換言之,很是可能數個使用者在運行某個 Stateless SessionBean 的 methods 時,會是同一個 Bean 的 Instance 在運行。從內存方面來看。 Stateful SessionBean 與 Stateless SessionBean 比較。 Stateful SessionBean 會消耗 J2EE Server 較多的內存。然而 Stateful SessionBean 的優點卻在於他可以維持使用者的狀態。

九、Collection 和 Collections的差異。

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

Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。

十、&和&&的差異。

   &和&&均可做爲邏輯運算符「與」使用,但是&&是「短路與」,運算時先推斷符號前面的表達式的值,假設能夠肯定整個表達式的值。則不進行符號後面的表達式的運算。

另外。&也可做爲位運算符使用。

十一、HashMap和Hashtable的差異。

    HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完畢了Map接口,主要差異在於HashMap贊成空(null)鍵值(key),由於非線程安全。效率上可能高於Hashtable。

HashMap贊成將null做爲一個entry的key或者value,而Hashtable不一樣意。

HashMap把Hashtable的contains方法去掉了。改爲containsvalue和containsKey。因爲contains方法easy讓人引發誤解。

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

最大的不一樣是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時。不需要本身爲它的方法實現同步。而HashMap 就必須爲之提供外同步。

Hashtable和HashMap採用的hash/rehash算法都大概同樣,因此性能不會有很是大的差別。

十二、final, finally, finalize的差異。

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

finally是異常處理語句結構的一部分,表示老是運行。

finalizeObject類的一個方法,在垃圾收集器運行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其它資源回收,好比關閉文件等。

1三、sleep() 和 wait() 有什麼差異?

    sleep是線程類(Thread)的方法,致使此線程暫停運行指定時間。給運行機會給其它線程,但是監控狀態依舊保持,到時後會本身主動恢復。調用sleep不會釋放對象鎖。

wait是Object類的方法,對此對象調用wait方法致使本線程放棄對象鎖。進入等待此對象的等待鎖定池。僅僅有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備得到對象鎖進入執行狀態。

1四、Overload和Override的差異。Overloaded的方法可否夠改變返回值的類型?

方法的重寫Overriding和重載Overloading是Java多態性的不一樣表現。

重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。假設在子類中定義某方法與其父類有一樣的名稱和參數。咱們說該方法被重寫 (Overriding)。子類的對象使用這種方法時。將調用子類中的定義。對它而言。父類中的定義如同被"屏蔽"了。

假設在一個類中定義了多個同名的方法。它們或有不一樣的參數個數或有不一樣的參數類型,則稱爲方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

1五、error和exception有什麼差異?

error 表示恢復不是不可能但很是困難的狀況下的一種嚴重問題。比方說內存溢出。不可能期望程序能處理這種狀況。

    exception 表示一種設計或實現問題。也就是說,它表示假設程序執行正常,從不會發生的狀況。

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

假設數據將在線程間共享。好比正在寫的數據之後可能被還有一個線程讀到。或者正在讀的數據可能已經被還有一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。

當應用程序在對象上調用了一個需要花費很是長時間來運行的方法,並且不但願讓程序等待方法的返回時。就應該使用異步編程,在很是多狀況下採用異步途徑每每更有效率。

1七、abstract class和interface有什麼差異?

聲明方法的存在而不去實現它的類被叫作抽象類(abstract class),它用於要建立一個體現某些基本行爲的類。併爲該類聲明方法。但不能在該類中實現該類的狀況。不能建立abstract 類的實例。然而可以建立一個變量,其類型是一個抽象類,並讓它指向詳細子類的一個實例。

不能有抽象構造函數或抽象靜態方法。

Abstract 類的子類爲它們父類中的所有抽象方法提供實現,不然它們也是抽象類。取而代之。在子類中實現該方法。知道其行爲的其餘類可以在類中實現這些方法。

接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。

多繼承性可經過實現這種接口而得到。接口中的所有方法都是抽象的,沒有一個有程序體。接口僅僅可以定義static final成員變量。接口的實現與子類類似,除了該實現類不能從接口定義中繼承行爲。

當類實現特殊接口時。它定義(即將程序體給予)所有這種接口的方法。而後,它可以在實現了該接口的類的不論什麼對象上調用接口的方法。

由於有抽象類,它贊成使用接口名做爲引用變量的類型。

一般的動態聯編將生效。

引用可以轉換到接口類型或從接口類型轉換。instanceof運算符可以用來決定某對象的類是否實現了接口。

*1八、heap和stack有什麼差異。

棧是一種線形集合,其加入和刪除元素的操做應在同一段完畢。

棧依照後進先出的方式進行處理。

堆是棧的一個組成元素

*1九、forward 和redirect的差異

forward是server請求資源,server直接訪問目標地址的URL。把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道server發送的內容是從哪兒來的。因此它的地址欄中仍是原來的地址。

    redirect就是服務端依據邏輯,發送一個狀態碼,告訴瀏覽器又一次去請求那個地址。通常來講瀏覽器會用剛纔請求的所有參數又一次請求,因此session,request參數都可以獲取。

20、EJB與JAVA BEAN的差異?

Java Bean 是可複用的組件,對Java Bean並無嚴格的規範。理論上講。不論什麼一個Java類都可以是一個Bean。

但一般狀況下,由於Java Bean是被容器所建立(如Tomcat)的,因此JavaBean應具備一個無參的構造器,另外,一般JavaBean還要實現Serializable接口用於實現Bean的持久性。Java Bean實際上至關於微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise JavaBean 至關於DCOM,即分佈式組件。它是基於Java的遠程方法調用(RMI)技術的。因此EJB可以被遠程訪問(跨進程、跨計算機)。

但EJB必須被佈署在諸如Webspere、WebLogic這種容器中。EJB客戶從不直接訪問真正的EJB組件,而是經過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所建立和管理。客戶經過容器來訪問真正的EJB組件。

*2一、Static Nested Class 和 Inner Class的不一樣。

    Static Nested Class是被聲明爲靜態(static)的內部類。它可以不依賴於外部類實例被實例化。而一般的內部類需要在外部類實例化後才幹實例化。

2二、JSP中動態INCLUDE與靜態INCLUDE的差異?

動態INCLUDE用jsp:include動做實現 <jsp:include page="included.jsp"flush="true" />它老是會檢查所含文件裏的變化,適合用於包括動態頁面。並且可以帶參數。

靜態INCLUDE用include僞碼實現,它不會檢查所含文件的變化,適用於包括靜態頁面<%@ includefile="included.htm" %>

*2三、何時用assert。

    assertion(斷言)在軟件開發中是一種常用的調試方式。很是多開發語言中都支持這樣的機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查。一個正確程序必須保證這個boolean表達式的值爲true;假設該值爲false,說明程序已經處於不對的狀態下,系統將給出警告或退出。通常來講,assertion用於保證程序最基本、關鍵的正確性。assertion檢查一般在開發和測試時開啓。爲了提升性能,在軟件公佈後。assertion檢查通常是關閉的。

2四、GC是什麼? 爲何要有GC?

  GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員easy出現故障的地方,忘記或者錯誤的內存回收會致使程序或系統的不穩定甚至崩潰。Java提供的GC功能可以本身主動監測對象是否超過做用域從而達到本身主動回收內存的目的。Java語言沒有提供釋放已分配內存的顯示操做方法。

*2五、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

    short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)

short s1 = 1; s1 += 1;(可以正確編譯)--whyA:+=運算符無類型轉換問題!

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

    Math.round(11.5)==12

Math.round(-11.5)==-11

round方法返回與參數最接近的長整數。參數加1/2後求其floor.

*2七、String s = new String("xyz");建立了幾個String Object?

    兩個

2八、設計4個線程。當中兩個線程每次對j添加1。另外兩個線程對j每次下降1。寫出程序。

下面程序使用內部類實現線程,對j增減的時候沒有考慮順序問題。

public class ThreadTest1{

  private int j;

  public static void main(Stringargs[]){

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 voidinc(){

j++;

System.out.println(Thread.currentThread().getName()+"-inc:"+j);

  }

  private synchronized voiddec(){

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

}

 }

  }

}

2九、Java有沒有goto?

java中的保留字。現在沒有在java中使用。

30、啓動一個線程是用run()仍是start()?

啓動一個線程是調用start()方法,使線程所表明的虛擬處理機處於可執行狀態,這意味着它可以由JVM調度並執行。

這並不意味着線程就會立刻執行。run()方法可以產生必須退出的標誌來中止一個線程。

3一、EJB包含(SessionBean,EntityBean)說出他們的生命週期,及怎樣管理事務的?

SessionBean:Stateless Session Bean 的生命週期是由容器決定的,當客戶機發出請求要創建一個Bean的實例時,EJB容器不必定要建立一個新的Bean的實例供客戶機調用,而是隨便找一個現有的實例提供給客戶機。當客戶機第一次調用一個Stateful SessionBean 時,容器必須立刻在server中建立一個新的Bean實例,並關聯到客戶機上,之後此客戶機調用Stateful SessionBean 的方法時容器會把調用分派到與此客戶機相關聯的Bean實例。

EntityBean:Entity Beans能存活相對較長的時間。並且狀態是持續的。僅僅要數據庫中的數據存在。Entity beans就一直存活。

而不是依照顧用程序或者服務進程來講的。即便EJB容器崩潰了,Entity beans也是存活的。Entity Beans生命週期能夠被容器或者 Beans本身管理。

EJB經過下面技術管理實務:對象管理組織(OMG)的對象實務服務(OTS),SunMicrosystemsTransaction ServiceJTS)、JavaTransaction APIJTA),開發組(X/Open)的XA接口。

3二、應用server有那些?

BEA WebLogic Server。IBM WebSphere Application Server,Oracle9iApplication ServerjBoss。Tomcat

3三、給我一個你最多見到的runtime exception。

ArithmeticException, ArrayStoreException, BufferOverflowException,BufferUnderflowException, CannotRedoException, CannotUndoException,ClassCastException, CMMException, ConcurrentModificationException,DOMException, EmptyStackException, IllegalArgumentException,IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,ImagingOpException, IndexOutOfBoundsException, MissingResourceException,NegativeArraySizeException, NoSuchElementException,NullPointerException,ProfileDataException, ProviderException, RasterFormatException,SecurityException, SystemException, UndeclaredThrowableException,UnmodifiableSetException, UnsupportedOperationException

3四、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可繼承實體類

3五、List, Set, Map是否繼承自Collection接口?

List。Set是,Map

*3六、說出數據鏈接池的工做機制是什麼?

J2EEserver啓動時會創建必定數量的池鏈接。並一直維持很多於此數目的池鏈接。

client程序需要鏈接時。池驅動程序會返回一個未使用的池鏈接並將其標記爲「忙」。假設當前沒有空暇鏈接,池驅動程序就新建必定數量的鏈接,新建鏈接的數量由配置參數決定。當使用的池鏈接調用完畢後。池驅動程序將此鏈接表記爲「空暇」,其它調用就可以使用這個鏈接。

*3七、abstract的method是否可同一時候是static,是否可同一時候是native。是否可同一時候是synchronized?

    都不能

3八、數組有沒有length()這種方法? String有沒有length()這種方法?

數組沒有length()這種方法,有length的屬性。String有length()這種方法。

*3九、Set裏的元素是不能反覆的。那麼用什麼方法來區分反覆與否呢?

是用==仍是equals()? 它們有何差異?

Set裏的元素是不能反覆的。即不能包括兩個元素e1e2e1.equalse2))。

那麼用iterator()方法來區分反覆與否。equals()是判讀兩個Set是否相等。

    equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,爲的是當兩個分離的對象的內容和類型相配的話,返回真值。

40、構造器Constructor是否可被override?

構造器Constructor不能被繼承。所以不能重寫Overriding。但可以被重載Overloading。

4一、可否夠繼承String類?

String類是final類故不可以繼承。

4二、swtich可否做用在byte上,可否做用在long上。可否做用在String上?

switch(expr1)中。expr1是一個整數表達式。

所以傳遞給 switch case語句的參數應該是 int short char或者 byte

long,string 都不能做用於swtich。

4三、try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被運行。何時被運行,在return前仍是後?

會運行,在return前運行。

4四、編程題: 用最有效率的方法算出2乘以8等於幾?

2 << 3

4五、兩個對象值一樣(x.equals(y) == true),但卻可有不一樣的hash code。這句話對不正確?

不正確,有一樣的hash code。

4六、當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性。並可返回變化後的結果,那麼這裏到底是值傳遞仍是引用傳遞?

是值傳遞。Java 編程語言僅僅有值傳遞參數。當一個對象實例做爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。

對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。

4七、當一個線程進入一個對象的一個synchronized方法後,其餘線程是否可進入此對象的其餘方法?

不能。一個對象的一個synchronized方法僅僅能由一個線程訪問。

4八、編程題: 寫一個Singleton出來。

Singleton模式主要做用是保證在Java應用程序中。一個類Class僅僅有一個實例存在。

通常Singleton模式一般有幾種種形式:

第一種形式: 定義一個類,它的構造函數爲private的,它有一個static的private的該類變量,在類初始化時實例話,經過一個public的getInstance方法獲取對它的引用,繼而調用當中的方法。

public class Singleton {

private Singleton(){}

      //在本身內部定義本身一個實例。是否是很是奇怪?

      //注意這是private 僅僅供內部調用

      private static Singletoninstance = new Singleton();

      //這裏提供了一個供外部訪問本class的靜態方法。可以直接訪問  

      public static SingletongetInstance() {

        returninstance;   

      }

    }

    另一種形式:

public class Singleton {

  private static Singleton instance = null;

  public static synchronized Singleton getInstance() {

  //這種方法比上面有所改進,不用每次都進行生成對象,僅僅是第一次     

  //使用時生成實例,提升了效率!

  if (instance==null)

    instance=new Singleton();

return instance;   }

}

其它形式:

定義一個類,它的構造函數爲private的,所有方法爲static的。

通常以爲第一種形式要更加安全些

4九、Java的接口和C++的虛類的一樣和不一樣處。

因爲Java不支持多繼承,而有可能某個類或對象要使用分別在幾個類或對象裏面的方法或屬性。現有的單繼承機制就不能知足要求。與繼承相比。接口有更高的靈活性,因爲接口中沒有不論什麼實現代碼。當一個類實現了接口之後,該類要實現接口裏面所有的方法和屬性,並且接口裏面的屬性在默認狀態如下都是public static,所有方法默認狀況下是public.一個類可以實現多個接口。

50、Java中的異常處理機制的簡單原理和應用。

當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示爲一個異常。違反語義規則包含2種狀況。

一種是JAVA類庫內置的語義檢查。好比數組下標越界,會引起IndexOutOfBoundsException;訪問null的對象時會引起NullPointerException。

還有一種狀況就是JAVA贊成程序猿擴展這樣的語義檢查,程序猿可以建立本身的異常。並自由選擇在什麼時候用throwkeyword引起異常。所有的異常都是java.lang.Thowable的子類。

5一、垃圾回收的長處和原理。並考慮2種回收機制。

Java語言中一個顯著的特色就是引入了垃圾回收機制,使c++程序猿最頭疼的內存管理的問題迎刃而解,它使得Java程序猿在編敲代碼的時候再也不需要考慮內存管理。

由於有個垃圾回收機制,Java中的對象再也不有"做用域"的概念,僅僅有對象的引用纔有"做用域"。

垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是做爲一個單獨的低級別的線程執行,不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序猿不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。

5二、請說出你所知道的線程同步的方法。

wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。

sleep():使一個正在執行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。

notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候。並不能確切的喚醒某一個等待狀態的線程,而是由JVM肯定喚醒哪一個線程,而且不是按優先級。

Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

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

最常用的集合類是 List 和 Map。 List 的詳細實現包含 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、存儲和操做不論什麼類型對象的元素列表。 List 適用於按數值索引訪問元素的情形。

Map 提供了一個更通用的元素存儲方法。 Map 集合類用於存儲元素對(稱做"鍵"和"值"),當中每個鍵映射到一個值。

5四、描寫敘述一下JVM載入class文件的原理機制?

JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java執行時系統組件。它負責在執行時查找和裝入類文件的類。

5五、char型變量中能不能存貯一箇中文漢字?

爲何?

能夠定義成爲一箇中文的,因爲java中以unicode編碼,一個char佔16個字節。因此放一箇中文是沒問題的

5六、多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?

多線程有兩種實現方法,各自是繼承Thread類與實現Runnable接口

同步的實現方面有兩種,各自是synchronized,wait與notify

5七、JSP的內置對象及方法。

request表示HttpServletRequest對象。它包括了有關瀏覽器請求的信息,並且提供了幾個用於獲取cookie, header, 和session數據的實用的方法。

    response表示HttpServletResponse對象,並提供了幾個用於設置送回 瀏覽器的響應的方法(如cookies,頭信息等)

    out對象是javax.jsp.JspWriter的一個實例,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。

    pageContext表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取各類範圍的名字空間、servlet相關的對象的API。並且包裝了通用的servlet相關功能的方法。

    session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態信息

    applicaton 表示一個javax.servle.ServletContext對象。

這有助於查找有關servlet引擎和servlet環境的信息

    config表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet實例的初始化參數。

    page表示從該頁面產生的一個servlet實例

5八、線程的基本概念、線程的基本狀態以及狀態之間的關係

線程指在程序運行過程當中。能夠運行程序代碼的一個運行單位,每個程序至少都有一個線程。也就是程序自己。

Java中的線程有四種狀態各自是:執行、就緒、掛起、結束。

5九、JSP的常用指令

<%@page language="java"contenType="text/html;charset=gb2312" session="true"buffer="64kb" autoFlush="true"isThreadSafe="true" info="text"errorPage="error.jsp" isErrorPage="true"isELIgnored="true" pageEncoding="gb2312"import="java.sql.*"%>

isErrorPage(可否使用Exception對象)。isELIgnored(是否忽略表達式)

<%@include file="filename"%>

<%@taglib prefix="c"uri="http://......"%>

60、什麼狀況下調用doGet()和doPost()?

Jsp頁面中的form標籤裏的method屬性爲get時調用doGet(),爲post時調用doPost()。

6一、servlet的生命週期

web容器載入servlet。生命週期開始。經過調用servlet的init()方法進行servlet的初始化。經過調用service()方法實現。依據請求的不一樣調用不一樣的do***()方法。

結束服務,web容器調用servlet的destroy()方法。

6二、怎樣現實servlet的單線程模式

<%@ page isThreadSafe="false"%>

6三、頁面間對象傳遞的方法

request,session,application,cookie等

6四、JSP和Servlet有哪些一樣點和不一樣點,他們之間的聯繫是什麼?

JSP是Servlet技術的擴展,本質上是Servlet的簡易方式。更強調應用的外表表達。JSP編譯後是"類servlet"。Servlet和JSP最基本的不一樣點在於,Servlet的應用邏輯是在Java文件裏。並且全然從表示層中的HTML裏分離開來。

而JSP的狀況是Java和HTML可以組合成一個擴展名爲.jsp的文件。JSP側重於視圖。Servlet主要用於控制邏輯。

6五、四種會話跟蹤技術

會話做用域ServletsJSP 頁面描寫敘述

page否是表明與一個頁面相關的對象和屬性。

一個頁面由一個編譯好的 Java servlet 類(可以帶有不論什麼的 include 指令,但是沒有 include 動做)表示。這既包含 servlet 又包含被編譯成 servlet 的 JSP 頁面

request是是表明與 Web 客戶機發出的一個請求相關的對象和屬性。

一個請求可能跨越多個頁面,涉及多個 Web 組件(由於 forward 指令和 include 動做的關係)

session是是表明與用於某個 Web 客戶機的一個用戶體驗相關的對象和屬性。一個 Web 會話可以也經常會跨越多個客戶機請求

application是是表明與整個 Web 應用程序相關的對象和屬性。

這實質上是跨越整個 Web 應用程序,包含多個頁面、請求和會話的一個全局做用域

6六、Request對象的主要方法:

setAttribute(String name,Object):設置名字爲name的request的參數值

getAttribute(String name):返回由name指定的屬性值

getAttributeNames():返回request對象所有屬性的名字集合,結果是一個枚舉的實例

getCookies():返回client的所有Cookie對象,結果是一個Cookie數組

getCharacterEncoding():返回請求中的字符編碼方式

getContentLength():返回請求的Body的長度

getHeader(String name):得到HTTP協議定義的文件頭信息

getHeaders(String name):返回指定名字的request Header的所有值,結果是一個枚舉的實例

getHeaderNames():返回因此request Header的名字,結果是一個枚舉的實例

getInputStream():返回請求的輸入流。用於得到請求中的數據

getMethod():得到client向server端傳送數據的方法

getParameter(String name):得到client傳送給server端的有name指定的參數值

getParameterNames():得到client傳送給server端的所有參數的名字,結果是一個枚舉的實例

getParameterValues(String name):得到有name指定的參數的所有值

getProtocol():獲取client向server端傳送數據所根據的協議名稱

getQueryString():得到查詢字符串

getRequestURI():獲取發出請求字符串的client地址

getRemoteAddr():獲取client的IP地址

getRemoteHost():獲取client的名字

getSession([Boolean create]):返回和請求相關Session

getServerName():獲取server的名字

getServletPath():獲取client所請求的腳本文件的路徑

getServerPort():獲取server的port號

removeAttribute(String name):刪除請求中的一個屬性

6七、J2EE是技術仍是平臺仍是框架?

    J2EE自己是一個標準。一個爲企業分佈式應用的開發提供的標準平臺。

    J2EE也是一個框架,包含JDBC、JNDI、RMI、JMS、EJB、JTA等技術。

6八、咱們在web應用開發過程當中經常遇到輸出某種編碼的字符,如iso8859-1等,怎樣輸出一個某種編碼的字符串?

  Public String translate (String str) {

    String tempStr ="";

    try {

      tempStr = newString(str.getBytes("ISO-8859-1"), "GBK");

      tempStr = tempStr.trim();

    }

    catch (Exception e) {

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

    }

    return tempStr;

  }

6九、簡述邏輯操做(&,|,^)與條件操做(&&,||)的差異。

差異主要答兩點:a.條件操做僅僅能操做布爾型的,而邏輯操做不只可以操做布爾型,而且可以操做數值型

b.邏輯操做不會產生短路

70、XML文檔定義有幾種形式?它們之間有何本質差異?解析XML文檔有哪幾種方式?

a: 兩種形式 dtd  schema。b: 本質差異:schema自己是xml的,可以被XML解析器解析(這也是從DTD上發展schema的根本目的),c:有DOM,SAX,STAX等

    DOM:處理大型文件時其性能降低的很厲害。這個問題是由DOM的樹結構所形成的,這樣的結構佔用的內存較多,而且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問

SAX:不現於DOM,SAX是事件驅動型的XML解析方式。

它順序讀取XML文件。不需要一次全部裝載整個文件。

當遇到像文件開頭,文檔結束。或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問

    STAX:Streaming API for XML(StAX)

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

主要一樣點:Lock能完畢synchronized所實現的所有功能

主要不一樣點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會本身主動釋放鎖,而Lock必定要求程序猿手工釋放,並且必須在finally從句中釋放。

7二、EJB的角色和三個對象

一個完整的基於EJB的分佈式計算結構由六個角色組成,這六個角色可以由不一樣的開發商提供,每個角色所做的工做必須遵循Sun公司提供的EJB規範,以保證彼此之間的兼容性。這六個角色各自是EJB組件開發人員(Enterprise BeanProvider) 、應用組合者(Application Assembler)、部署者(Deployer)、EJB server提供者(EJB ServerProvider)、EJB 容器提供者(EJB Container Provider)、系統管理員(System Administrator)

三個對象是Remote(Local)接口、Home(LocalHome)接口,Bean類

7三、EJB容器提供的服務

主要提供聲明週期管理、代碼產生、持續性管理、安全、事務管理、鎖和併發行管理等服務。

7四、EJB規範規定EJB中禁止的操做有哪些?

    1.不能操做線程和線程API(線程API指非線程對象的方法如notify,wait等),2.不能操做awt。3.不能實現server功能,4.不能對靜態屬生存取。5.不能使用IO操做直接存取文件系統,6.不能載入本地庫.,7.不能將this做爲變量和返回,8.不能循環調用。

7五、remote接口和home接口主要做用

remote接口定義了業務方法,用於EJBclient調用業務方法。

home接口是EJB工廠用於建立和移除查找EJB實例

7六、bean 實例的生命週期

對於Stateless Session Bean、Entity Bean、Message Driven Bean通常存在緩衝池管理,而對於Entity Bean和Statefull Session Bean存在Cache管理,一般包括建立實例。設置上下文、建立EJB Object(create)、業務方法調用、remove等過程,對於存在緩衝池管理的Bean。在create以後實例並不從內存清除。而是採用緩衝池調度機制不斷重用實例,而對於存在Cache管理的Bean則經過激活和去激活機制保持Bean的狀態並限制內存中實例數量。

7七、EJB的激活機制

以Stateful Session Bean 爲例:其Cache大小決定了內存中可以同一時候存在的Bean實例的數量,依據MRU或NRU算法,實例在激活和去激活狀態之間遷移。激活機制是當client調用某個EJB實例業務方法時。假設相應EJB Object發現本身沒有綁定相應的Bean實例則從其去激活Bean存儲中(經過序列化機制存儲實例)回覆(激活)此實例。

狀態變遷前會調用相應的ejbActive和ejbPassivate方法。

7八、EJB的幾種類型

會話(Session)Bean ,實體(Entity)Bean 消息驅動的(Message Driven)Bean

會話Bean又可分爲有狀態(Stateful)和無狀態(Stateless)兩種

實體Bean可分爲Bean管理的持續性(BMP)和容器管理的持續性(CMP)兩種

7九、客服端調用EJB對象的幾個基本步驟

設置JNDI服務工廠以及JNDI服務地址系統屬性,查找Home接口,從Home接口調用Create方法建立Remote接口,經過Remote接口調用其業務方法。

80、怎樣給weblogic指定大小的內存?

在啓動Weblogic的腳本中(位於所在Domian相應server文件夾下的startServerName),添加set MEM_ARGS=-Xms32m-Xmx200m,可以調整最小內存爲32M,最大200M

8一、怎樣設定的weblogic的熱啓動模式(開發模式)與產品公佈模式?

可以在管理控制檯中改動相應server的啓動模式爲開發或產品模式之中的一個。

或者改動服務的啓動文件或者commenv文件。添加setPRODUCTION_MODE=true。

8二、怎樣啓動時不需輸入username與password?

改動服務啓動文件。添加 WLS_USER和WLS_PW項。也可以在boot.properties文件裏添加加密過的username和password.

8三、在weblogic管理制臺中對一個應用域(或者說是一個站點,Domain)進行jms及ejb或鏈接池等相關信息進行配置後,實際保存在什麼文件裏?

保存在此Domain的config.xml文件裏。它是server的核心配置文件。

8四、說說weblogic中一個Domain的缺省文件夾結構?

比方要將一個簡單的helloWorld.jsp放入何文件夾下,然的在瀏覽器上就可打入http://主機:port號//helloword.jsp就可以看到執行結果了?

又比方這當中用到了一個本身寫的javaBean該怎樣辦?

Domain文件夾\server文件夾\applications,將應用文件夾放在此文件夾下將可以做爲應用訪問。假設是Web應用,應用文件夾需要知足Web應用文件夾要求,jsp文件可以直接放在應用文件夾中。Javabean需要放在應用文件夾的WEB-INF文件夾的classes文件夾中,設置server的缺省應用將可以實現在瀏覽器上無需輸入應用名。

8五、在weblogic中公佈ejb需涉及到哪些配置文件

不一樣類型的EJB涉及的配置文件不一樣。都涉及到的配置文件包含ejb-jar.xml,weblogic-ejb-jar.xmlCMP實體Bean通常還需要weblogic-cmp-rdbms-jar.xml

8六、怎樣在weblogic中進行ssl配置與client的認證配置或說說j2ee(標準)進行ssl的配置

缺省安裝中使用DemoIdentity.jks和DemoTrust.jks  KeyStore實現SSL,需要配置server使用Enable SSL。配置其port,在產品模式下需要從CA獲取私有密鑰和數字證書,建立identity和trust keystore。裝載得到的密鑰和數字證書。

可以配置此SSL鏈接是單向仍是雙向的。

8七、怎樣查看在weblogic中已經公佈的EJB?

可以使用管理控制檯,在它的Deployment中可以查看所有已公佈的EJB

8八、CORBA是什麼?用途是什麼?

CORBA 標準是公共對象請求代理結構(Common Object Request Broker Architecture),由對象管理組織 (ObjectManagement Group。縮寫爲 OMG)標準化。

它的組成是接口定義語言(IDL), 語言綁定(binding:也譯爲聯編)和贊成應用程序間互操做的協議。

其目的爲:用不一樣的程序設計語言書寫在不一樣的進程中執行,爲不一樣的操做系統開發。

8九、說說你所熟悉或據說過的j2ee中的幾種常用模式?及對設計模式的一些見解

  Session Facade Pattern:使用SessionBean訪問EntityBean

Message Facade Pattern:實現異步調用

EJB Command Pattern:使用Command JavaBeans代替SessionBean,實現輕量級訪問

Data Transfer Object Factory:經過DTO Factory簡化EntityBean數據提供特性

Generic Attribute Access:經過AttibuteAccess接口簡化EntityBean數據提供特性

Business Interface:經過遠程(本地)接口和Bean類實現一樣接口規範業務邏輯一致性

EJB架構的設計好壞將直接影響系統的性能、可擴展性、可維護性、組件可重用性及開發效率。項目越複雜。項目隊伍越龐大則越能體現良好設計的重要性。

90、說說在weblogic中開發消息Bean時的persistent與non-persisten的區別

persistent方式的MDB可以保證消息傳遞的可靠性,也就是假設EJB容器出現故障而JMSserver依舊會將消息在此MDB可用的時候發送過來,而non-persistent方式的消息將被丟棄。

9一、Servlet運行時通常實現哪幾個方法?

public void init(ServletConfig config)

public ServletConfig getServletConfig()

public String getServletInfo()

public void service(ServletRequest request,ServletResponse response)

public void destroy()

9二、j2ee常用的設計模式?說明工廠模式。

    Java中的23種設計模式:

Factory(工廠模式),      Builder(建造模式),       Factory Method(工廠方法模式),

Prototype(原始模型模式),Singleton(單例模式),    Facade(門面模式)。

Adapter(適配器模式)。    Bridge(橋樑模式)。        Composite(合成模式),

Decorator(裝飾模式),    Flyweight(享元模式),     Proxy(代理模式),

Command(命令模式)。     Interpreter(解釋器模式), Visitor(訪問者模式),

Iterator(迭代子模式),   Mediator(調停者模式),    Memento(備忘錄模式),

Observer(觀察者模式),   State(狀態模式),         Strategy(策略模式),

Template Method(模板方法模式)。 Chain Of Responsibleity(責任鏈模式)

工廠模式:工廠模式是一種經常被使用到的模式,依據工廠模式實現的類可以依據提供的數據生成一組類中某一個類的實例,一般這一組類有一個公共的抽象父類並且實現了一樣的方法,但是這些方法針對不一樣的數據進行了不一樣的操做。

首先需要定義一個基類,該類的子類經過不一樣的方法實現了基類中的方法。

而後需要定義一個工廠類,工廠類可以依據條件生成不一樣的子類實例。當獲得子類的實例後,開發者可以調用基類中的方法而沒必要考慮究竟返回的是哪個子類的實例。

9三、EJB需直接實現它的業務接口或Home接口嗎。請簡述理由。

遠程接口和Home接口不需要直接實現,他們的實現代碼是由server產生的,程序執行中相應實現類會做爲相應接口類型的實例被使用。

9四、排序都有哪幾種方法?請列舉。用JAVA實現一個高速排序。

    排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、高速排序),選擇排序(直接選擇排序、堆排序),歸併排序。分配排序(箱排序、基數排序)

高速排序的僞代碼。

/ /使用高速排序方法對a[ 0 :n- 1 ]排序

從a[ 0 :n- 1 ]中選擇一個元素做爲m i d d l e,該元素爲支點

把餘下的元素切割爲兩段left 和r i g h t,使得l e f t中的元素都小於等於支點,而right 中的元素都大於等於支點

遞歸地使用高速排序方法對left 進行排序

遞歸地使用高速排序方法對right 進行排序

所得結果爲l e f t + m i d d l e + r i g h t

9五、請對下面在J2EE中常用的名詞進行解釋(或簡單描寫敘述)

web容器:給處於當中的應用程序組件(JSP。SERVLET)提供一個環境,使JSP,SERVLET直接更容器中的環境變量接口交互,沒必要關注其餘系統問題。

主要有WEBserver來實現。

好比:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵照J2EE規範中的WEB APPLICATION 標準。咱們把遵照以上標準的WEBserver就叫作J2EE中的WEB容器。

EJB容器:Enterprise java bean 容器。

更具備行業領域特點。

他提供給執行在當中的組件EJB各類管理功能。

僅僅要知足J2EE規範的EJB放入該容器。當即就會被容器進行高效率的管理。

並且可以經過現成的接口來得到系統級別的服務。好比郵件服務、事務管理。

JNDI:(Java Naming & Directory Interface)JAVA命名文件夾服務。主要提供的功能是:提供一個文件夾系統。讓其餘各地的應用程序在其上面留下本身的索引,從而知足高速查找和定位分佈式應用程序的功能。

JMS:(Java Message Service)JAVA消息服務。主要實現各個應用程序之間的通信。包含點對點和廣播。

JTA:(Java Transaction API)JAVA事務服務。提供各類分佈式事務服務。應用程序僅僅需調用其提供的接口就能夠。

JAF:(Java Action FrameWork)JAVA安全認證框架。

提供一些安全控制方面的框架。讓開發人員經過各類部署和本身定義實現本身的個性安全控制策略。

RMI/IIOP:(Remote Method Invocation /internet對象請求中介協議)他們主要用於經過遠程調用服務。好比。遠程有一臺計算機上執行一個程序。它提供股票分析服務,咱們可以在本地計算機上實現對其直接調用。

固然這是要經過必定的規範才幹在異構的系統之間進行通訊。RMI是JAVA特有的。

9六、JAVA語言怎樣進行異常處理,keyword:throws,throw,try,catch,finally分別表明什麼意義?在try塊中可以拋出異常嗎?

Java經過面向對象的方法進行異常處,把各類不一樣的異常進行分類,並提供了良好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其餘子類的實例。

當一個方法出現異常後便拋出一個異常對象,該對象中包括有異常信息,調用這個對象的方法可以捕獲到這個異常並進行處理。Java的異常處理是經過5個關鍵詞來實現的:try、catch、throw、throws和finally。普通狀況下是用try來運行一段程序,假設出現異常,系統會拋出(throws)一個異常,這時候你可以經過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器來處理。

用try來指定一塊預防所有"異常"的程序。緊跟在try程序後面。應包括一個catch子句來指定你想要捕捉的"異常"的類型。

throw語句用來明白地拋出一個"異常"。

throws用來標明一個成員函數可能拋出的各類"異常"。

Finally爲確保一段代碼不管發生什麼"異常"都被運行一段代碼。

可以在一個成員函數調用的外面寫一個try語句,在這個成員函數內部寫還有一個try語句保護其它代碼。

每當遇到一個try語句,"異常"的框架就放到堆棧上面,直到所有的try語句都完畢。假設下一級的try語句沒有對某種"異常"進行處理。堆棧就會展開。直到遇到有處理這樣的"異常"的try語句。

9七、一個".java"源文件裏可否夠包含多個類(不是內部類)?有什麼限制?

可以。必須僅僅有一個類名與文件名稱一樣。

9八、MVC的各個部分都有那些技術來實現?怎樣實現?

MVC是Model-View-Controller的簡寫。"Model" 表明的是應用的業務邏輯(經過JavaBean,EJB組件實現)。 "View" 是應用的表示面(由JSP頁面產生),"Controller"是提供應用的處理過程控制(一般是一個Servlet),經過這樣的設計模型把應用邏輯。處理過程和顯示邏輯分紅不一樣的組件實現。

這些組件可以進行交互和重用。

9九、java中有幾種方法可以實現一個線程?用什麼keyword修飾同步方法?

stop()和suspend()方法爲什麼不推薦使用?

有兩種實現方法,各自是繼承Thread類與實現Runnable接口

用synchronizedkeyword修飾同步方法

反對使用stop(),是因爲它不安全。它會解除由線程獲取的所有鎖定。而且假設對象處於一種不連貫狀態,那麼其它線程能在那種狀態下檢查和改動它們。

結果很是難檢查出真正的問題所在。

suspend()方法easy發生死鎖。調用suspend()的時候。目標線程會停下來,但卻仍然持有在這以前得到的鎖定。

此時。其它不論什麼線程都不能訪問鎖定的資源。除非被"掛起"的線程恢復執行。

對不論什麼線程來講。假設它們想恢復目標線程,同一時候又試圖使用不論什麼一個鎖定的資源,就會形成死鎖。

因此不該該使用suspend(),而應在本身的Thread類中置入一個標誌,指出線程應該活動仍是掛起。若標誌指出線程應該掛起。便用wait()命其進入等待狀態。若標誌指出線程應當恢復。則用一個notify()又一次啓動線程。

100、java中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,請說出他們各自是哪些類?

字節流,字符流。

字節流繼承於InputStream \ OutputStream,字符流繼承於InputStreamReader\ OutputStreamWriter。在java.io包中還有更多的流,主要是爲了提升性能和使用方便。

10一、java中會存在內存泄漏嗎。請簡單描寫敘述。

會。如:int i,i2; return (i-i2);   //when i爲足夠大的正數,i2爲足夠大的負數。結果會形成溢位,致使錯誤。

10二、java中實現多態的機制是什麼?

方法的重寫Overriding和重載Overloading是Java多態性的不一樣表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。

10三、垃圾回收器的基本原理是什麼?垃圾回收器可以當即回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收?

對於GC來講,當程序猿建立對象時。GC就開始監控這個對象的地址、大小以及使用狀況。

一般。GC採用有向圖的方式記錄和管理堆(heap)中的所有對象。

經過這樣的方式肯定哪些對象是"可達的"。哪些對象是"不可達的"。

當GC肯定一些對象爲"不可達"時。GC就有責任回收這些內存空間。可以。程序猿可以手動運行System.gc()。通知GC運行,但是Java語言規範並不保證GC必定會運行。

10四、靜態變量和實例變量的差異?

static i = 10; //常量

   class A a;  a.i =10;//可變

10五、什麼是java序列化。怎樣實現java序列化?

序列化就是一種用來處理對象流的機制。所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操做時所引起的問題。

序列化的實現:將需要被序列化的類實現Serializable接口。該接口沒有需要實現的方法,implementsSerializable僅僅是爲了標註該對象是可被序列化的,而後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象。接着,使用ObjectOutputStream對象的writeObject(Objectobj)方法就可以將參數爲obj的對象寫出(即保存其狀態)。要恢復的話則用輸入流。

10六、可否夠從一個static方法內部發出對非static方法的調用?

不可以,假設當中包括對象的method();不能保證對象初始化.

10七、寫clone()方法時,一般都有一行代碼。是什麼?

Clone 有缺省行爲。super.clone();他負責產生正確大小的空間,並逐位複製。

10八、在JAVA中。怎樣跳出當前的多重嵌套循環?

用break; return 方法。

10九、List、Map、Set三個接口,存取元素時,各有什麼特色?

List 以特定次序來持有元素,可有反覆元素。Set 沒法擁有反覆元素,內部排序。Map 保存key-value值,value可多值。

1十、J2EE是什麼?

J2EE是Sun公司提出的多層(multi-diered),分佈式(distributed),基於組件(component-base)的企業級應用模型(enterprieseapplication model).在這種一個應用系統中,可依照功能劃分爲不一樣的組件,這些組件又可在不一樣計算機上,並且處於對應的層次(tier)中。所屬層次包含客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。

1十一、UML方面

標準建模語言UML。用例圖,靜態圖(包含類圖、對象圖和包圖),行爲圖,交互圖(順序圖,合做圖),實現圖。

1十二、說出一些常用的類。包,接口。請各舉5個

常用的類:BufferedReader BufferedWriter  FileReader  FileWirter String  Integer

常用的包:java.lang java.awt  java.io  java.util java.sql

常用的接口:Remote List  Map  Document NodeList

11三、開發中都用到了那些設計模式?

用在什麼場合?

每個模式都描寫敘述了一個在咱們的環境中不斷出現的問題。而後描寫敘述了該問題的解決方式的核心。經過這樣的方式。你可以無數次地使用那些已有的解決方式,無需在反覆一樣的工做。主要用到了MVC的設計模式。

用來開發JSP/Servlet或者J2EE的相關應用。

簡單工廠模式等。

11四、jsp有哪些動做?做用各自是什麼?

JSP共同擁有下面6種基本動做 jsp:include:在頁面被請求的時候引入一個文件。

jsp:useBean:尋找或者實例化一個JavaBean。 jsp:setProperty:設置JavaBean的屬性。 jsp:getProperty:輸出某個JavaBean的屬性。 jsp:forward:把請求轉到一個新的頁面。 jsp:plugin:依據瀏覽器類型爲Java插件生成OBJECT或EMBED標記。

11五、Anonymous Inner Class (匿名內部類) 可否夠extends(繼承)其餘類,可否夠implements(實現)interface(接口)?

可以繼承其它類或完畢其它接口。在swing編程中常用此方式。

11六、應用server與WEB SERVER的差異?

應用server:Weblogic、Tomcat、Jboss

WEB SERVER:IIS、 Apache

11七、BS與CS的聯繫與差異。

C/S是Client/Server的縮寫。

server一般採用高性能的PC、工做站或小型機,並採用大型數據庫系統,如Oracle、Sybase、Informix或 SQL Server。client需要安裝專用的client軟件。

B/S是Brower/Server的縮寫。客戶機上僅僅要安裝一個瀏覽器(Browser),如Netscape Navigator或Internet Explorer,server安裝Oracle、Sybase、Informix或 SQL Server等數據庫。在這樣的結構下,用戶界面全然經過WWW瀏覽器實現。一部分事務邏輯在前端實現,但是主要事務邏輯在server端實現。瀏覽器經過Web Server 同數據庫進行數據交互。

C/S 與 B/S 差異:

1.硬件環境不一樣:

  C/S 通常創建在專用的網絡上, 小範圍裏的網絡環境, 局域網之間再經過專門server提供鏈接和數據交換服務.

  B/S 創建在廣域網之上的, 沒必要是專門的網絡硬件環境,例與電話上網, 租用設備. 信息本身管理. 有比C/S更強的適應範圍, 通常僅僅要有操做系統和瀏覽器便可

2.對安全要求不一樣

  C/S 通常面向相對固定的用戶羣, 對信息安全的控制能力很是強. 通常高度機密的信息系統採用C/S 結構適宜. 可以經過B/S公佈部分可公開信息.

  B/S 創建在廣域網之上, 對安全的控制能力相對弱, 可能面向不可知的用戶。

3.對程序架構不一樣

  C/S 程序可以更加註重流程, 可以對權限多層次校驗, 對系統執行速度可以較少考慮.

  B/S 對安全以及訪問速度的多重的考慮, 創建在需要更加優化的基礎之上. 比C/S有更高的要求 B/S結構的程序架構是發展的趨勢, 從MS的.Net系列的BizTalk 2000Exchange 2000等, 全面支持網絡的構件搭建的系統. SUN 和IBM推的JavaBean 構件技術等,使 B/S更加成熟.

4.軟件重用不一樣

  C/S 程序可以不可避免的整體性考慮, 構件的重用性不如在B/S要求下的構件的重用性好.

  B/S 對的多重結構,要求構件相對獨立的功能. 能夠相對較好的重用.就入買來的餐桌能夠再利用,而不是作在牆上的石頭桌子

5.系統維護不一樣 

  C/S 程序由於整體性, 必須整體考察, 處理出現的問題以及系統升級. 升級難. 多是再作一個全新的系統

  B/S 構件組成,方面構件個別的更換,實現系統的無縫升級. 系統維護開銷減到最小.用戶從網上本身下載安裝就可以實現升級.

6.處理問題不一樣

  C/S 程序可以處理用戶面固定, 並且在一樣區域, 安全要求高需求, 與操做系統相關. 應該都是一樣的系統

  B/S 創建在廣域網上, 面向不一樣的用戶羣, 分散地域, 這是C/S沒法做到的. 與操做系統平臺關係最小.

7.用戶接口不一樣

  C/S 可能是創建的Window平臺上,表現方法有限,對程序猿廣泛要求較高

  B/S 創建在瀏覽器上, 有更加豐富和生動的表現方式與用戶交流. 並且大部分難度減低,減低開發成本.

8.信息流不一樣

  C/S 程序一般是典型的中央集權的機械式處理, 交互性相對低

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

11八、LINUX下線程。GDI類的解釋。

LINUX實現的就是基於核心輕量級進程的"一對一"線程模型,一個線程實體相應一個核心輕量級進程。而線程之間的管理在覈外函數庫中實現。

GDI類爲圖像設備編程接口類庫。

11九、STRUTS的應用(如STRUTS架構)

Struts是採用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源代碼的framework。 採用Struts能開發出基於MVC(Model-View-Controller)設計模式的應用構架。 Struts有例如如下的主要功能: 一.包括一個controller servlet。能將用戶的請求發送到對應的Action對象。

二.JSP自由tag庫。並且在controller servlet中提供關聯支持,幫助開發員建立交互式表單應用。

三.提供了一系列有用對象:XML處理、經過Java reflectionAPIs本身主動處理JavaBeans屬性、國際化的提示和消息。

120、Jdo是什麼?

JDO是Java對象持久化的新的規範,爲java data object的簡稱,也是一個用於存取某種數據倉庫中的對象的標準化API。JDO提供了透明的對象存儲,所以對開發者來講,存儲數據對象全然不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工做已經轉移到JDO產品提供商身上,使開發者解脫出來,從而集中時間和精力在業務邏輯上。

另外,JDO很是靈活,因爲它可以在不論什麼數據底層上執行。JDBC僅僅是面向關係數據庫(RDBMS)JDO更通用,提供到不論什麼數據底層的存儲功能。比方關係數據庫、文件、XML以及對象數據庫(ODBMS)等等。使得應用可移植性更強。

12一、內部類可以引用他包括類的成員嗎?有沒有什麼限制?

一個內部類對象可以訪問建立它的外部類對象的內容

12二、WEB SERVICE名詞解釋。JSWDL開發包的介紹。JAXP、JAXM的解釋。

SOAP、UDDI,WSDL解釋。

Web ServiceWeb Service是基於網絡的、分佈式的模塊化組件,它運行特定的任務,遵照詳細的技術規範,這些規範使得Web Service能與其它兼容的組件進行互操做。

JAXP(Java API for XML Parsing) 定義了在Java中使用DOM, SAX, XSLT的通用的接口。

這樣在你的程序中你僅僅要使用這些通用的接口。當你需要改變詳細的實現時候也不需要改動代碼。

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

WSDL是一種 XML 格式。用於將網絡服務描寫敘述爲一組端點,這些端點對包括面向文檔信息或面向過程信息的消息進行操做。

這樣的格式首先對操做和消息進行抽象描寫敘述,而後將其綁定到詳細的網絡協議和消息格式上以定義端點。相關的詳細端點即組合成爲抽象端點(服務)。

SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用於交換XML編碼信息的輕量級協議。

UDDI 的目的是爲電子商務創建標準。UDDI是一套基於Web的、分佈式的、爲Web Service提供的、信息註冊中心的實現標準規範,同一時候也包括一組使企業能將自身提供的Web Service註冊,以使別的企業能夠發現的訪問協議的實現標準。

 

 

JAVA代碼查錯

1.

abstract class Name {

   private String name;

   public abstract booleanisStupidName(String name) {}

}

大俠們。這有何錯誤?

答案: 錯。abstract method必須以分號結尾。且不帶花括號。

2.

public class Something {

   void doSomething () {

       private String s ="";

       int l = s.length();

   }

}

有錯嗎?

答案: 錯。局部變量前不能放置不論什麼訪問修飾符 (private,public。和protected)。final可以用來修飾局部變量

(final如同abstract和strictfp,都是非訪問修飾符,strictfp僅僅能修飾class和method而非variable)。

3.

abstract class Something {

   private abstract StringdoSomething ();

}

這好像沒什麼錯吧?

答案: 錯。

abstract的methods不能以private修飾。

abstract的methods就是讓子類implement(實現)詳細細節的,怎麼可以用private把abstract

method封鎖起來呢? (同理。abstract method前不能加final)。

4.

public class Something {

   public int addOne(final int x){

       return ++x;

   }

}

這個比較明顯。

答案: 錯。

int x被修飾成final。意味着x不能在addOne method中被改動。

5.

public class Something {

   public static voidmain(String[] args) {

       Other o = new Other();

       new Something().addOne(o);

   }

   public void addOne(final Othero) {

       o.i++;

   }

}

class Other {

   public int i;

}

和上面的很是類似,都是關於final的問題。這有錯嗎?

答案: 正確。

在addOne method中,參數o被修飾成final。假設在addOne method裏咱們改動了o的reference

(比方: o = new Other();)。那麼如同上例這題也是錯的。但這裏改動的是o的member vairable

(成員變量)。而o的reference並無改變。

6.

class Something {

    int i;

    public void doSomething() {

       System.out.println("i = " + i);

    }

}

有什麼錯呢?

看不出來啊。

答案: 正確。

輸出的是"i = 0"。

int i屬於instant variable (實例變量,或叫成員變量)。

instant variable有default value。int的default value是0。

7.

class Something {

    final int i;

    public void doSomething() {

       System.out.println("i = " + i);

    }

}

和上面一題僅僅有一個地方不一樣,就是多了一個final。

這難道就錯了嗎?

答案: 錯。

final int i是個final的instant variable (實例變量,或叫成員變量)。final的instant variable沒有default value,必須在constructor (構造器)結束以前被賦予一個明白的值。可以改動爲"final int i= 0;"。

8.

public class Something {

     public static voidmain(String[] args) {

        Something s = newSomething();

       System.out.println("s.doSomething() returns " +doSomething());

    }

    public String doSomething() {

        return "Do something...";

    }

}

 看上去很是完美。

答案: 錯。

看上去在main裏call doSomething沒有什麼問題,畢竟兩個methods都在同一個class裏。

但細緻看。main是static的。static method不能直接call non-staticmethods。可改爲"System.out.println("s.doSomething()returns " + s.doSomething());"。同理,static method不能訪問non-static instantvariable。

9.

此處,Something類的文件名稱叫OtherThing.java

class Something {

    private static void main(String[]something_to_do) {       

       System.out.println("Do something ...");

    }

}

 這個好像很是明顯。

答案: 正確。歷來沒有人說過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 voidmain(String[] args) {

      new C().pX();

   }

}

答案:錯誤。在編譯時會錯誤發生(錯誤描寫敘述不一樣的JVM有不一樣的信息,意思就是未明白的x調用,兩個x都匹配(就象在同一時候import java.util和java.sql兩個包時直接聲明Date同樣)。

對於父類的變量,可以用super.x來明白,而接口的屬性默認隱含爲 publicstatic final.因此可以經過A.x來明白。

11.

interface Playable {

    void play();

}

interface Bounceable {

    void play();

}

interface Rollable extends Playable, Bounceable {

    Ball ball = newBall("PingPang");

}

class Ball implements Rollable {

    private String name;

    public String getName() {

        return name;

    }

    public Ball(String name) {

        this.name = name;       

    }

   public void play() {

        ball = newBall("Football");

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

    }

}

這個錯誤不easy發現。

答案: 錯。

"interface Rollable extends Playable, Bounceable"沒有問題。interface可繼承多個interfaces,因此這裏沒錯。問題出在interface Rollable裏的"Ball ball =new Ball("PingPang");"。不論什麼在interface裏聲明的interface variable(接口變量,也可稱成員變量),默以爲public staticfinal。也就是說"Ball ball =new Ball("PingPang");"其實是"public static finalBall ball = new Ball("PingPang");"。在Ball類的Play()方法中。"ball = newBall("Football");"改變了ball的reference,而這裏的ball來自Rollable interface。Rollable interface裏的ball是public staticfinal的。final的object是不能被改變reference的。所以編譯器將在"ball = newBall("Football");"這裏顯示有錯。

 

 

JAVA編程題

1.現在輸入n個數字。以逗號。分開;而後可選擇升或者降序排序;按提交鍵就在還有一頁面顯示按什麼排序,結果爲,提供reset

import java.util.*;

public class bycomma{

 public static String[]splitStringByComma(String source){

  if(source==null||source.trim().equals(""))

    return null;

   StringTokenizer commaToker =new StringTokenizer(source,",");

   String[] result = newString[commaToker.countTokens()];

   int i=0;

  while(commaToker.hasMoreTokens()){

    result[i] =commaToker.nextToken();

    i++;

   }

   return result;

 }

 public static void main(Stringargs[]){

 String[] s =splitStringByComma("5,8,7,4,3,9,1");

 int[] ii = new int[s.length];

 for(int i =0;i<s.length;i++){

 ii[i] =Integer.parseInt(s[i]);

 }

    Arrays.sort(ii);

    //asc

    for(int i=0;i<s.length;i++){

    System.out.println(ii[i]);

    }

    //desc

    for(inti=(s.length-1);i>=0;i--){

    System.out.println(ii[i]);

    }

 }

}

2.金額轉換,阿拉伯數字的金額轉換成中國傳統的形式如:(¥1011)->(一千零一拾一元整)輸出。

package test.format;

import java.text.NumberFormat;

import java.util.HashMap;

public class SimpleMoneyFormat {

  public static final StringEMPTY = "";

  public static final String ZERO= "零";

  public static final String ONE= "壹";

  public static final String TWO= "貳";

  public static final StringTHREE = "叄";

  public static final String FOUR= "肆";

  public static final String FIVE= "伍";

  public static final String SIX= "陸";

  public static final StringSEVEN = "柒";

  public static final StringEIGHT = "捌";

  public static final String NINE= "玖";

  public static final String TEN= "拾";

  public static final StringHUNDRED = "佰";

  public static final StringTHOUSAND = "仟";

  public static final StringTEN_THOUSAND = "萬";

  public static final StringHUNDRED_MILLION = "億";

  public static final String YUAN= "元";

  public static final String JIAO= "角";

  public static final String FEN= "分";

  public static final String DOT= ".";

 

  private staticSimpleMoneyFormat formatter = null;

  private HashMapchineseNumberMap = new HashMap();

  private HashMapchineseMoneyPattern = new HashMap();

  private NumberFormatnumberFormat = NumberFormat.getInstance();

 

  private SimpleMoneyFormat() {

   numberFormat.setMaximumFractionDigits(4);

   numberFormat.setMinimumFractionDigits(2);

   numberFormat.setGroupingUsed(false);

 

    chineseNumberMap.put("0",ZERO);

   chineseNumberMap.put("1", ONE);

   chineseNumberMap.put("2", TWO);

   chineseNumberMap.put("3", THREE);

   chineseNumberMap.put("4", FOUR);

   chineseNumberMap.put("5", FIVE);

   chineseNumberMap.put("6", SIX);

    chineseNumberMap.put("7",SEVEN);

   chineseNumberMap.put("8", EIGHT);

   chineseNumberMap.put("9", NINE);

    chineseNumberMap.put(DOT,DOT);

 

   chineseMoneyPattern.put("1", TEN);

   chineseMoneyPattern.put("2", HUNDRED);

   chineseMoneyPattern.put("3", THOUSAND);

   chineseMoneyPattern.put("4", TEN_THOUSAND);

   chineseMoneyPattern.put("5", TEN);

   chineseMoneyPattern.put("6", HUNDRED);

   chineseMoneyPattern.put("7", THOUSAND);

   chineseMoneyPattern.put("8", HUNDRED_MILLION);

  }

 

  public static SimpleMoneyFormatgetInstance() {

    if (formatter == null)

      formatter = newSimpleMoneyFormat();

    return formatter;

  }

 

  public String format(StringmoneyStr) {

    checkPrecision(moneyStr);

    String result;

    result = convertToChineseNumber(moneyStr);

    result =addUnitsToChineseMoneyString(result);

    return result;

  }

 

  public String format(doublemoneyDouble) {

    returnformat(numberFormat.format(moneyDouble));

  }

 

  public String format(intmoneyInt) {

    return format(numberFormat.format(moneyInt));

  }

 

  public String format(longmoneyLong) {

    returnformat(numberFormat.format(moneyLong));

  }

 

  public String format(NumbermoneyNum) {

    returnformat(numberFormat.format(moneyNum));

  }

 

  private String convertToChineseNumber(StringmoneyStr) {

    String result;

    StringBuffercMoneyStringBuffer = new StringBuffer();

    for (int i = 0; i <moneyStr.length(); i++) {

     cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i +1)));

    }

    //拾佰仟萬億等都是漢字裏面纔有的單位,加上它們

    int indexOfDot =cMoneyStringBuffer.indexOf(DOT);

    int moneyPatternCursor = 1;

    for (int i = indexOfDot - 1;i > 0; i--) {

     cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY +moneyPatternCursor));

      moneyPatternCursor =moneyPatternCursor == 8 ? 1 : moneyPatternCursor + 1;

    }

 

    String fractionPart =cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf("."));

   cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."),cMoneyStringBuffer.length());

    while(cMoneyStringBuffer.indexOf("零拾") != -1) {

     cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"),cMoneyStringBuffer.indexOf("零拾") + 2, ZERO);

    }

    while(cMoneyStringBuffer.indexOf("零佰") != -1) {

      cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"),cMoneyStringBuffer.indexOf("零佰") + 2, ZERO);

    }

    while(cMoneyStringBuffer.indexOf("零仟") != -1) {

     cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"),cMoneyStringBuffer.indexOf("零仟") + 2, ZERO);

    }

    while(cMoneyStringBuffer.indexOf("零萬") != -1) {

     cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零萬"),cMoneyStringBuffer.indexOf("零萬") + 2, TEN_THOUSAND);

    }

    while(cMoneyStringBuffer.indexOf("零億") != -1) {

      cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零億"),cMoneyStringBuffer.indexOf("零億") + 2,HUNDRED_MILLION);

    }

    while(cMoneyStringBuffer.indexOf("零零") != -1) {

     cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"),cMoneyStringBuffer.indexOf("零零") + 2, ZERO);

    }

    if(cMoneyStringBuffer.lastIndexOf(ZERO) == cMoneyStringBuffer.length() - 1)

     cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1,cMoneyStringBuffer.length());

   cMoneyStringBuffer.append(fractionPart);

 

    result =cMoneyStringBuffer.toString();

    return result;

  }

 

 

  private StringaddUnitsToChineseMoneyString(String moneyStr) {

    String result;

    StringBuffercMoneyStringBuffer = new StringBuffer(moneyStr);

    int indexOfDot =cMoneyStringBuffer.indexOf(DOT);

   cMoneyStringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN);

 

 

 

 

 

 

 

 

找工做要面試,有面試就有對付面試的辦法。下面一些題目來自我和我朋友痛苦的面試經歷。提這些問題的公司包含IBM, E*Trade, Siebel, Motorola, SUN, 以及其餘大小公司。



  面試是沒什麼道理可講的,它的題目有的不合情理、脫離實際。有在紙上寫的。有當面考你的,也有在電話裏問的,給你IDE的預計很是少(不然你趕快去買彩票, 說不定中)。因此假設你看完此文後。請不要抱怨說這些問題都能用IDE來解決。你必須在不論什麼狀況下準確回答這些問題。在面試中假設出現一兩題回答不許確很是 有可能你就被拒之門外了。

固然這些都是Java的基本題,那些面試的人大多數不會問你Hibernate有多先進,Eclipse的三個組成部分,或command design pattern,他們都是老一輩了,最喜歡問的就是基礎知識。別小看了這些基礎,我朋友水平一流,結果就栽在一到基礎知識的問題下。和高薪無緣。

好了廢話少說。開始正題。


如下是答案

第一,談談final,finally, finalize的差異。

final?

修飾符(keyword)假設一個類被聲明爲final,意味着它不能再派生出新的子類,不能做爲父類被繼承。所以一個類不能既被聲明爲 abstract的,又被聲明爲final的。將變量或方法聲明爲final,可以保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在之後的引用中僅僅能讀取,不可改動。

被聲明爲final的方法也相同僅僅能使用,不能重載

finally?再異常處理時提供 finally 塊來運行不論什麼清除操做。假設拋出一個異常,那麼相匹配的 catch 子句就會運行,而後控制就會進入 finally 塊(假設有的話)。
finalize?方法名。

Java 技術贊成使用 finalize() 方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做。這種方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,所以所有的類都繼承了它。

子類覆蓋 finalize() 方法以整理系統資源或者運行其它清理工做。finalize() 方法是在垃圾收集器刪除對象以前對這個對象調用的。

第二,Anonymous Inner Class (匿名內部類) 可否夠extends(繼承)其餘類,可否夠implements(實現)interface(接口)?



匿名的內部類是沒有名字的內部類。不能extends(繼承) 其餘類。但一個內部類可以做爲一個接口,由還有一個內部類實現。

第三,StaticNested Class 和 InnerClass的不一樣。說得越多越好(面試題有的很是籠統)。
Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套類最大的不一樣就在因而否有指向外部的引用上。詳細可見http://www.frontfree.net/articles/services/view.asp?id=704&page=1
注: 靜態內部類(Inner Class)意味着1建立一個static內部類的對象,不需要一個外部類對象。2不能從一個static內部類的一個對象訪問一個外部類對象

第四,&和&&的差異。


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

第五。HashMap和Hashtable的差異。
都屬於Map接口的類,實現了將唯一鍵映射到特定的值上。
HashMap 類沒有分類或者排序。它贊成一個 null 鍵和多個 null 值。
Hashtable 相似於 HashMap。但是不一樣意 null 鍵和 null 值。它也比 HashMap 慢。因爲它是同步的。



第六。Collection和Collections的差異。
Collections是個java.util下的類,它包括有各類有關集合操做的靜態方法。
Collection是個java.util下的接口,它是各類集合結構的父接口。


第七,何時用assert。
斷言是一個包括布爾表達式的語句,在運行這個語句時假定該表達式爲 true。假設表達式計算爲 false。那麼系統會報告一個 Assertionerror。

它用於調試目的:
assert(a > 0); // throws an Assertionerror if a <= 0
斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應該老是產生一個布爾值。
Expression2 可以是得出一個值的隨意表達式。

這個值用於生成顯示不少其它調試信息的 String 消息。


斷言在默認狀況下是禁用的。要在編譯時啓用斷言,需要使用 source 1.4 標記:
javac -source 1.4 Test.java
要在執行時啓用斷言。可以使用 -enableassertions 或者 -ea 標記。


要在執行時選擇禁用斷言,可以使用 -da 或者 -disableassertions 標記。
要系統類中啓用斷言,可以使用 -esa 或者 -dsa 標記。還可以在包的基礎上啓用或者禁用斷言。
可以在估計正常狀況下不會到達的不論什麼位置上放置斷言。斷言可以用於驗證傳遞給私有方法的參數。只是,斷言不該該用於驗證傳遞給公有方法的參數。因爲不管是否啓用了斷言,公有方法都必須檢查其參數。只是,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外。斷言不該該以不論什麼方式改變程序的狀態。


第八,GC是什麼?

爲何要有GC? (基礎)。
GC是垃圾收集器。Java 程序猿不用操心內存管理,因爲垃圾收集器會本身主動進行管理。

要請求垃圾收集,可以調用如下的方法之中的一個:
System.gc()
Runtime.getRuntime().gc()

第九,String s = new String("xyz");建立了幾個String Object?
兩個對象,一個是"xyx",一個是指向"xyx"的引用對象s。

第十。Math.round(11.5)等於多少?

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


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

第十一,short s1 =1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化爲short型。可改動爲s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。



第十二。sleep() 和 wait() 有什麼差異? 搞線程的最愛
sleep()方法是使線程中止一段時間的方法。在sleep 時間間隔期滿後,線程不必定立刻恢復運行。這是因爲在那個時刻,其餘線程可能正在運行而且沒有被調度爲放棄運行。除非(a)"醒來"的線程具備更高的優先級
(b)正在執行的線程因爲其餘緣由而堵塞。
wait()是線程交互時。假設線程對一個同步對象x 發出一個wait()調用,該線程會暫停運行。被調對象進入等待狀態,直到被喚醒或等待時間到。



第十三,Java有沒有goto?
Goto?java中的保留字,現在沒有在java中使用。

第十四。數組有沒有length()這種方法? String有沒有length()這種方法?
數組沒有length()這種方法,有length的屬性。


String有有length()這種方法。

第十五,Overload和Override的差異。Overloaded的方法可否夠改變返回值的類型?


方法的重寫Overriding和重載Overloading是Java多態性的不一樣表現。

重寫Overriding是父類與子類之間多態性的一種表現。重載Overloading是一個類中多態性的一種表現。假設在子類中定義某方法與其父類有一樣的名稱和參數,咱們說該方法被重寫 (Overriding)。子類的對象使用這種方法時,將調用子類中的定義,對它而言。父類中的定義如同被"屏蔽"了。假設在一個類中定義了多個同名的方法,它們或有不一樣的參數個數或有不一樣的參數類型。則稱爲方法的重載(Overloading)。

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

第十六,Set裏的元素是不能反覆的,那麼用什麼方法來區分反覆與否呢? 是用==仍是equals()? 它們有何差異?


Set裏的元素是不能反覆的,那麼用iterator()方法來區分反覆與否。

equals()是判讀兩個Set是否相等。
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,爲的是當兩個分離的對象的內容和類型相配的話,返回真值。



第十七,給我一個你最多見到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException,BufferUnderflowException, CannotRedoException, CannotUndoException,ClassCastException, CMMException, ConcurrentModificationException,DOMException, EmptyStackException, IllegalArgumentException,IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException,NegativeArraySizeException, NoSuchElementException, NullPointerException,ProfileDataException, ProviderException, RasterFORMatException,SecurityException, SystemException, UndeclaredThrowableException,UnmodifiableSetException, UnsupportedOperationException

第十八,error和exception有什麼差異?
error 表示恢復不是不可能但很是困難的狀況下的一種嚴重問題。比方說內存溢出。不可能期望程序能處理這種狀況。
exception 表示一種設計或實現問題。也就是說。它表示假設程序執行正常,從不會發生的狀況。




第十九。List, Set,Map是否繼承自Collection接口?
List。Set是

Map不是

第二十,abstractclass和interface有什麼差異?


聲明方法的存在而不去實現它的類被叫作抽象類(abstract class)。它用於要建立一個體現某些基本行爲的類。併爲該類聲明方法,但不能在該類中實現該類的狀況。不能建立abstract 類的實例。

然而可以建立一個變量,其類型是一個抽象類,並讓它指向詳細子類的一個實例。不能有抽象構造函數或抽象靜態方法。

Abstract 類的子類爲它們父類中的所有抽象方法提供實現,不然它們也是抽象類爲。取而代之。在子類中實現該方法。知道其行爲的其餘類可以在類中實現這些方法。


接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可經過實現這種接口而得到。

接口中的所有方法都是抽象的,沒有一個有程序體。接口僅僅可以定義static final成員變量。接口的實現與子類類似。除了該實現類不能從接口定義中繼承行爲。

當類實現特殊接口時。它定義(即將程序體給予)所有這種接口的方法。

而後,它可以在實現了該接口的類的不論什麼對象上調用接口的方法。由於有抽象類,它贊成使用接口名做爲引用變量的類型。

一般的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。

第二十一,abstract的method是否可同一時候是static,是否可同一時候是native,是否可同一時候是synchronized?
都不能

第二十二,接口是否可繼承接口?

抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?
接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明白的構造函數。

第二十三。啓動一個線程是用run()仍是start()?
啓動一個線程是調用start()方法,使線程所表明的虛擬處理機處於可執行狀態,這意味着它可以由JVM調度並執行。這並不意味着線程就會立刻執行。

run()方法可以產生必須退出的標誌來中止一個線程。

第二十四。構造器Constructor是否可被override?
構造器Constructor不能被繼承。所以不能重寫Overriding,但可以被重載Overloading。



第二十五。可否夠繼承String類?
String類是final類故不可以繼承。

第二十六,當一個線程進入一個對象的一個synchronized方法後,其餘線程是否可進入此對象的其餘方法?
不能。一個對象的一個synchronized方法僅僅能由一個線程訪問。

第二十七。try{}裏有一個return語句,那麼緊跟在這個try後的finally{}裏的code會不會被運行。何時被運行,在return前仍是後?
會運行,在return前運行。


第二十八,編程題:用最有效率的方法算出2乘以8等於幾?
有C背景的程序猿特別喜歡問這樣的問題。



2 << 3

第二十九,兩個對象值一樣(x.equals(y)== true),但卻可有不一樣的hashcode,這句話對不正確?
不正確,有一樣的hashcode。



第三十。當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏到底是值傳遞仍是引用傳遞?


是值傳遞。

Java編程語言僅僅由值傳遞參數。

當一個對象實例做爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變。但對象的引用是永遠不會改變的。




第三十一。swtich可否做用在byte上。可否做用在long上,可否做用在String上?


switch(expr1)中,expr1是一個整數表達式。所以傳遞給switch 和case 語句的參數應該是int、short、char 或者byte。long,string都不能做用於swtich。



第三十二,編程題:寫一個Singleton出來。
Singleton模式主要做用是保證在Java應用程序中,一個類Class僅僅有一個實例存在。
通常Singleton模式一般有幾種種形式:
第一種形式:定義一個類,它的構造函數爲private的,它有一個static的private的該類變量,在類初始化時實例話,經過一個public的getInstance方法獲取對它的引用,繼而調用當中的方法。
public class Singleton {
  privateSingleton(){}
  //在本身內部定義本身一個實例,是否是很是奇怪?
  //注意這是private僅僅供內部調用
  privatestatic Singleton instance = new Singleton();
  //這裏提供了一個供外部訪問本class的靜態方法。可以直接訪問  
  publicstatic Singleton getInstance() {
    returninstance;   
  }
}
另一種形式:
public class Singleton {
  privatestatic Singleton instance = null;
  publicstatic synchronized Singleton getInstance() {
  //這種方法比上面有所改進。不用每次都進行生成對象。僅僅是第一次    
  //使用時生成實例,提升了效率。
  if(instance==null)
    instance=newSingleton();
return instance;   }
}
其它形式:
定義一個類,它的構造函數爲private的,所有方法爲static的。
通常以爲第一種形式要更加安全些

 

補充:J2SE中三個未定義方法的接口:java.io.Serializablejava.lang.Collonablejava.rmi.Remote

不少其它學習 歡迎加QQ羣交流:368614849936861

相關文章
相關標籤/搜索