一、String中的==和equals區別java
答:==操做符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,只能用==操做符。編程
若是一個變量指向的數據是對象類型的,那麼,這時候涉及了兩塊內存,對象自己佔用一塊內存(堆內存),變量也佔用一塊內存,例如Objet obj = new Object();變量obj是一個內存,new Object()是另外一個內存,此時,變量obj所對應的內存中存儲的數值就是對象佔用的那塊內存的首地址。對於指向對象類型的變量,若是要比較兩個變量是否指向同一個對象,即要看這兩個變量所對應的內存中的數值是否相等,這時候就須要用==操做符進行比較。設計模式
equals方法是用於比較兩個獨立對象的內容是否相同,就比如去比較兩我的的長相是否相同,它比較的兩個對象是獨立的。例如,對於下面的代碼:架構
String a=new String("foo");eclipse
String b=new String("foo");異步
兩條new語句建立了兩個對象,而後用a,b這兩個變量分別指向了其中一個對象,這是兩個不一樣的對象,它們的首地址是不一樣的,即a和b中存儲的數值是不相同的,因此,表達式a==b將返回false,而這兩個對象中的內容是相同的,因此,表達式a.equals(b)將返回true。ui
在實際開發中,咱們常常要比較傳遞進行來的字符串內容是否等,例如,String input = …;input.equals(「quit」),許多人稍不注意就使用==進行比較了,這是錯誤的,隨便從網上找幾個項目實戰的教學視頻看看,裏面就有大量這樣的錯誤。記住,字符串的比較基本上都是使用equals方法。this
若是一個類沒有本身定義equals方法,那麼它將繼承Object類的equals方法,Object類的equals方法的實現代碼以下:spa
boolean equals(Object o){線程
return this==o;
}
這說明,若是一個類沒有本身定義equals方法,它默認的equals方法(從Object 類繼承的)就是使用==操做符,也是在比較兩個變量指向的對象是不是同一對象,這時候使用equals和使用==會獲得一樣的結果,若是比較的是兩個獨立的對象則總返回false。若是你編寫的類但願可以比較該類建立的兩個實例對象的內容是否相同,那麼你必須覆蓋equals方法,由你本身寫代碼來決定在什麼狀況便可認爲兩個對象的內容是相同的。
二、final、finally和finalize()區別
答:final:當修飾類,表示該類不能派生新子類;當修飾基本類型,表示常量;當修飾方法,表示不容許覆寫(但可繼承)
finally:異常處理的出口,在異常處理時提供finally塊執行任何清除操做
finalize():object類定義的一個方法,java運行使用該方法在垃圾回收器將對象從內存中清除出去以前作必要的清理工做。
三、接口和抽象類的區別
答:含有abstract修飾符的class即爲抽象類,abstract 類不能建立的實例對象。含有abstract方法的類必須定義爲abstract class,abstract class類中的方法沒必要是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,因此,不能有抽象構造方法或抽象靜態方法。若是的子類沒有實現抽象父類中的全部抽象方法,那麼子類也必須定義爲abstract類型。
接口(interface)能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final。
下面比較一下二者的語法區別:
1.抽象類能夠有構造方法,接口中不能有構造方法。
2.抽象類中能夠有普通成員變量,接口中沒有普通成員變量
3.抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類中的抽象方法的訪問類型能夠是public,protected和(默認類型,雖然
eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。
5. 抽象類中能夠包含靜態方法,接口中不能包含靜態方法
6. 抽象類和接口中均可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型。
7. 一個類能夠實現多個接口,但只能繼承一個抽象類。
下面接着再說說二者在應用上的區別:
接口更多的是在系統架構設計方法發揮做用,主要用於定義模塊之間的通訊契約。而抽象類在代碼實現方面發揮做用,能夠實現代碼的重用,例如,模板方法設計模式是抽象類的一個典型應用,假設某個項目的全部Servlet類都要用相同的方式進行權限判斷、記錄訪問日誌和處理異常,那麼就能夠定義一個抽象的基類,讓全部的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成權限判斷、記錄訪問日誌和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼,僞代碼以下:
public abstract class BaseServlet extends HttpServlet { public final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException { 記錄訪問日誌 進行權限判斷 if(具備權限) { try { doService(request,response); } catch(Excetpion e) { 記錄異常信息 } } } protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException; //注意訪問權限定義成protected,顯得既專業,又嚴謹,由於它是專門給子類用的 } public class MyServlet1 extends BaseServlet { protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException { 本Servlet只處理的具體業務邏輯代碼 } }
父類方法中間的某段代碼不肯定,留給子類幹,就用模板方法設計模式。
備註:這道題的思路是先從整體解釋抽象類和接口的基本概念,而後再比較二者的語法細節,最後再說二者的應用區別。比較二者語法細節區別的條理是:先從一個類中的構造方法、普通成員變量和方法(包括抽象方法),靜態變量和方法,繼承性等6個方面逐一去比較回答,接着從第三者繼承的角度的回答,特別是最後用了一個典型的例子來展示本身深厚的技術功底。
四、String和StringBuffer區別
前者內容不可變,後者可變,若是須要對字符串進行頻繁修改,只能用後者
五、&和&&的區別
&和&&均可以用做邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲true時,整個運算結果才爲true,不然,只要有一方爲false,則結果爲false。
&&還具備短路的功能,即若是第一個表達式爲false,則再也不計算第二個表達式
&還能夠用做位運算符,當&操做符兩邊的表達式不是boolean類型時,&表示按位與操做,咱們一般使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0x31 & 0x0f的結果爲0x01。
備註:這道題先說二者的共同點,再說出&&和&的特殊之處,並列舉一些經典的例子來代表本身理解透徹深刻、實際經驗豐富。
六、進程和線程的區別
進程是程序一次動態執行過程,經歷了從代碼加載、執行到執行完畢的過程,也是進程產生、發展和消亡的過程。
線程是比進程更小的執行單位,是在進程基礎上進一步劃分。
七、建立線程有幾種方式
一、繼承thread類
二、實現runnable接口
區別:thread類也是runnable接口的子類,都須要一個線程的主類,這個類能夠實現runnable或繼承thread,都必須覆寫run方法,後者能夠避免單繼承的侷限,好比要是你的類以及繼承了其餘類,這種狀況下就不能同時繼承thread了
八、進程的狀態
建立、就緒、運行、阻塞、終止
就緒:得到除cpu之外的全部資源
阻塞:人爲掛起,等待io,申請緩衝區不能知足。。。
九、同步和異步有什麼區別
若是一塊數據要在多個線程共享,就必須進行同步存取,異步途徑效率更高。
十、sleep()和wait()區別
sleep()是thread類定義的static方法,表示線程休眠,將執行機會讓給其餘線程,但監控狀態依然保持,到時候會自動恢復
wait()是object類方法,表示線程等待,一直到執行了notify()或notifyAll()後才結束等待。
十一、AOP和OOP區別
OP、OOP在字面上雖然很是相似,但倒是面向不一樣領域的兩種設計思想。OOP(面向對象編程)針對業務處理過程的實體及其屬性和行爲進行抽象封裝,以得到更加清晰高效的邏輯單元劃分。
而AOP則是針對業務處理過程當中的切面進行提取,它所面對的是處理過程當中的某個步驟或階段,以得到邏輯過程當中各部分之間低耦合性的隔離效果。這兩種設計思想在目標上有着本質的差別。
上面的陳述可能過於理論化,舉個簡單的例子,對於「僱員」這樣一個業務實體進行封裝,天然是OOP/OOD的任務,咱們能夠爲其創建一個「Employee」類,並將「僱員」相關的屬性和行爲封裝其中。而用AOP設計思想對「僱員」進行封裝將無從談起。
一樣,對於「權限檢查」這一動做片段進行劃分,則是AOP的目標領域。而經過OOD/OOP對一個動做進行封裝,則有點不三不四。
換而言之,OOD/OOP面向名詞領域,AOP面向動詞領域。