Java小知識

 

第一,談談final, finally, finalize的區別。

final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。finally是異常處理語句結構的一部分,表示總是執行。Finalize() Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,派生類可以覆蓋Object此方法提供垃圾收集時的其他資源回收,例如關閉文件等。

 

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

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

 

第三,Static Nested Class Inner Class的不同,說得越多越好(面試題有的很籠統)

Nested Class(一般是C++的說法),Inner Class (一般是JAVA的說法)

(1)Static Inner Class(靜態內部類)可以不依賴於外部類實例被實例化,而通常的內部類需要在外部類實例化後才能實例化。(2)不能從一個static內部類的一個對象訪問一個外部類對象。

 

第四,&&&的區別。

 &是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and.

 

第五,HashMapHashtable的區別。

 都屬於Map接口的類,實現了將惟一鍵映射到特定的值上。HashMapHashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key,由於非線程安全,效率上可能高於Hashtable.  

 

第六,Collection Collections的區別。

  Collections是個java.util下的幫助類,它包含有各種有關集合操作的靜態方法。    Collection是個java.util下的接口,它是各種集合結構的父接口,繼承與他的接口主要有Set List  

 

第七,GC是什麼? 爲什麼要有GC?

 GC是垃圾收集的意思(Gabage Collection),Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。要請求垃圾收集,可以調用下面的方法之一:

  System.gc();          Runtime.getRuntime().gc()  

 

第八,String s = new String("xyz");創建了幾個String Object?

 兩個

 

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

 Math.round(11.5)==12Math.round(-11.5)==-11round方法返回與參數最接近的長整數,參數加1/2後求其floor.  

 

第十,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

 short s1 = 1; s1 = s1 + 1;有錯,s1short型,s1+1int,不能顯式轉化爲short型。可強制轉化,修改爲s1 = (short)(s1 + 1)

short s1 = 1; s1 += 1正確。

 

第十一,sleep() wait() 有什麼區別?

sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,到時後會自動恢復。調用sleep不會釋放對象鎖。

waitObject類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

 

第十二,數組有沒有length()這個方法? String有沒有length()這個方法?

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

 

第十三,OverloadOverride的區別。Overloaded的方法是否可以改變返回值的類型?

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

Overloaded的方法可以改變返回值的類型,也就是說只能通過方法名稱和方法的傳入參數標識一個方法,不能通過返回值。

 

第十四,構造器Constructor是否可被override?

  構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading

 

第十五,給我一個你最常見到的runtime exception

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

 

第十六,errorexception有什麼區別?

  error 很難恢復,一種嚴重意外問題(非設計問題),比如說內存溢出,程序很難處理。

exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況,當發生時程序一般可控。

 

第十七,abstract classinterface有什麼區別?

       把一類相似類型歸納爲一個抽象類,把類上要實現的功能放在接口中定義,所以java中只能繼承一個抽象類,但是可以實現多個接口。

       abstract class有方法的實現,interface不能有實現方法。

abstract class有多種類型的成員變量,interface只可以定義static final成員變量。

 

第十八,abstractmethod是否可同時是static,是否可同時是native,是否可同時是synchronized?

  都不能

 

第十九,接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

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

 

第二十,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

  不對,有相同的hash code。因爲equals比較得出爲同一對象,所以hash code一定相同。

       = =比較的是值,equals()比較的是對象,即對象存儲的內存地址是否一樣。)

 

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

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

       如果是簡單類型(int/Boolean/String/long)的值不能在調用方法中改變,HashMap能改變。

 

第二十二,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String?

  switchexpr1)中,expr1是一個整數表達式。因此傳遞給 switch case 語句的參數應該是 int short char 或者 bytelong,string 都不能作用於swtich

 

第二十三,Servlet的生命週期

Servlet的生命週期:Servlet被裝載入web服務器(例如:tomcatJboss等)的內存時,Servlet喚醒開始了它的生命,一旦程序終止或服務器重新裝載Servlet時,Servlet結束。這過程包括加載、實例化、初始化、處理請求和服務結束,這生存期由javax.servlet.Servlet接口的initservicedestroy方法表達。過程大概:當容器運行Servletinit方法,請求到達時就運行Servletservice方法根據請求的類型調用doGetdoPost方法,最後服務器決定將實例銷燬時調用Servletdestroy方法。

 

第二十四,String StringBufferStringBuilder的區別

1. String對象內容是不可改變的,StringBuffer是可以改變的,並且高效;String實例化以後所有的屬性都是final的,而StringBuffer確不是,這就是可變與不可變。String的連接操作實際上是生成了一個新的String對象然後改變賦值新的地址而不是改變值操作,StringBuffer改變的是值

StringBuilder對象默認會有16個字符的長度,您也可以自行指定初始長度。如果附加的字符超出可容納的長度,則StringBuilder對象會自動增加長度以容納被附加的字符。StringBuilder被設計爲與StringBuffer具有相同的操作接口,但StringBuilder是非線程安全的

 

第二十五,ArrayList,Vector, LinkedList的存儲性能和特性

ArrayListVector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,

Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。

 

第二十六,forward redirect的區別

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

redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛纔請求的所有參數重新請求,所以session,request參數都可以獲取。(兩次請求)

 

第二十七,注意abstract方法不能是private的,public,protected,friendly的都可以

 

第二十八,同步和異步有何異同,在什麼情況下分別使用他們?舉例說明。

 在存在數據共享的情況下,要使用同步.比如說銀行轉賬.

 當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章