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

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

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

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

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

      農(nóng)業(yè)銀行Java基礎(chǔ)面試題

      時(shí)間:2019-05-13 11:07:45下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《農(nóng)業(yè)銀行Java基礎(chǔ)面試題》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《農(nóng)業(yè)銀行Java基礎(chǔ)面試題》。

      第一篇:農(nóng)業(yè)銀行Java基礎(chǔ)面試題

      基礎(chǔ)測(cè)試

      基礎(chǔ)知識(shí)部分:

      1.談?wù)刦inal, finally, finalize的區(qū)別。

      final 用于聲明屬性,方法和類(lèi),分別表示屬性不可變,方法不可覆蓋,類(lèi)不可繼承。finally 是異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行。finalize 是 Object 類(lèi)的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。

      2.HashMap和Hashtable的區(qū)別。

      HashMap 是 Hashtable 的輕量級(jí)實(shí)現(xiàn)(非線(xiàn)程安全的實(shí)現(xiàn)),他們都完成了 Map 接口,主要區(qū)別在于 HashMap 允許空(null)鍵值(key), 由于非線(xiàn)程安全,效率上可能高于 Hashtable。

      HashMap 允許將 null 作為一個(gè) entry 的 key 或者 value,而 Hashtable 不允許。

      HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因?yàn)?contains 方法容易讓人引起誤解。Hashtable 繼承自 Dictionary 類(lèi),而 HashMap 是 Java1.2 引進(jìn)的 Map interface 的一個(gè)實(shí)現(xiàn)。最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多個(gè)線(xiàn)程訪(fǎng)問(wèn) Hashtable 時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而 HashMap 就必須為之提供外同步。

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

      3.public,private,protected,friendly,internal 的作用范圍。

      private 同一個(gè)類(lèi)中

      protected 同一類(lèi)中,同一包中,不同包中的該類(lèi)子類(lèi)

      public 同一類(lèi)中,同一包中,不同包中的該類(lèi)子類(lèi),不同包中的該類(lèi)的非子類(lèi)

      friendly 同一個(gè)類(lèi)中,同一包中

      internal 表示在同一個(gè)應(yīng)用程序(Application)或類(lèi)庫(kù)(Library)中都可以使用,不過(guò)這個(gè)我們基本上不用 4.Java的接口和抽象類(lèi)的區(qū)別。

      接口中的方法只能是定義不可以有實(shí)現(xiàn),而且所有成員默認(rèn)均為公有的,實(shí)現(xiàn)接口時(shí)必須實(shí)現(xiàn)該接口定義的所有方法。接口可以多重繼承。而抽象類(lèi)中則可以存在私有成員,方法允許有實(shí)現(xiàn),繼承抽象后可以不去實(shí)現(xiàn)該抽象類(lèi)的抽象方法,但此時(shí)該子類(lèi)也必須聲明為抽象類(lèi)。抽象類(lèi)不能多重繼承。

      5.在java中一個(gè)類(lèi)被聲明為final類(lèi)型,表示了什么意思?

      final—修飾符(關(guān)鍵字)如果一個(gè)類(lèi)被聲明為final,意味著它不能再派生出新的子類(lèi),不能作為父類(lèi)被繼承。因此一個(gè)類(lèi)不能既被聲明為abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖?。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載

      6.heap和stack有什么區(qū)別。

      棧是一種線(xiàn)形集合,其添加和刪除元素的操作應(yīng)在同一段完成。棧按照后進(jìn)先出的方式進(jìn)行處理。堆是棧的一個(gè)組成元素

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

      型?

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

      8.GC是什么? 為什么要有GC?(基礎(chǔ))。

      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)存的顯示操作方法。

      9.Collection 和 Collections的區(qū)別。

      Collection 是集合類(lèi)的上級(jí)接口,繼承與他的接口主要有 Set 和 List.Collections 是針對(duì)集合類(lèi)的一個(gè)幫助類(lèi),他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線(xiàn)程安全化等操作。

      10.Anonymous Inner Class(匿名內(nèi)部類(lèi))是否可以extends(繼承)其它類(lèi),是

      否可以implements(實(shí)現(xiàn))interface(接口)?

      匿名的內(nèi)部類(lèi)是沒(méi)有名字的內(nèi)部類(lèi)。不能extends(繼承)其它類(lèi),但一個(gè)內(nèi)部類(lèi)可以作為一個(gè)接口,由另一個(gè)內(nèi)部類(lèi)實(shí)現(xiàn)。

      11.Static Nested Class 和 Inner Class的不同

      Static Nested Class 是被聲明為靜態(tài)(static)的內(nèi)部類(lèi),它可以不依賴(lài)于外部類(lèi)實(shí)例被實(shí)例化。而通常的內(nèi)部類(lèi)需要在外部類(lèi)實(shí)例化后才能實(shí)例化。

      12.什么時(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)下,系統(tǒng)將給出警告或退出。一般來(lái)說(shuō),assertion 用于保證程序最基本、關(guān)鍵的正確性。assertion 檢查通常在開(kāi)發(fā)和測(cè)試時(shí)開(kāi)啟。為了提高性能,在軟件發(fā)布后,assertion 檢查通常是關(guān)閉的。

      13.Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。

      當(dāng)JAVA程序違反了JAVA的語(yǔ)義規(guī)則時(shí),JAVA虛擬機(jī)就會(huì)將發(fā)生的錯(cuò)誤表示為一個(gè)異常。違反語(yǔ)義規(guī)則包括2種情況。一種是JAVA類(lèi)庫(kù)內(nèi)置的語(yǔ)義檢查。例如數(shù)組下標(biāo)越界,會(huì)引發(fā)IndexOutOfBoundsException;訪(fǎng)問(wèn)null的對(duì)象時(shí)會(huì)引發(fā)NullPointerException。另一種情況就是JAVA允許程序員擴(kuò)展這種語(yǔ)義檢查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時(shí)用throw關(guān)鍵字引發(fā)異常。所有的異常都是java.lang.Thowable的子類(lèi)。

      14.垃圾回收的優(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í)別的線(xiàn)程運(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)行垃圾回收。回收機(jī)制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。

      15.請(qǐng)說(shuō)出你所知道的線(xiàn)程同步的方法。

      wait():使一個(gè)線(xiàn)程處于等待狀態(tài),并且釋放所持有的對(duì)象的lock。

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

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

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

      16.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ā)生的情況。17.String s = new String(“abcdefghijklmn”);創(chuàng)建了幾個(gè)String Object? 兩

      個(gè)

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

      Math.round(11.5)==12

      Math.round(-11.5)==-11

      round方法返回與參數(shù)最接近的長(zhǎng)整數(shù),參數(shù)加1/2后求其floor.19.sleep()和 wait()有什么區(qū)別?

      sleep 是線(xiàn)程類(lèi)(Thread)的方法,導(dǎo)致此線(xiàn)程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線(xiàn)程,但是監(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)致本線(xiàn)程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出 notify 方法(或 notifyAll)后本線(xiàn)程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。

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

      21.數(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è)方法。

      22.JAVA類(lèi)在什么情況下要實(shí)現(xiàn)java.io.Serializable接口?

      23.給我一個(gè)你最常見(jiàn)到的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

      24.構(gòu)造器Constructor是否可被override?

      構(gòu)造器Constructor不能被繼承,因此不能重寫(xiě)Overriding,但可以被重載Overloading。

      25.List, Set, Map是否繼承自Collection接口?List,Set是,Map不是

      編程題:

      1.輸出9*9口訣

      2,寫(xiě)一個(gè)Singleton出來(lái)。

      Singleton模式主要作用是保證在Java應(yīng)用程序中,一個(gè)類(lèi)Class只有一個(gè)實(shí)例存在。

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

      第一種形式: 定義一個(gè)類(lèi),它的構(gòu)造函數(shù)為private的,它有一個(gè)static的private的該類(lèi)變量,在類(lèi)初始化時(shí)實(shí)例話(huà),通過(guò)一個(gè)public的getInstance方法獲取對(duì)它的引用,繼而調(diào)用其中的方法。

      public class Singleton {

      private Singleton(){}

      //在自己內(nèi)部定義自己一個(gè)實(shí)例,是不是很奇怪?

      //注意這是private 只供內(nèi)部調(diào)用

      private static Singleton instance = new Singleton();

      //這里提供了一個(gè)供外部訪(fǎng)問(wèn)本class的靜態(tài)方法,可以直接訪(fǎng)問(wèn)public static Singleton getInstance(){

      return instance;

      }

      }

      第二種形式:

      public class Singleton {

      private static Singleton instance = null;

      public static synchronized Singleton getInstance(){

      //這個(gè)方法比上面有所改進(jìn),不用每次都進(jìn)行生成對(duì)象,只是第一次

      //使用時(shí)生成實(shí)例,提高了效率!

      if(instance==null)

      instance=new Singleton();

      return instance;}

      }

      其他形式:

      定義一個(gè)類(lèi),它的構(gòu)造函數(shù)為private的,所有方法為static的。一般認(rèn)為第一種形式要更加安全些

      第二篇:java面試題(基礎(chǔ)部分)

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

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

      Overloaded的方法是可以改變返回值的類(lèi)型。數(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è)方法。Set里的元素是不能重復(fù)的,那么用什么方法來(lái)區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別?

      Set里的元素是不能重復(fù)的,那么用iterator()方法來(lái)區(qū)分重復(fù)與否。equals()是判讀兩個(gè)Set是否相等。equals()和==方法決定引用值是否指向同一對(duì)象equals()在類(lèi)中被覆蓋,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類(lèi)型相配的話(huà),返回真值。

      24最常見(jiàn)到的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, Secur

      ityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationExceptionerror和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ā)生的情況。abstract class和interface有什么區(qū)別?

      聲明方法的存在而不去實(shí)現(xiàn)它的類(lèi)被叫做抽象類(lèi)(abstract class),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類(lèi),并為該類(lèi)聲明方法,但不能在該類(lèi)中實(shí)現(xiàn)該類(lèi)的情況。不能創(chuàng)建abstract 類(lèi)的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類(lèi)型是一個(gè)抽象類(lèi),并讓它指向具體子類(lèi)的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類(lèi)的子類(lèi)為它們父類(lèi)中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類(lèi)為。取而代之,在子類(lèi)中實(shí)現(xiàn)該方法。知道其行為的其它類(lèi)可以在類(lèi)中實(shí)現(xiàn)這些方法。

      接口(interface)是抽象類(lèi)的變體。在接口中,所有方法都是抽象的。多繼承性可通過(guò)實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒(méi)有一個(gè)有程序體。接口只可以定義static final成員變量。接口的實(shí)現(xiàn)與子類(lèi)相似,除了該實(shí)現(xiàn)類(lèi)不能從接口定義中繼承行為。當(dāng)類(lèi)實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類(lèi)的任何對(duì)象上調(diào)用接口的方法。由于有抽象類(lèi),它允許使用接口名作為引用變量的類(lèi)型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類(lèi)型或從接口類(lèi)型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來(lái)決定某對(duì)象的類(lèi)是否實(shí)現(xiàn)了接口。abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?

      都不能接口是否可繼承接口? 抽象類(lèi)是否可實(shí)現(xiàn)(implements)接口? 抽象類(lèi)是否可繼承實(shí)體類(lèi)(concrete class)?

      接口可以繼承接口。抽象類(lèi)可以實(shí)現(xiàn)(implements)接口,抽象類(lèi)可繼承實(shí)體類(lèi),但前提是實(shí)體類(lèi)必須有明確的構(gòu)造函數(shù)。啟動(dòng)一個(gè)線(xiàn)程是用run()還是start()?

      啟動(dòng)一個(gè)線(xiàn)程是調(diào)用start()方法,使線(xiàn)程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線(xiàn)程就會(huì)立即運(yùn)行。run()方法可以產(chǎn)生必須退出的標(biāo)志來(lái)停止一個(gè)線(xiàn)程。

      是否可以繼承String類(lèi)?

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

      構(gòu)造器Constructor是否可被override?

      構(gòu)造器Constructor不能被繼承,因此不能重寫(xiě)Overriding,但可以被重載Overloading。

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

      不能,一個(gè)對(duì)象的一個(gè)synchronized方法只能由一個(gè)線(xiàn)程訪(fǎng)問(wèn)。

      33try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不

      會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?

      會(huì)執(zhí)行,在return前執(zhí)行。

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

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

      不對(duì),有相同的hash code。

      36當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?

      是值傳遞。Java編程語(yǔ)言只由值傳遞參數(shù)。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的內(nèi)容可以在被調(diào)用的方法中改變,但對(duì)象的引用是永遠(yuǎn)不會(huì)改變的。

      37swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

      switch(expr1)中,expr1是一個(gè)整數(shù)表達(dá)式。因此傳遞給 switch 和 case 語(yǔ)句的參數(shù)應(yīng)該是 int、short、char 或者 byte。long,string 都不能作用于swtich。

      Hashtable和HashMap

      Hashtable繼承自Dictionary類(lèi),而HashMap是Java1.2引進(jìn)的Map interface的一個(gè)實(shí)現(xiàn)

      HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許

      還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。

      最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線(xiàn)程訪(fǎng)問(wèn)Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap就必

      須為之提供外同步。

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

      1.Java的接口和C++的虛類(lèi)的相同和不同處。

      由于Java不支持多繼承,而有可能某個(gè)類(lèi)或?qū)ο笠褂梅謩e在幾個(gè)類(lèi)或?qū)ο罄锩娴姆椒ɑ驅(qū)傩?,現(xiàn)有的單繼承機(jī)制就不能滿(mǎn)足要求。與繼承相比,接口有更高的靈活性,因?yàn)榻涌谥袥](méi)有任何實(shí)現(xiàn)代碼。當(dāng)一個(gè)類(lèi)實(shí)現(xiàn)了接口以后,該類(lèi)要實(shí)現(xiàn)接口里面所有的方法和屬性,并且接口里面的屬性在默認(rèn)狀態(tài)下面都是

      public static,所有方法默認(rèn)情況下是public.一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口。

      2.Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。

      當(dāng)Java程序違反了Java的語(yǔ)義規(guī)則時(shí),Java虛擬機(jī)就會(huì)將發(fā)生的錯(cuò)誤表示為一個(gè)異常。違反語(yǔ)義規(guī)則包括2種情況。一種是Java類(lèi)庫(kù)內(nèi)置的語(yǔ)義檢查。例如數(shù)組下標(biāo)越界,會(huì)引發(fā)IndexOutOfBoundsException;訪(fǎng)問(wèn)null的對(duì)象時(shí)會(huì)引發(fā)NullPointerException。另一種情況就是Java允許程序員擴(kuò)展這種語(yǔ)義檢查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時(shí)用throw關(guān)鍵字引發(fā)異常。所有的異常都是java.lang.Thowable的子類(lèi)。

      3.垃圾回收的優(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í)別的線(xiàn)程運(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)記垃圾回收,增量垃圾回收。

      4.線(xiàn)程同步的方法。

      wait():使一個(gè)線(xiàn)程處于等待狀態(tài),并且釋放所持有的對(duì)象的lock。

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

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

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

      5.Error與Exception有什么區(qū)別?

      Error表示系統(tǒng)級(jí)的錯(cuò)誤和程序不必處理的異常,Exception表示需要捕捉或者需要程序進(jìn)行處理的異常。

      6.在java中一個(gè)類(lèi)被聲明為final類(lèi)型,表示了什么意思?

      表示該類(lèi)不能被繼承,是頂級(jí)類(lèi)。heap和stack有什么區(qū)別。

      棧是一種線(xiàn)形集合,其添加和刪除元素的操作應(yīng)在同一段完成。棧按照后進(jìn)先出的方式進(jìn)行處理。堆是棧的一個(gè)組成元素。

      8談?wù)刦inal, finally, finalize的區(qū)別。

      final—修飾符(關(guān)鍵字)如果一個(gè)類(lèi)被聲明為final,意味著它不能再派生出新的子類(lèi),不能作為父類(lèi)被繼承。因此一個(gè)類(lèi)不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖?。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。

      finally—異常處理時(shí)提供 finally 塊來(lái)執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally 塊(如果有的話(huà))。

      finalize—方法名。Java 技術(shù)允許使用 finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒(méi)有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在 Object 類(lèi)中定義的,因此所有的類(lèi)都繼承了它。子類(lèi)覆蓋 finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。9Anonymous Inner Class(匿名內(nèi)部類(lèi))是否可以extends(繼承)其它類(lèi),是否可以implements(實(shí)現(xiàn))interface(接口)?

      匿名的內(nèi)部類(lèi)是沒(méi)有名字的內(nèi)部類(lèi)。不能extends(繼承)其它類(lèi),但一個(gè)內(nèi)部類(lèi)可以作為一個(gè)接口,由另一個(gè)內(nèi)部類(lèi)實(shí)現(xiàn)。

      10Static Nested Class 和 Inner Class的不同

      Nested Class(一般是C++的說(shuō)法),Inner Class(一般是JAVA的說(shuō)法)。Java內(nèi)部類(lèi)與C++嵌套類(lèi)最大的不同就在于是否有指向外部的引用上。

      注: 靜態(tài)內(nèi)部類(lèi)(Inner Class)意味著1創(chuàng)建一個(gè)static內(nèi)部類(lèi)的對(duì)象,不需要一個(gè)外部類(lèi)對(duì)象,2不能從一個(gè)static內(nèi)部類(lèi)的一個(gè)對(duì)象訪(fǎng)問(wèn)一個(gè)外部類(lèi)對(duì)象.

      第三篇:JAVA面試題

      1、面向?qū)ο蟮乃膫€(gè)特征:封裝、繼承、多態(tài)、抽象

      封裝:

      繼承:子類(lèi)繼承父類(lèi),除private修飾以外的所以方法和屬性 多態(tài):一個(gè)對(duì)象多種狀態(tài),可以把子類(lèi)對(duì)象當(dāng)作父類(lèi)對(duì)象來(lái)看,一旦這樣做了,就只能

      去調(diào)用父類(lèi)中原有定義的屬性和方法,也就是子類(lèi)中擴(kuò)展的方法或?qū)傩跃筒荒苷{(diào)用了。

      抽象:

      2、abstractclass 和interface的區(qū)別

      聲明方法的存在而不去實(shí)現(xiàn)它的類(lèi)被叫做抽象類(lèi)(abstract class),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類(lèi),并為該類(lèi)聲明方法,但不能在該類(lèi)中實(shí)現(xiàn)該類(lèi)的情況。不能創(chuàng)建abstract 類(lèi)的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類(lèi)型是一個(gè)抽象類(lèi),并讓它指向具體子類(lèi)的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類(lèi)的子類(lèi)為它們父類(lèi)中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類(lèi)為。取而代之,在子類(lèi)中實(shí)現(xiàn)該方法。知道其行為的其它類(lèi)可以在類(lèi)中實(shí)現(xiàn)這些方法。

      接口(interface)是抽象類(lèi)的變體。在接口中,所有方法都是抽象的。多繼承性可通過(guò)實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒(méi)有一個(gè)有程序體。接口只可以定義static final成員變量。接口的實(shí)現(xiàn)與子類(lèi)相似,除了該實(shí)現(xiàn)類(lèi)不能從接口定義中繼承行為。當(dāng)類(lèi)實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類(lèi)的任何對(duì)象上調(diào)用接口的方法。由于有抽象類(lèi),它允許使用接口名作為引用變量的類(lèi)型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類(lèi)型或從接口類(lèi)型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來(lái)決定某對(duì)象的類(lèi)是否實(shí)現(xiàn)了接口。

      3、final、finally、finalize的區(qū)別

      final 用于聲明屬性,方法和類(lèi),分別表示屬性不可變,方法不可覆蓋,類(lèi)不可繼承。finally是異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行。

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

      4、匿名內(nèi)部類(lèi)是否可以作為父類(lèi)被其他類(lèi)繼承,或做為接口被實(shí)現(xiàn)?

      匿名內(nèi)部類(lèi)不被繼承也不能被實(shí)現(xiàn),因?yàn)樗鼪](méi)有名字,而一個(gè)內(nèi)部類(lèi)只要有名字就可以作為父類(lèi)被繼承,也可以作為借口被實(shí)現(xiàn)。

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

      多線(xiàn)程有兩種實(shí)現(xiàn)方法,分別繼承繼承Thread類(lèi)與實(shí)現(xiàn)runnable借口。

      同步的實(shí)現(xiàn)方法有兩種,分別是synchronized,wait與notify。

      6、string 與 stringbuffer的區(qū)別?

      String的長(zhǎng)度是不可變的,而stringbuffer的長(zhǎng)度是可變的。如果你對(duì)字符中的內(nèi)容經(jīng)常進(jìn)行操作,特別是內(nèi)容修改時(shí),那么就要使用stringbuffer,如果最后需要使用string,那么使用stringbuffer的tostring()方法。

      7、解析XML文件的幾種方式和區(qū)別

      DOM:處理大型文件時(shí)其性能下降的非常厲害

      SAX:SAX是事件驅(qū)動(dòng)型的XML解析方式,它是順序讀取XML文件,不需要一次性全部裝載整個(gè)文件。

      8、sleep()和wait()有什么區(qū)別?

      sleep是線(xiàn)程類(lèi)(Thread)的方法,導(dǎo)致此線(xiàn)程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線(xiàn)程,但是監(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)致本線(xiàn)程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線(xiàn)程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。

      9、數(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這個(gè)屬性

      String有l(wèi)ength()這個(gè)方法

      10、LinkedList、ArrayList和Vector的區(qū)別? ArrayList和Vector是采用數(shù)組方式存儲(chǔ)數(shù)據(jù),此數(shù)組元素總數(shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)個(gè)數(shù)以便增加和插入元素,二者都允許直接序號(hào)索引元素,但是插入數(shù)據(jù)要移動(dòng)數(shù)組元素等內(nèi)存操作,所以它們索引數(shù)據(jù)快、插入數(shù)據(jù)慢。

      Vector由于使用了synchronized同步方法(如add、insert、remove、set、equals、hashcode等操作),因此是線(xiàn)程安全,性能上比ArrayList要差。

      LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行向前或向后遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入數(shù)度較快!LinkedList雙向鏈表,是指可以從first依次遍歷至last(從頭到尾),也可以從last遍歷至first(從尾到頭),但首尾沒(méi)有構(gòu)成環(huán),不同于雙向循環(huán)鏈表(注意區(qū)分):

      11、hashmap與hashtable的區(qū)別?

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

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

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

      12、Jsp有哪些內(nèi)置對(duì)象,作用分別是什么?(至少能說(shuō)出五個(gè))

      request表示HttpServletRequest對(duì)象。它包含了有關(guān)瀏覽器請(qǐng)求的信息,并且提供了幾個(gè)用于獲取cookie, header, 和session數(shù)據(jù)的有用的方法。

      response表示HttpServletResponse對(duì)象,并提供了幾個(gè)用于設(shè)置送回 瀏覽器的響應(yīng)的方法(如cookies,頭信息等)

      out對(duì)象是javax.jsp.JspWriter的一個(gè)實(shí)例,并提供了幾個(gè)方法使你能用于向?yàn)g覽器回送輸出結(jié)果。

      pageContext表示一個(gè)javax.servlet.jsp.PageContext對(duì)象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對(duì)象的API,并且包裝了通用的servlet相關(guān)功能的方法。

      session表示一個(gè)請(qǐng)求的javax.servlet.http.HttpSession對(duì)象。Session可以存貯用戶(hù)的狀態(tài)信息

      applicaton 表示一個(gè)javax.servle.ServletContext對(duì)象。這有助于查找有關(guān)servlet引擎和servlet環(huán)境的信息

      config表示一個(gè)javax.servlet.ServletConfig對(duì)象。該對(duì)象用于存取servlet實(shí)例的初始化參數(shù)。

      page表示從該頁(yè)面產(chǎn)生的一個(gè)servlet實(shí)例

      13、Javaservletapi中forward()與redirect()的區(qū)別?

      前者僅是容器中控制權(quán)的轉(zhuǎn)向,在客戶(hù)端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址;后者則是完全的跳轉(zhuǎn),瀏覽器將會(huì)得到跳轉(zhuǎn)的地址,并重新發(fā)送請(qǐng)求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。所以,前者更加高效,在前者可以滿(mǎn)足需要時(shí),盡量使用forward()方法,并且,這樣也有助于隱藏實(shí)際的鏈接。在有些情況下,比如,需要跳轉(zhuǎn)到一個(gè)其它服務(wù)器上的資源,則必須使用sendRedirect()方法。

      14、重載(overload)與重寫(xiě)(override)的區(qū)別?

      Overload:方法名相同,參數(shù)不同,與返回值無(wú)關(guān)

      Override:方法名相同,參數(shù)相同,相同的返回值,建立在繼承的基礎(chǔ)之上

      15、什么是單例模式,在程序中如何使用?

      單例模式確保一個(gè)類(lèi)只有一個(gè)實(shí)例 餓漢式單例類(lèi)

      public class Singleton {

      private Singleton(){}

      private static Singleton instance = new Singleton();

      public static Singleton getInstance(){

      return instance;

      }

      }

      懶漢式單例類(lèi)

      public class Singleton {

      private static Singleton instance = null;

      public static synchronized Singleton getInstance(){

      if(instance==null)

      instance=new Singleton();

      return instance;

      }

      }

      16、Servlet生命周期?

      加載和實(shí)例化

      初始化init()

      請(qǐng)求處理service()

      服務(wù)終止destroy()

      17、spring中IOC與AOP的含義?

      IOC:控制反轉(zhuǎn),是一種設(shè)計(jì)模式,一層含義控制權(quán)的轉(zhuǎn)移,由傳統(tǒng)的在程序中控制依賴(lài)轉(zhuǎn)移到由容器來(lái)控制,第二層是依賴(lài)注入將互相依賴(lài)的對(duì)象分離,在spring配置文件中描述它們的依賴(lài)關(guān)心,它們的依賴(lài)關(guān)系只是在使用的時(shí)候才建立

      AOP:面向切面,是一種編程思想,oop的延續(xù),將系統(tǒng)中非核心的業(yè)務(wù)提取出來(lái),進(jìn)行單獨(dú)的處理,比如事務(wù)、日志和安全等

      Spring的AOP和IOC都是為了解決系統(tǒng)代碼耦合度過(guò)高的問(wèn)題,使用代碼重用性高,易于維護(hù),不過(guò)AOP和IOC并不是spring中特有的,只是spring把它們應(yīng)用的更靈活方便。

      18、hibernate與JDBC的區(qū)別?

      相同點(diǎn):

      1>兩者都是JAVA的數(shù)據(jù)庫(kù)操作中間件。

      2>兩者對(duì)于數(shù)據(jù)庫(kù)進(jìn)行直接操作的對(duì)象都不是線(xiàn)程安全的,都需要及時(shí)關(guān)閉。

      3>兩者都可以對(duì)數(shù)據(jù)庫(kù)的更新操作進(jìn)行顯式的事務(wù)處理。

      不同點(diǎn):

      1>使用的SQL語(yǔ)言不同:JDBC使用的是基于關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)SQL語(yǔ)言,Hibernate使用的是HQL(Hibernate query language)語(yǔ)言

      2>操作的對(duì)象不同:JDBC操作的是數(shù)據(jù),將數(shù)據(jù)通過(guò)SQL語(yǔ)句直接傳送到數(shù)據(jù)庫(kù)中執(zhí)行,Hibernate操作的是持久化對(duì)象,由底層持久化對(duì)象的數(shù)據(jù)更新到數(shù)據(jù)庫(kù)中。3>數(shù)據(jù)狀態(tài)不同:JDBC操作的數(shù)據(jù)是“瞬時(shí)”的,變量的值無(wú)法與數(shù)據(jù)庫(kù)中的值保持一致,而Hibernate操作的數(shù)據(jù)是可持久的,即持久化對(duì)象的數(shù)據(jù)屬性的值是可以跟數(shù)據(jù)庫(kù)中的值保持一致的。

      19、struts中的標(biāo)簽庫(kù)有幾種,分別是?

      有5種標(biāo)簽,分別是:bean標(biāo)簽庫(kù)、html標(biāo)簽庫(kù)、logic標(biāo)簽庫(kù)、tiles標(biāo)簽庫(kù)nested標(biāo)簽庫(kù)

      20、Error與Exception有什么區(qū)別?

      Error表示系統(tǒng)級(jí)的錯(cuò)誤和程序不必處理的異常,Exception表示需要捕捉或者需要程序進(jìn)行處理的異常。

      21、Collection和Collections的區(qū)別。

      Collection是集合類(lèi)的上級(jí)接口,繼承與他的接口主要有Set 和List.Collections是針對(duì)集合類(lèi)的一個(gè)幫助類(lèi),他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線(xiàn)程安全化等操作

      22、GC是什么?為什么要有GC?(基礎(chǔ))。

      GC是垃圾收集器。Java程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理。

      要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:

      System.gc()

      Runtime.getRuntime().gc()

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

      啟動(dòng)一個(gè)線(xiàn)程是調(diào)用start()方法,使線(xiàn)程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線(xiàn)程就會(huì)立即運(yùn)行。run()方法可以產(chǎn)生必須退出的標(biāo)志來(lái)停止一個(gè)線(xiàn)程。

      24、&和&&的區(qū)別。

      &是位運(yùn)算符,表示按位與運(yùn)算,&&是邏輯運(yùn)算符,表示邏輯與(and)。

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

      棧是一種線(xiàn)形集合,其添加和刪除元素的操作應(yīng)在同一段完成。棧按照后進(jìn)先出的方

      式進(jìn)行處理。

      堆是棧的一個(gè)組成元素

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

      List,Set是,Map不是

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

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

      28、Static Nested Class 和 Inner Class的不同。

      Static Nested Class是被聲明為靜態(tài)(static)的內(nèi)部類(lèi),它可以不依賴(lài)于外部類(lèi)實(shí)例被實(shí)例化。而通常的內(nèi)部類(lèi)需要在外部類(lèi)實(shí)例化后才能實(shí)例化。

      29、接口是否可繼承接口? 抽象類(lèi)是否可實(shí)現(xiàn)(implements)接口? 抽象類(lèi)是否可繼承實(shí)體類(lèi)

      (concrete class)?

      接口可以繼承接口。抽象類(lèi)可以實(shí)現(xiàn)(implements)接口,抽象類(lèi)是否可繼承實(shí)體類(lèi),但前提是實(shí)體類(lèi)必須有明確的構(gòu)造函數(shù)

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

      JSP 是Servlet技術(shù)的擴(kuò)展,本質(zhì)上是Servlet的簡(jiǎn)易方式,更強(qiáng)調(diào)應(yīng)用的外表表達(dá)。JSP編譯后是“類(lèi)servlet”。Servlet和JSP最主要的不同點(diǎn)在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開(kāi)來(lái)。而JSP的情況是Java和HTML可以組合成一個(gè)擴(kuò)展名為.jsp的文件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯

      31、當(dāng)一個(gè)線(xiàn)程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線(xiàn)程是否可進(jìn)入此對(duì)象的其它方法? 不能,一個(gè)對(duì)象的一個(gè)synchronized方法只能由一個(gè)線(xiàn)程訪(fǎng)問(wèn)。

      32、運(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í)異常。

      33、JSP中動(dòng)態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?

      動(dòng)態(tài)INCLUDE用jsp:include動(dòng)作實(shí)現(xiàn) 它總是會(huì)檢查所含文件中的變化,適合用于包含動(dòng)態(tài)頁(yè)面,并且可以帶參數(shù)。

      靜態(tài)INCLUDE用include偽碼實(shí)現(xiàn),定不會(huì)檢查所含文件的變化,適用于包含靜態(tài)頁(yè)面<%@ include file=“included.htm” %>

      第四篇:java程序員面試題

      1、你怎樣理解Struts,又那些配置文件,以及作用? 理解:http://ruixin.iteye.com/blog/899289 配置文件:struts.xml 作用:struts 框架mvc 實(shí)現(xiàn)低耦合,便于程序的維護(hù)~ 配置文件控制流程的轉(zhuǎn)向 很清晰~ 主要負(fù)責(zé)具體業(yè)務(wù)的實(shí)現(xiàn)和頁(yè)面的轉(zhuǎn)向~

      2、怎么樣來(lái)捕獲數(shù)據(jù)庫(kù)中的異常?

      3、如何處理網(wǎng)頁(yè)中的驗(yàn)證信息,如何友好的進(jìn)行處理?

      4、用javaScript實(shí)現(xiàn)java中的監(jiān)聽(tīng)器功能?

      5、你對(duì)對(duì)日外包的看法?

      6、數(shù)據(jù)庫(kù)連接方式由哪幾種?

      Jdbc、連接池、hibernate

      7、你清楚哪幾種設(shè)計(jì)模式,談?wù)劯鞣N設(shè)計(jì)模式的類(lèi)結(jié)構(gòu)。

      8、談?wù)刯sp和sevlet的區(qū)別,以及它們性能上的區(qū)別。

      jsp是servlet的一種簡(jiǎn)化,jsp編譯后是“類(lèi)servlet”。servlet 主要是用來(lái)處理業(yè)務(wù)層;

      jsp 則是主要負(fù)責(zé) 表現(xiàn)層。

      servlet完全是java程序代碼構(gòu)成,擅長(zhǎng)于流程控制和事務(wù)處理,而通過(guò)servlet來(lái)生成動(dòng)態(tài)網(wǎng)頁(yè)很不直觀; 對(duì)于靜態(tài)的html標(biāo)簽,servlet都必須使用頁(yè)面輸出流逐行輸出。Servlet中沒(méi)有內(nèi)置對(duì)象。Jsp由html代碼和jsp標(biāo)簽構(gòu)成可以方便地編寫(xiě)動(dòng)態(tài)網(wǎng)頁(yè),在struts框架中,jsp位于MVC設(shè)計(jì)模式的視圖層,而servlet位于控制層。

      總之,使用jsp只需要完成程序員需要輸出到客戶(hù)端的內(nèi)容,至于jsp中的java腳本如果鑲嵌到一個(gè)類(lèi)中,由jsp容器完成,而servlet則是個(gè)完整的java類(lèi),這個(gè)類(lèi)的service方法用于生成對(duì)客戶(hù)端的響應(yīng)

      9、如何來(lái)編寫(xiě)存儲(chǔ)過(guò)程,如何優(yōu)化存儲(chǔ)過(guò)程,以及存儲(chǔ)過(guò)程和TSQL的區(qū)別。

      10、提供的培訓(xùn),CMM-5軟件開(kāi)發(fā)流程培訓(xùn)、代碼編寫(xiě)規(guī)范和業(yè)務(wù)流程培訓(xùn)、對(duì)日語(yǔ)的培訓(xùn)。

      1、為什么要選擇這個(gè)行業(yè),和計(jì)算機(jī)專(zhuān)業(yè)的相比有什么優(yōu)勢(shì)?

      2、Servlet是什么,以及生命周期?

      Servlet被服務(wù)器實(shí)例化后,容器運(yùn)行其init方法,請(qǐng)求到達(dá)時(shí)運(yùn)行其service方法,service方法自動(dòng)派遣運(yùn)行與請(qǐng)求對(duì)應(yīng)的doXXX方法(doGet,doPost)等,當(dāng)服務(wù)器決定將實(shí)例銷(xiāo)毀的時(shí)候調(diào)用其destroy方法。

      與cgi的區(qū)別在于servlet處于服務(wù)器進(jìn)程中,它通過(guò)多線(xiàn)程方式運(yùn)行其service方法,一個(gè)實(shí)例可以服務(wù)于多個(gè)請(qǐng)求,并且其實(shí)例一般不會(huì)銷(xiāo)毀,而CGI對(duì)每個(gè)請(qǐng)求都產(chǎn)生新的進(jìn)程,服務(wù)完成后就銷(xiāo)毀,所以效率上低于servlet。

      3、怎么理解事務(wù)?

      4、怎么理解MVC?

      自己做自己的事情,主要強(qiáng)調(diào)分層,5、同時(shí)插入大量數(shù)據(jù),使用何種方法優(yōu)化?Batch

      6、多個(gè)有關(guān)系得怎么樣操作?

      7、你認(rèn)為你還有什么優(yōu)點(diǎn)在前面沒(méi)有提到?

      8、對(duì)加班的看法?

      9、與上級(jí)意見(jiàn)不一致時(shí)怎么樣處理?10、11、12、13、14、15、16、17、18、19、20、21、22、23、你如何理解團(tuán)隊(duì)精神?

      你怎樣處理學(xué)習(xí)新技術(shù)和項(xiàng)目開(kāi)發(fā)之間的矛盾? 怎樣去學(xué)習(xí)新技術(shù)?

      作為一個(gè)初級(jí)程序員怎么樣彌補(bǔ)與有經(jīng)驗(yàn)程序員之間的差距? 你對(duì)索引的理解,索引有幾種,什么時(shí)候用索引? 對(duì)Oracle理解?

      怎樣優(yōu)化復(fù)雜的查詢(xún)語(yǔ)句? 你對(duì)Jdbc理解?

      對(duì)Finally塊的理解和應(yīng)用? 游標(biāo)的理解? ResultSet 重載,重寫(xiě)? 簽名

      EJB的事務(wù),Hibernate的事務(wù)? Struts的標(biāo)簽? 重定向和跳轉(zhuǎn)? A、:效率高,速度快

      a.地址欄不改變跳轉(zhuǎn)——服務(wù)器端跳轉(zhuǎn),服務(wù)器之間內(nèi)部轉(zhuǎn),相同的request,可傳參;

      b.執(zhí)行到跳轉(zhuǎn)語(yǔ)句后無(wú)條件立刻跳轉(zhuǎn)——之后的代碼不再被執(zhí)行;

      注意:如果使用forward跳轉(zhuǎn),則一定要在跳轉(zhuǎn)之前釋放掉全部的資源;

      c.使用forward時(shí),request設(shè)置的屬性依然能保留在下一個(gè)頁(yè)面(setAttribute);d.通過(guò)傳遞參數(shù)。

      e.地址中的”/”代表是:http://localhost:8080/Test B、response.sendRedirect(“地址”):效率低,速度慢

      a.地址欄改變跳轉(zhuǎn)——客戶(hù)端跳轉(zhuǎn)(其中地址可以是任意的)

      b.所有代碼執(zhí)行完畢之后再跳轉(zhuǎn),跳轉(zhuǎn)語(yǔ)句后面的代碼還是會(huì)執(zhí)行,除非在其后面加上return(return)需復(fù)雜一些。

      <% Response.sendRedirect(“aa.jsp”);boolean b = true;

      if(b){ Return;} System.out.println(“aaaaaaaaaa”);%>

      c.不能保存request屬性——地址改變了,客戶(hù)端跳轉(zhuǎn),不同的request d.通過(guò)對(duì)URL地址的重寫(xiě)傳遞參數(shù):

      response.sendRedirect(“responseDemo04.jsp?id=mldn”);

      e.地址中的”/”代表是:http://localhost:8080/

      下面是兩種比較重要的跳轉(zhuǎn),我還是與上次的一次,把我做的筆記貼出來(lái):24、25、Hibernate的左聯(lián)結(jié)和右連接,緩存,數(shù)據(jù)加載? 面向?qū)ο笕绾卫斫?

      26、EJB中CMP和BMP,SessionBean的機(jī)制?27、28、29、對(duì)日外包是否有抵觸情緒? 如何減少Servlet的請(qǐng)求? 對(duì)設(shè)計(jì)模式了解多少?作過(guò)的項(xiàng)目中用過(guò)那些設(shè)計(jì)模式? 30、31、32、33、34、35、36、37、38、39、40、41、42、43、44、45、怎樣看待團(tuán)隊(duì)合作,在團(tuán)隊(duì)合作中你扮演什么樣的角色,遇到技術(shù)難題時(shí)怎么解決? Exception的層次結(jié)構(gòu)? EJB對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)機(jī)制? Struts中是否有事務(wù)處理? Hibernate的其它功能(除了ORM)? 如何提高數(shù)據(jù)庫(kù)中的數(shù)據(jù)查詢(xún)效率? 作為項(xiàng)目經(jīng)理如何對(duì)組內(nèi)成員分工? 描述一下你做過(guò)項(xiàng)目的流程。

      加班到12點(diǎn),突然有人來(lái)問(wèn)你技術(shù)上的難題,你會(huì)如何處理? Oracle的冷備份、熱備份 Strurs中怎樣實(shí)現(xiàn) Hibernate怎樣實(shí)現(xiàn)ORM Spring 的事務(wù)處理機(jī)制

      Strurs的驗(yàn)證方式,Javascript的驗(yàn)證的方式

      一個(gè)是服務(wù)器端驗(yàn)證,一個(gè)是客戶(hù)端驗(yàn)證

      Struts的工作機(jī)制 Delete/trancate的區(qū)別

      trancate與delete都是刪除數(shù)據(jù),不同的是trancate是將表的所有數(shù)據(jù)都刪除,而delete可以有選擇地刪除數(shù)據(jù); delete刪除數(shù)據(jù)是記錄在日志中的,可以通過(guò)其將數(shù)據(jù)恢復(fù),而trancate則是將整個(gè)表截?cái)?,其操作是不記錄在日志里的?6、47、48、作為項(xiàng)目組長(zhǎng),你遇到的最大問(wèn)題是什么?如何解決?

      Ajax/內(nèi)嵌框架實(shí)現(xiàn)局部刷新,有什么差別?

      Exception/Error的區(qū)別,在什么情況下可以?huà)伋鯮untimeException 父類(lèi)不同

      知道異常和錯(cuò)誤最本質(zhì)的區(qū)別就是異常能被開(kāi)發(fā)人員處理而錯(cuò)誤時(shí)系統(tǒng)本來(lái)自帶的,一般無(wú)法處理也不需要我們程序員來(lái)處理。

      在程序運(yùn)行時(shí)候出錯(cuò)而又不是系統(tǒng)原因差生的,一般是由于程序原因產(chǎn)生,比如程序?qū)懙牟粔驀?yán)謹(jǐn)、完善

      典型的RuntimeException

      ArithmeticException、ClassCastException、IndexOutOfBoundsException、NullPointerException、UnsupportedOperationException 等.49、50、51、52、53、54、55、56、57、58、59、Orcale 物化視圖(MV)

      業(yè)務(wù)處理模塊中,是如何處理事務(wù)? Sql語(yǔ)句如何優(yōu)化 數(shù)據(jù)庫(kù)右連接

      JDBC的連接關(guān)閉在哪?

      Finally語(yǔ)句塊內(nèi)

      錯(cuò)誤處理模塊是放在哪個(gè)層的。接口能否繼承接口。

      接口可以繼承接口..但是要使用extends~而不是用implements 抽象類(lèi)能否繼承實(shí)體類(lèi)。

      抽象類(lèi)是可以繼承實(shí)體類(lèi),但前提是實(shí)體類(lèi)必須有明確的構(gòu)造函數(shù) 答案很明確,可以繼承。

      項(xiàng)目中查詢(xún)時(shí)怎么樣實(shí)現(xiàn)的?

      作為項(xiàng)目負(fù)責(zé)人你是管理這個(gè)團(tuán)隊(duì)的?

      在你做項(xiàng)目過(guò)程中遇到些什么問(wèn)題,是怎么樣解決的?

      Jquery中的幾種選擇器:

      Javascript如何進(jìn)行數(shù)字和字符串之間的轉(zhuǎn)換?

      數(shù)字類(lèi)型轉(zhuǎn)換成String類(lèi)型用 對(duì)象=對(duì)象.toString()方法,字符串轉(zhuǎn)換成數(shù)字類(lèi)型則是對(duì)象=Number(對(duì)象);

      第五篇:Java就業(yè)面試題

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

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

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

      &&還具有短路的功能,即如果

      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)行特殊處理,因此可以正確編譯。

      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,將一個(gè)數(shù)左移n位,就相當(dāng)于乘以了2的n次方,那么,一個(gè)數(shù)乘以8只要將其左移3位即可,而位運(yùn)算cpu直接支持的,效率最高,所以,2乘以8等於幾的最效率的方法是2 << 3。

      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ū)別?

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

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

      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)引用。

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

      不可以。非static方法是要與對(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)用。一個(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.floor(11.6)的結(jié)果為11,Math.floor(-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。

      15、下面的代碼有什么不妥之處? 1.if(username.equals(“zxx”){} 如果username=null;會(huì)報(bào)異常,而且少個(gè)括號(hào)結(jié)束。

      2.int x = 1;return x==1?true:false;X==1返回的本來(lái)就是boolean類(lèi)型 后面的true:false是多余的.16、請(qǐng)說(shuō)出作用域public,private,protected,以及不寫(xiě)時(shí)的區(qū)別 這四個(gè)作用域的可見(jiàn)范圍如下表所示。

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

      作用域

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

      √ protected √

      × friendly

      ×

      × private

      ×

      ×

      ×

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

      17、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)方法的訪(fǎng)問(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ò)訪(fǎng)問(wèn)權(quán)限、返回類(lèi)型、拋出的異常進(jìn)行重載;

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

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

      18、說(shuō)說(shuō)對(duì)javaee中的session的理解,你是怎么用session的?

      在Java Servlet API中引入session機(jī)制來(lái)跟蹤客戶(hù)的狀態(tài)。session指的是在一段時(shí)間內(nèi),單個(gè)客戶(hù)與Web服務(wù)器的一連串相關(guān)的交互過(guò)程。在一個(gè)session中,客戶(hù)可能會(huì)多次請(qǐng)求同一個(gè)網(wǎng)頁(yè),也有可能請(qǐng)求訪(fǎng)問(wèn)各種不同的服務(wù)器資源。例如在電子郵件應(yīng)用中,從一個(gè)客戶(hù)登錄到電子郵件系統(tǒng)開(kāi)始,經(jīng)過(guò)收信,寫(xiě)信,和發(fā)信等,直至退出郵件系統(tǒng),整個(gè)過(guò)程為一個(gè)session。再比如,在網(wǎng)上書(shū)店應(yīng)用中,從一個(gè)客戶(hù)開(kāi)始購(gòu)物,到最后結(jié)賬,整個(gè)過(guò)程為一個(gè)session。

      會(huì)話(huà)的創(chuàng)建:HttpSession session = request.getSession(boolean value);HttpSession session = request.getSession();會(huì)話(huà)的使用:javax.servlet.http.HttpSession接口中定義的方法,我們常用的是有關(guān)進(jìn)行數(shù)據(jù)存取的方法。

      session.setAttribute(String name , Object value);session.getAttribute(String name);

      19、說(shuō)說(shuō)has a與is a的區(qū)別。

      is-a表示的是屬于得關(guān)系。比如兔子屬于一種動(dòng)物(繼承關(guān)系)。has-a表示組合,包含關(guān)系。比如兔子包含有腿,頭等組件;

      20、線(xiàn)程如何同步和通訊。

      只有多個(gè)synchronized代碼塊使用的是同一個(gè)監(jiān)視器對(duì)象,這些synchronized代碼塊之間才具有線(xiàn)程互斥的效果,假如a代碼塊用obj1作為監(jiān)視器對(duì)象,假如b代碼塊用obj2作為監(jiān)視器對(duì)象,那么,兩個(gè)并發(fā)的線(xiàn)程可以同時(shí)分別進(jìn)入這兩個(gè)代碼塊中。對(duì)于同步方法的分析,所用的同步監(jiān)視器對(duì)象是this 接著對(duì)于靜態(tài)同步方法的分析,所用的同步監(jiān)視器對(duì)象是該類(lèi)的Class對(duì)象 接著對(duì)如何實(shí)現(xiàn)代碼塊與方法的同步進(jìn)行分析。2.ClassLoader如何加載class。

      jvm里有多個(gè)類(lèi)加載,每個(gè)類(lèi)加載可以負(fù)責(zé)加載特定位置的類(lèi),例如,bootstrap類(lèi)加載負(fù)責(zé)加載jre/lib/rt.jar中的類(lèi),我們平時(shí)用的jdk中的類(lèi)都位于rt.jar中。

      extclassloader負(fù)責(zé)加載jar/lib/ext/*.jar中的類(lèi),appclassloader負(fù)責(zé)classpath指定的目錄或jar中的類(lèi)。除了bootstrap之外,其他的類(lèi)加載器本身也都是java類(lèi),它們的父類(lèi)是ClassLoader。3.Servlet的生命周期

      ? 通常情況下,服務(wù)器只會(huì)創(chuàng)建一個(gè)Servlet實(shí)例對(duì)象,也就是說(shuō)Servlet實(shí)例對(duì)象一旦創(chuàng)建,它就會(huì)駐留在內(nèi)存中,為后續(xù)的其它請(qǐng)求服務(wù),直至web容器退出,servlet實(shí)例對(duì)象才會(huì)銷(xiāo)毀。

      Web容器退出,調(diào)用destory方法,結(jié)束servlet; 4.抽象類(lèi)的作用

      5.ArrayList如何實(shí)現(xiàn)插入的數(shù)據(jù)按自定義的方式有序存放 class MyBean implements Comparable{ public int compareTo(Object obj){ if(!obj instanceof MyBean)throw new ClassCastException()//具體異常的名稱(chēng),我要查jdk文檔。

      MyBean other =(MyBean)obj;return age > other.age?1:age== other.age?0:-1;} }

      class MyTreeSet {

      private ArrayList datas = new ArrayList();

      public void add(Object obj){ for(int i=0;i

      6.分層設(shè)計(jì)的好處;把各個(gè)功能按調(diào)用流程進(jìn)行了模塊化,模塊化帶來(lái)的好處就是可以隨意組合,舉例說(shuō)明:如果要注冊(cè)一個(gè)用戶(hù),流程為顯示界面并通過(guò)界面接收用戶(hù)的輸入,接著進(jìn)行業(yè)務(wù)邏輯處理,在處理業(yè)務(wù)邏輯又訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),如果我們將這些步驟全部按流水帳的方式放在一個(gè)方法中編寫(xiě),這也是可以的,但這其中的壞處就是,當(dāng)界面要修改時(shí),由于代碼全在一個(gè)方法內(nèi),可能會(huì)碰壞業(yè)務(wù)邏輯和數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的碼,同樣,當(dāng)修改業(yè)務(wù)邏輯或數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的代碼時(shí),也會(huì)碰壞其他部分的代碼。分層就是要把界面部分、業(yè)務(wù)邏輯部分、數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)部分的代碼放在各自獨(dú)立的方法或類(lèi)中編寫(xiě),這樣就不會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的問(wèn)題了。這樣分層后,還可以方便切換各層,譬如原來(lái)的界面是Swing,現(xiàn)在要改成

      BS界面,如果最初是按分層設(shè)計(jì)的,這時(shí)候不需要涉及業(yè)務(wù)和數(shù)據(jù)訪(fǎng)問(wèn)的代碼,只需編寫(xiě)一條web界面就可以了。

      下面的僅供參考,不建議照搬照套,一定要改成自己的語(yǔ)言,發(fā)現(xiàn)內(nèi)心的感受: 分層的好處:

      1,實(shí)現(xiàn)了軟件之間的解耦; 2.便于進(jìn)行分工 3.便于維護(hù)

      4,提高軟件組件的重用

      5.便于替換某種產(chǎn)品,比如持久層用的是hibernate,需要更換產(chǎn)品用toplink,就不用該其他業(yè)務(wù)代碼,直接把配置一改。6.便于產(chǎn)品功能的擴(kuò)展。

      7。便于適用用戶(hù)需求的不斷變化

      7.序列化接口的id有什么用?

      對(duì)象經(jīng)常要通過(guò)IO進(jìn)行傳送,讓你寫(xiě)程序傳遞對(duì)象,你會(huì)怎么做?把對(duì)象的狀態(tài)數(shù)據(jù)用某種格式寫(xiě)入到硬盤(pán),Person->“zxx,male,28,30000”?Person,既然大家都要這么干,并且沒(méi)有個(gè)統(tǒng)一的干法,于是,sun公司就提出一種統(tǒng)一的解決方案,它會(huì)把對(duì)象變成某個(gè)格式進(jìn)行輸入和輸出,這種格式對(duì)程序員來(lái)說(shuō)是透明(transparent)的,但是,我們的某個(gè)類(lèi)要想能被sun的這種方案處理,必須實(shí)現(xiàn)Serializable接口。

      ObjectOutputStream.writeObject(obj);Object obj = ObjectInputStream.readObject();假設(shè)兩年前我保存了某個(gè)類(lèi)的一個(gè)對(duì)象,這兩年來(lái),我修改該類(lèi),刪除了某個(gè)屬性和增加了另外一個(gè)屬性,兩年后,我又去讀取那個(gè)保存的對(duì)象,或有什么結(jié)果?未知!sun的jdk就會(huì)蒙了。為此,一個(gè)解決辦法就是在類(lèi)中增加版本后,每一次類(lèi)的屬性修改,都應(yīng)該把版本號(hào)升級(jí)一下,這樣,在讀取時(shí),比較存儲(chǔ)對(duì)象時(shí)的版本號(hào)與當(dāng)前類(lèi)的版本號(hào),如果不一致,則直接報(bào)版本號(hào)不同的錯(cuò)!

      9.hashCode方法的作用?說(shuō)(網(wǎng)友提供的一段,待改進(jìn):hashcode這個(gè)方法是用來(lái)鑒定2個(gè)對(duì)象是否相等的。

      那你會(huì)說(shuō),不是還有equals這個(gè)方法嗎?

      不錯(cuò),這2個(gè)方法都是用來(lái)判斷2個(gè)對(duì)象是否相等的。但是他們是有區(qū)別的。一般來(lái)講,equals這個(gè)方法是給用戶(hù)調(diào)用的,如果你想判斷2個(gè)對(duì)象是否相等,你可以重寫(xiě)equals方法,然后在代碼中調(diào)用,就可以判斷他們是否相等了。簡(jiǎn)單來(lái)講,equals方法主要是用來(lái)判斷從表面上看或者從內(nèi)容上看,2個(gè)對(duì)象是不是相等。舉個(gè)例子,有個(gè)學(xué)生類(lèi),屬性只有姓名和性別,那么我們可以認(rèn)為只要姓名和性別相等,那么就說(shuō)這2個(gè)對(duì)象是相等的。

      hashcode方法一般用戶(hù)不會(huì)去調(diào)用,比如在hashmap中,由于key是不可以重復(fù)的,他在判斷key是不是重復(fù)的時(shí)候就判斷了hashcode這個(gè)方法,而且也用到了equals方法。這里不可以重復(fù)是說(shuō)equals和hashcode只要有一個(gè)不等就可以了!所以簡(jiǎn)單來(lái)講,hashcode相當(dāng)于是一個(gè)對(duì)象的編碼,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比較起來(lái)不直觀。我們一般在覆蓋equals的同時(shí)也要覆蓋hashcode,讓他們的邏輯一致。舉個(gè)

      例子,還是剛剛的例子,如果姓名和性別相等就算2個(gè)對(duì)象相等的話(huà),那么hashcode的方法也要返回姓名的hashcode值加上性別的hashcode值,這樣從邏輯上,他們就一致了。

      要從物理上判斷2個(gè)對(duì)象是否相等,用==就可以了。)

      10.webservice問(wèn)得很多

      11.設(shè)計(jì)出計(jì)算任意正整數(shù)的階層。

      4.在oracle數(shù)據(jù)庫(kù)中需要查詢(xún)出前8條記錄的sql語(yǔ)句怎么寫(xiě)? Select * from(select *,rownum r from test where r<8)

      5.什么是SOA,談?wù)勀愕腟OA的理解。service orientied architecture 面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architecture,SOA)是一個(gè)組件模型,它將應(yīng)用程序的不同功能單元(稱(chēng)為服務(wù))通過(guò)這些服務(wù)之間定義良好的接口和契約聯(lián)系起來(lái)。接口是采用中立的方式進(jìn)行定義的,它應(yīng)該獨(dú)立于實(shí)現(xiàn)服務(wù)的硬件平臺(tái)、操作系統(tǒng)和編程語(yǔ)言。這使得構(gòu)建在各種這樣的系統(tǒng)中的服務(wù)可以一種統(tǒng)一和通用的方式進(jìn)行交互。松耦合的

      6.如何實(shí)現(xiàn)線(xiàn)程間的通訊。

      新題目:編程:1.編寫(xiě)一個(gè)函數(shù)將一個(gè)十六進(jìn)制數(shù)的字符串參數(shù)轉(zhuǎn)換成整數(shù)返回。String str = “13abf”;int len = str.length;int sum = 0;for(int i=0;i

      其實(shí),也可以用Integer.parseInt(str,16),但面試官很可能是想考我們的編碼基本功。

      編程2 :銀行貸款的還款方式中最常用的是一種叫“等額本息”,還款法,即借款人在約定還款期限內(nèi)的每一期(月)歸還的金額(產(chǎn)生的利息+部分本金)都是相等的,現(xiàn)有一筆總額為T(mén)元的N年期住房貸款,年利率為R,要求算出每一期的還款的本金和利息總額,請(qǐng)寫(xiě)出解決思路和任意一種編程語(yǔ)言實(shí)現(xiàn)的主要代碼。思路:既然是按月還款,那我就要將N年按月來(lái)計(jì)算,即要還N*12個(gè)月,這樣就可以求出每月要還的本金。由于每月要還的那部分本金所欠的時(shí)間不同,所以,

      它們所產(chǎn)生的利息是不同的,該部分本金的利息為:部分本金額*所欠月數(shù)*月利率。應(yīng)該是這么個(gè)算法,如果利息還計(jì)利息,如果月還款不按年利率來(lái)算,老百姓算不明白的。

      int monthMoney = T/N/12;float monthRate = R/12;int totalMonth = N * 12;float totalRate = 0;for(int i=1;i<=totalMonth;i++){ totalRate += monthMoney * monthRate * i;} int result = monthMoney + totalRate/N/12;

      幾道題:

      1.****Spring的DI是什么(學(xué)員注:除了IOC,AOP這些概念,還不太清楚DI的概念)

      什么是DI機(jī)制?

      依賴(lài)注入(Dependecy Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念,具體的講:當(dāng)某個(gè)角色

      需要另外一個(gè)角色協(xié)助的時(shí)候,在傳統(tǒng)的程序設(shè)計(jì)過(guò)程中,通常由調(diào)用者來(lái)創(chuàng)建被調(diào)用者的實(shí)例。但在spring中

      創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來(lái)完成,因此稱(chēng)為控制反轉(zhuǎn)。創(chuàng)建被調(diào)用者的工作由spring來(lái)完成,然后注入調(diào)用者

      因此也稱(chēng)為依賴(lài)注入。

      spring以動(dòng)態(tài)靈活的方式來(lái)管理對(duì)象,注入的兩種方式,設(shè)置注入和構(gòu)造注入。

      設(shè)置注入的優(yōu)點(diǎn):直觀,自然

      構(gòu)造注入的優(yōu)點(diǎn):可以在構(gòu)造器中決定依賴(lài)關(guān)系的順序。

      2.*任意數(shù)字序列“123456”之類(lèi),輸出它們所有的排列組合 2題的答案:

      String str = “xafdvs”;char[] arr1 = str.toCharArray();char[] arr2 = Arrays.copyOf(arr1,arr1.length);for(int i=0;i

      3.*****什么是AOP(學(xué)員注:會(huì)用,但感覺(jué)說(shuō)不清楚)什么是AOP?

      面向切面編程(AOP)完善spring的依賴(lài)注入(DI),面向切面編程在spring中主要表現(xiàn)為兩個(gè)方面

      1.面向切面編程提供聲明式事務(wù)管理

      2.spring支持用戶(hù)自定義的切面

      面向切面編程(aop)是對(duì)面向?qū)ο缶幊蹋╫op)的補(bǔ)充,面向?qū)ο缶幊虒⒊绦蚍纸獬筛鱾€(gè)層次的對(duì)象,面向切面編程將程序運(yùn)行過(guò)程分解成各個(gè)切面。

      AOP從程序運(yùn)行角度考慮程序的結(jié)構(gòu),提取業(yè)務(wù)處理過(guò)程的切面,oop是靜態(tài)的抽象,aop是動(dòng)態(tài)的抽象,是對(duì)應(yīng)用執(zhí)行過(guò)程中的步驟進(jìn)行抽象,從而獲得步驟之間的邏輯劃分。

      aop框架具有的兩個(gè)特征:

      1.各個(gè)步驟之間的良好隔離性

      2.源代碼無(wú)關(guān)性

      spring 的優(yōu)點(diǎn)?

      1.降低了組件之間的耦合性,實(shí)現(xiàn)了軟件各層之間的解耦

      2.可以使用容易提供的眾多服務(wù),如事務(wù)管理,消息服務(wù)等

      3.容器提供單例模式支持

      4.容器提供了AOP技術(shù),利用它很容易實(shí)現(xiàn)如權(quán)限攔截,運(yùn)行期監(jiān)控等功能

      5.容器提供了眾多的輔助類(lèi),能加快應(yīng)用的開(kāi)發(fā)

      6.spring對(duì)于主流的應(yīng)用框架提供了集成支持,如hibernate,JPA,Struts等

      7.spring屬于低侵入式設(shè)計(jì),代碼的污染極低

      8.獨(dú)立于各種應(yīng)用服務(wù)器

      9.spring的DI機(jī)制降低了業(yè)務(wù)對(duì)象替換的復(fù)雜性

      10.Spring的高度開(kāi)放性,并不強(qiáng)制應(yīng)用完全依賴(lài)于Spring,開(kāi)發(fā)者可以自由選擇spring的部分或全部

      3題的答案:

      1.概念介紹:所謂AOP,即Aspect orientied program,就是面向方面的編程,2.解釋什么是方面:貫穿到系統(tǒng)的各個(gè)模塊中的系統(tǒng)一個(gè)功能就是一個(gè)方面,比如,記錄日志,統(tǒng)一異常處理,事務(wù)處理,全限檢查,這些功能都是軟件系統(tǒng) 的一個(gè)面,而不是一點(diǎn),在各個(gè)模塊中都要出現(xiàn)。

      3.什么是面向方面編程:把系統(tǒng)的一個(gè)方面的功能封裝成對(duì)象的形式來(lái)處理 4.怎么進(jìn)行面向方面編程:把功能模塊對(duì)應(yīng)的對(duì)象作為切面嵌入到原來(lái)的各個(gè)系統(tǒng)模塊中,采用代理技術(shù),代理會(huì)調(diào)用目標(biāo),同時(shí)把切面功能的代碼(對(duì)象)加入進(jìn)來(lái),所以,用spring配置代理對(duì)象時(shí)只要要配兩個(gè)屬性,分別表示目標(biāo)和切面對(duì)象(Advisor)。

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

      4、接口是否可繼承接口? 抽象類(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ì)提供這樣的支持,如果不提供的話(huà),有什么理由嗎?如果你沒(méi)有道理不提供,那答案就是肯定的了。

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

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

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

      6、面向?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)性而帶來(lái)的變動(dòng)影響。在面向?qū)ο蟮木幊陶Z(yǔ)言中,對(duì)象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語(yǔ)言的封裝更為清晰、更為有力。面向?qū)ο蟮姆庋b就是把描述一個(gè)對(duì)象的屬性和行為的代碼封裝在一個(gè)“模塊”中,也就是一個(gè)類(lèi)中,屬性用變量定義,行為用方法進(jìn)行定義,方法可以直接訪(fǎng)問(wèn)同一個(gè)對(duì)象中的屬性。通常情況下,只要記住讓變量和訪(fǎng)問(wèn)這個(gè)變量的方法放在一起,將一個(gè)類(lèi)中的成員變量全部定義成私有的,只有這個(gè)類(lèi)自己的方法才可以訪(fǎng)問(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à)圓的方法必須分配給圓,它才能訪(fǎng)問(wèn)到圓心和半徑這兩個(gè)屬性,人以后只是調(diào)用圓的畫(huà)圓方法、表示給圓發(fā)給消息而已,畫(huà)圓這個(gè)方法不應(yīng)該分配在人這個(gè)對(duì)象上,這就是面向

      對(duì)象的封裝性,即將對(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 { String name;int age;} 人本來(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);

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

      7、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)型中定義的方法。

      8、abstract class和interface有什么區(qū)別? 含有abstract修飾符的class即為抽象類(lèi),abstract 類(lèi)不能創(chuàng)建的實(shí)例對(duì)象。含有abstract方法的類(lèi)必須定義為abstract 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)中的抽象方法的訪(fǎng)問(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)成員變量的訪(fǎng)問(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)限判斷、記錄訪(fǎng)問(wèn)日志和處理異常,那么就可以定義一個(gè)抽象的基類(lèi),讓所有的Servlet都繼承這個(gè)抽象基類(lèi),在抽象基類(lèi)的service方法中完成權(quán)限判斷、記錄訪(fǎng)問(wèn)日志和處理異常的代碼,在各個(gè)子類(lèi)中只是完成各自的業(yè)務(wù)邏輯代碼,偽代碼如下:

      public abstract class BaseServlet extends HttpServlet { public final void service(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException { 記錄訪(fǎng)問(wèn)日志 進(jìn)行權(quán)限判斷

      if(具有權(quán)限){ try { doService(request,response);} catch(Excetpion e){ 記錄異常信息 } } } protected abstract void doService(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException;//注意訪(fǎng)問(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 void doService(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException { 本Servlet只處理的具體業(yè)務(wù)邏輯代碼 } } 父類(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è)方面逐一去比較回答,接著從

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

      native方法表示該方法要用另外一種依賴(lài)平臺(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是什么。

      10、什么是內(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)可以直接訪(fǎng)問(wèn)外部類(lèi)中的成員變量,內(nèi)部類(lèi)可以定義在外部類(lèi)的方法外面,也可以定義在外部類(lèi)的方法體中,如下所示: public class Outer { int out_x = 0;public void method()

      { Inner1 inner1 = new Inner1();public class Inner2

      //在方法體內(nèi)部定義的內(nèi)部類(lèi) { public method(){ out_x = 3;}

      } Inner2 inner2 = new Inner2();}

      public class Inner1

      //在方法體外面定義的內(nèi)部類(lèi) { } } 在方法體外面定義的內(nèi)部類(lèi)的訪(fǎng)問(wèn)類(lèi)型可以是public,protecte,默認(rèn)的,private等4種類(lèi)型,這就好像類(lèi)中定義的成員變量有4種訪(fǎng)問(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)前面不能有訪(fǎng)問(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)訪(fǎng)問(wèn)。這種內(nèi)部類(lèi)必須是先定義,后使用,即內(nèi)部類(lèi)的定義代碼必須出現(xiàn)在使用該類(lèi)之前,這與方法中的局部變量必須先定義后使用的道理也是一樣的。這種內(nèi)部類(lèi)可以訪(fǎng)問(wèn)方法體中的局部變量,但是,該局部變量前必須加final修飾符。

      對(duì)于這些細(xì)節(jié),只要在eclipse寫(xiě)代碼試試,根據(jù)開(kāi)發(fā)工具提示的各類(lèi)錯(cuò)誤信息就可以馬上了解到。

      在方法體內(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(){ public void run(){};}).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)于外部類(lèi)的實(shí)例對(duì)象,所以,static Nested Class能訪(fǎng)問(wèn)外部類(lèi)的非static成員變量。當(dāng)在外部類(lèi)中訪(fǎng)問(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)用方式很相似,它除了可以直接訪(fǎng)問(wèn)外部類(lèi)中的static的成員變量,還可以訪(fǎng)問(wèn)靜態(tài)方法中的局部變量,但是,該局部變量前必須加final修飾符。

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

      11、內(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)的一種特例,那在這種情況下不可以訪(fǎng)問(wèn)外部類(lèi)的普通成員變量,而只能訪(fǎng)問(wèn)外部類(lèi)中的靜態(tài)成員,例如,下面的代碼: class Outer { static int x;static class Inner { void test(){ syso(x);} } }

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

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

      13、super.getClass()方法調(diào)用

      下面程序的輸出結(jié)果是多少? import java.util.Date;public class Test extends Date{ public static void main(String[] args){ new Test().test();}

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

      很奇怪,結(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();

      14.jdk中哪些類(lèi)是不能繼承的?

      不能繼承的是類(lèi)是那些用final關(guān)鍵字修飾的類(lèi)。一般比較基本的類(lèi)型或防止擴(kuò)展類(lèi)無(wú)意間破壞原來(lái)方法的實(shí)現(xiàn)的類(lèi)型都應(yīng)該是final的,在jdk中System,String,StringBuffer等都是基本類(lèi)型。

      2、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)

      111、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à)會(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)造器,總是會(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ì)象是只讀的,所以多線(xiàn)程并發(fā)訪(fǎng)問(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。

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

      27、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ū)拿。

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

      JAVA平臺(tái)提供了兩個(gè)類(lèi):String和StringBuffer,它們可以?xún)?chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。String類(lèi)表示內(nèi)容不可改變的字符串。而StringBuffer類(lèi)表示內(nèi)容可以被修改的字符串。當(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++){ sbf.append(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++){ str = str + 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)題。

      8.StringBuffer與StringBuilder的區(qū)別

      StringBuffer和StringBuilder類(lèi)都表示內(nèi)容可以被修改的字符串,StringBuilder是線(xiàn)程不安全的,運(yùn)行效率高,如果一個(gè)字符串變量是在方法里面定義,這種情況只可能有一個(gè)線(xiàn)程訪(fǎng)問(wèn)它,不存在不安全的因素了,則用StringBuilder。如果要在類(lèi)里面定義成員變量,并且這個(gè)類(lèi)的實(shí)例對(duì)象會(huì)在多線(xiàn)程環(huán)境下使用,那么最好用StringBuffer。

      3、如何把一段逗號(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();}

      38、數(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è)方法。

      39、下面這條語(yǔ)句一共創(chuàng)建了多少個(gè)對(duì)象:String s=”a“+”b“+”c“+”d“;答:對(duì)于如下代碼: String s1 = ”a“;String s2 = s1 + ”b“;String s3 = ”a“ + ”b“;System.out.println(s2 == ”ab“);System.out.println(s3 == ”ab“);

      } finally { ++x;} }

      }

      ---------執(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ō)這話(huà)之前放進(jìn)罐子里的。

      7、下面的程序代碼輸出的結(jié)果是多少? public class smallT { public static void main(String args[]){ smallT t = new smallT();int b = t.get();System.out.println(b);}

      public int get(){ try { return 1;} finally { return 2;} } }

      返回的結(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 { /**

      * @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());;}

      int test(){ try { return func1();} finally { return func2();} }

      int func1(){ System.out.println(”func1“);return 1;} int func2(){ System.out.println(”func2“);return 2;} }-----------執(zhí)行結(jié)果-----------------

      func1 func2 2

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

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

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

      內(nèi)部類(lèi)要訪(fǎng)問(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)用

      5、運(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í)異常。

      15、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ā)生的情況。

      50、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)存溢出和線(xiàn)程死鎖等系統(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)題,是用戶(hù)能夠克服的問(wèn)題,例如,網(wǎng)絡(luò)斷線(xiàn),硬盤(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ò)誤;

      33、請(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、ClassCastException。unknowntypeException illegalArgumentException 96、JAVA語(yǔ)言如何進(jìn)行異常處理,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以?huà)伋霎惓幔?/p>

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

      java5以前,有如下兩種:

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

      notify()重新啟動(dòng)線(xiàn)程。

      13、sleep()和 wait()有什么區(qū)別?(網(wǎng)上的答案:sleep是線(xiàn)程類(lèi)(Thread)的方法,導(dǎo)致此線(xiàn)程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線(xiàn)程,但是監(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)致本線(xiàn)程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線(xiàn)程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。)

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

      public class MultiThread { /**

      * @param args */

      public static void main(String[] args){ // TODO Auto-generated method stub new Thread(new Thread1()).start();try { Thread.sleep(10);} catch(InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace();} new Thread(new Thread2()).start();}

      private static class Thread1 implements Runnable {

      @Override

      public void run(){ // TODO Auto-generated method stub //由于這里的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ì)象。synchronized(MultiThread.class){

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

      System.out.println(”thread1 is waiting“);try { //釋放鎖有兩種方式,System.out.println(”enter thread2...“);

      System.out.println(”thread2 notify other thread can release wait status..“);//由于notify方法并不釋放鎖,即使thread2調(diào)用下面的sleep方法休息了10毫秒,但thread1仍然不會(huì)執(zhí)行,因?yàn)閠hread2沒(méi)有釋放鎖,所以Thread1無(wú)法得不到鎖。

      MultiThread.class.notify();

      System.out.println(”thread2 is sleeping millisecond...“);try { Thread.sleep(10);} catch(InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace();}

      System.out.println(”thread2 is going on...“);System.out.println(”thread2 is being over!“);} } } }

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

      如果數(shù)據(jù)將在線(xiàn)程間共享。例如正在寫(xiě)的數(shù)據(jù)以后可能被另一個(gè)線(xiàn)程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線(xiàn)程寫(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)該使用異步編程,在很多情況下采用異步途徑往往更有效率。

      ten

      17.下面兩個(gè)方法同步嗎?(自己發(fā)明)

      class Test { synchronized static void sayHello3(){ }

      synchronized void getX(){} }

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

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

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

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

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

      47、當(dāng)一個(gè)線(xiàn)程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線(xiàn)程是否可進(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,則不能。

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

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

      一個(gè)程序中可以有多條執(zhí)行線(xiàn)索同時(shí)執(zhí)行,一個(gè)線(xiàn)程就是程序中的一條執(zhí)行線(xiàn)索,每個(gè)線(xiàn)程上都關(guān)聯(lián)有要執(zhí)行的代碼,即可以有多段程序代碼同時(shí)運(yùn)行,每個(gè)程序至少都有一個(gè)線(xiàn)程,即main方法執(zhí)行的那個(gè)線(xiàn)程。如果只是一個(gè)cpu,它怎么能夠同時(shí)執(zhí)行多段程序呢?這是從宏觀上來(lái)看的,cpu一會(huì)執(zhí)行a線(xiàn)索,一會(huì)執(zhí)行b線(xiàn)索,切換時(shí)間很快,給人的感覺(jué)是a,b在同時(shí)執(zhí)行,好比大家在同一個(gè)辦公室上網(wǎng),只有一條鏈接到外部網(wǎng)線(xiàn),其實(shí),這條網(wǎng)線(xiàn)一會(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)用線(xiàn)程的start方法后線(xiàn)程進(jìn)入就緒狀態(tài),線(xiàn)程調(diào)度系統(tǒng)將就緒狀態(tài)的線(xiàn)程轉(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)線(xiàn)程關(guān)聯(lián)的代碼執(zhí)行完后,線(xiàn)程變?yōu)榻Y(jié)束狀態(tài)。

      71、簡(jiǎn)述synchronized和java.util.concurrent.locks.Lock的異同 ?

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

      主要不同點(diǎn):Lock有比synchronized更精確的線(xiàn)程語(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 { /**

      * @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();} }

      private class Subtractor implements Runnable {

      @Override

      public void run(){ // TODO Auto-generated method stub while(true){ /*synchronized(ThreadTest.this){ System.out.println(”j--=“ + j--);//這里拋異常了,鎖能釋放嗎?

      }*/

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

      private class Adder implements Runnable {

      @Override

      public void run(){ // TODO Auto-generated method stub while(true)

      { /*synchronized(ThreadTest.this){ System.out.println(”j++=“ + j++);}*/

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

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

      以下程序使用內(nèi)部類(lèi)實(shí)現(xiàn)線(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();} } } }

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

      void call { for(int i=0;i<2;i++){ new Thread(new Runnable(){ public void run(){while(true){j.accumulate()}}}).start();new Thread(new Runnable(){ public void run(){while(true){j.sub()}}}).start();} } }

      class JManager { private j = 0;

      public synchronized void subtract(){

      j--}

      public synchronized void accumulate(){ j++;} }

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

      最終的程序代碼如下:

      public class ThreadTest { /**

      * @param args */

      public static void main(String[] args){ // TODO Auto-generated method stub new ThreadTest().init();}

      public void init(){ final Business business = new Business();new Thread(new Runnable(){

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

      ).start();

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

      private class Business { boolean bShouldSub = true;//這里相當(dāng)于定義了控制該誰(shuí)執(zhí)行的一個(gè)信號(hào)燈

      public synchronized void MainThread(int i){ if(bShouldSub)try { this.wait();} catch(InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace();}

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

      public synchronized void SubThread(int i){ if(!bShouldSub)try { this.wait();} catch(InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace();}

      +

      for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+ ”:i=“ + i +”,j=“ + j);} bShouldSub = false;this.notify();} } }

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

      package com.huawei.interview.lym;

      public class ThreadTest {

      private static boolean bShouldMain = false;

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

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

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

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

      }.start();*/

      //final String str = new String(”“);

      new Thread(new Runnable(){ public void run()

      { for(int i=0;i<50;i++){ synchronized(ThreadTest.class){ if(bShouldMain){ try { ThreadTest.class.wait();} catch(InterruptedException e){ e.printStackTrace();} } for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+ ”i=“ + i + ”,j=“ + j);} bShouldMain = true;ThreadTest.class.notify();} } } }).start();

      for(int i=0;i<50;i++){ synchronized(ThreadTest.class){ if(!bShouldMain){ try { ThreadTest.class.wait();} catch(InterruptedException e){ e.printStackTrace();} } for(int j=0;j<5;j++){ System.out.println(Thread.currentThread().getName()+ ”i=“ + i + ”,j=“ + j);} bShouldMain = false;

      ThreadTest.class.notify();} } } }

      下面使用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(){ public void run(){ for(int i=0;i<50;i++){ lock.lock();try { if(!bBhouldSubThread)subThreadCondition.await();for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+ ”,j=“ + j);} bBhouldSubThread = false;subThreadCondition.signal();}catch(Exception e){ } finally { lock.unlock();}

      } } });threadPool.shutdown();for(int i=0;i<50;i++){ lock.lock();try { if(bBhouldSubThread)subThreadCondition.await();for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+ ”,j=“ + j);} bBhouldSubThread = true;subThreadCondition.signal();}catch(Exception e){ } finally { lock.unlock();} } } }

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

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

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

      3、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是線(xiàn)程安全的,也就是說(shuō)是它的方法之間是線(xiàn)程同步的,而ArrayList是線(xiàn)程序不安全的,它的方法之間是線(xiàn)程不同步的。如果只有一個(gè)線(xiàn)程會(huì)訪(fǎng)問(wèn)到集合,那最好是使用ArrayList,因?yàn)樗豢紤]線(xiàn)程安全,效率會(huì)高些;如果有多個(gè)線(xiàn)程會(huì)訪(fǎng)問(wèn)到集合,那最好是使用Vector,因?yàn)椴恍枰覀冏约涸偃タ紤]和編寫(xiě)線(xiàn)程安全的代碼。

      備注:對(duì)于Vector&ArrayList、Hashtable&HashMap,要記住線(xiàn)程安全的問(wèn)題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線(xiàn)程安全的,ArrayList與HashMap是java2時(shí)才提供的,它們是線(xiàn)程不安全的。所以,我們講課時(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)空間的方法??偨Y(jié):即Vector增長(zhǎng)原來(lái)的一倍,ArrayList增加原來(lái)的0.5倍。

      4、HashMap和Hashtable的區(qū)別

      (條理上還需要整理,也是先說(shuō)相同點(diǎn),再說(shuō)不同點(diǎn))HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線(xiàn)程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線(xiàn)程安全,在只有一個(gè)線(xiàn)程訪(fǎng)問(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è)線(xiàn)程訪(fǎng)問(wèn)Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而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是線(xiàn)程安全的,也就是說(shuō)是同步的,而HashMap是線(xiàn)程序不安全的,不是同步的

      三.值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value

      5、List 和 Map 區(qū)別? 一個(gè)是存儲(chǔ)單列數(shù)據(jù)的集合,另一個(gè)是存儲(chǔ)鍵和值這樣的雙列數(shù)據(jù)的集合,List中存儲(chǔ)的數(shù)據(jù)是有順序,并且允許重復(fù);Map中存儲(chǔ)的數(shù)據(jù)是沒(méi)有順序的,其鍵是不能重復(fù)的,它的值是可以有重復(fù)的。

      35、List, Set, Map是否繼承自Collection接口? List,Set是,Map不是

      109、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ō)取

      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ō)明取

      4、去掉一個(gè)Vector集合中重復(fù)的元素

      Vector newVector = new Vector();For(int i=0;i

      9、Collection 和 Collections的區(qū)別。

      Collection是集合類(lèi)的上級(jí)接口,繼承與他的接口主要有Set 和List.Collections是針對(duì)集合類(lèi)的一個(gè)幫助類(lèi),他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線(xiàn)程安全化等操作。

      39、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)型相配的話(huà),返回真值。

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

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

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

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

      Propeties?HashTable ?Map Treemap/HashMap

      我記的不是方法名,而是思想,我知道它們都有增刪改查的方法,但這些方法的

      具體名稱(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。

      45、兩個(gè)對(duì)象值相同(x.equals(y)== true),但卻可有不同的hash code,這句話(huà)對(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)的。

      46、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;public Parent(int age){ this.age = 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

      }

      public class Child extends Parent {

      public Child(){ super(3);} public int compareTo(Object o){

      // TODO Auto-generated method stub

      System.out.println(”method of child“);// Child o1 =(Child)o;return 1;} }

      public class TreeSetTest { /**

      * @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());} }

      112、說(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 常用的接口:Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession 100、java中有幾種類(lèi)型的流?JDK為每種類(lèi)型的流提供了一些抽象類(lèi)以供繼承,請(qǐng)說(shuō)出他們分別是哪些類(lèi)?

      字節(jié)流,字符流。字節(jié)流繼承于InputStream OutputStream,字符流繼承于InputStreamReader OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。102、字節(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);*/ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(”1.txt“),”UTF-8"));String myStr = br.readLine();br.close();System.out.println(myStr);} } 105、什么是java序列化,如何實(shí)現(xiàn)java序列化?或者請(qǐng)解釋Serializable接口的作用。

      下載農(nóng)業(yè)銀行Java基礎(chǔ)面試題word格式文檔
      下載農(nóng)業(yè)銀行Java基礎(chǔ)面試題.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        java工程師面試題

        西安三元數(shù)碼軟件有限公司 外派JAVA軟件工程師筆試題4303 返回上級(jí)目錄 選擇題 1:在軟件生命周期中,下列哪個(gè)說(shuō)法是不準(zhǔn)確的? A.軟件生命周期分為計(jì)劃、開(kāi)發(fā)和運(yùn)行三個(gè)階......

        Java程序員面試題

        Java程序員面試題 1、面向?qū)ο蟮奶卣饔心男┓矫? 答:面向?qū)ο蟮奶卣髦饕幸韵聨讉€(gè)方面:1)抽象2)繼承3)封裝4)多態(tài)性 2、作用域public,private,protected,以及不寫(xiě)時(shí)的區(qū)別 答......

        JAVA程序員面試題

        JAVA程序員面試題 第一,談?wù)刦inal, finally, finalize的區(qū)別。 final?修飾符(關(guān)鍵字)如果一個(gè)類(lèi)被聲明為final,意味著它不能再派生出新的子類(lèi),不能作為父類(lèi)被繼承。因此一個(gè)類(lèi)不......

        Java程序員面試題

        北京千渡網(wǎng)訊科技有限公司博寶藝術(shù)網(wǎng)http:// Java程序員面試題 1. 下列程序段執(zhí)行后,t5的結(jié)果是_____. int t1=5,t2=6,t3=7,t4,t5; t4 = t1 6)x = sb.indexOf("b"); sb.delet......

        java程序員面試題

        姓名: 年齡: 工作年限: 1.int和Integer有什么區(qū)別?2.抽象類(lèi)(abstract class)和接口(interface)有什么異同?3.List、Set、Map的區(qū)別?4.Spring支持的ORM有哪些,哪些是你用過(guò)的?5.使用Spri......

        Java經(jīng)典面試題(struts2+hibernate+spring)

        Java工程師(程序員)面試題 Struts,Spring,Hibernate三大框架的面試1.Hibernate工作原理及為什么要用? 原理: 1.讀取并解析配置文件 2.讀取并解析映射信息,創(chuàng)建SessionFactory 3.......

        java基礎(chǔ)知識(shí)面試題(范文大全)

        java 和javasciprt 的區(qū)別?!净A(chǔ)】JSP 和Servlet 有哪些相同點(diǎn)和不同點(diǎn),他們之間的聯(lián)系是什么?【基礎(chǔ)】jsp 的四種范圍?【基礎(chǔ)】一個(gè)“.java”源文件中是否可以包含多個(gè)類(lèi)(不......

        Java面試題2

        1、面向?qū)ο蟮奶卣饔心男┓矫?1.抽象: 抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問(wèn)題,而只是選擇其中的......