閱讀屋>面試> 去哪兒網java面試

去哪兒網java面試

去哪兒網java面試

1.char型變數中能不能存貯一箇中文漢字?為什麼?

char型變數是用來儲存Unicode編碼的字元的,unicode編碼字符集中包含了漢字,所以,char型變數中當然可以儲存漢字啦。不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變數中就不能儲存這個特殊漢字。補充說明:unicode編碼佔用兩個位元組,所以,char型別的變數也是佔用兩個位元組。

備註:後面一部分回答雖然不是在正面回答題目,但是,為了展現自己的學識和表現自己對問題理解的透徹深入,可以回答一些相關的知識,做到知無不言,言無不盡。

2.、"=="和equals方法究竟有什麼區別?

(單獨把一個東西說清楚,然後再說清楚另一個,這樣,它們的區別自然就出來了,混在一起說,則很難說清楚)

==運算子專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本型別的資料或兩個引用變數是否相等,只能用==運算子。

如果一個變數指向的資料是物件型別的,那麼,這時候涉及了兩塊記憶體,物件本身佔用一塊記憶體(堆記憶體),變數也佔用一塊記憶體,例如Objet obj = new Object();變數obj是一個記憶體,new Object()是另一個記憶體,此時,變數obj所對應的記憶體中儲存的數值就是物件佔用的那塊記憶體的首地址。對於指向物件型別的變數,如果要比較兩個變數是否指向同一個物件,即要看這兩個變數所對應的記憶體中的數值是否相等,這時候就需要用==運算子進行比較。

equals方法是用於比較兩個獨立物件的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個物件是獨立的。例如,對於下面的程式碼:

String a=new String("foo");

String b=new String("foo");

兩條new語句建立了兩個物件,然後用a,b這兩個變數分別指向了其中一個物件,這是兩個不同的物件,它們的首地址是不同的,即a和b中儲存的數值是不相同的,所以,表示式a==b將返回false,而這兩個物件中的內容是相同的,所以,表示式a.equals(b)將返回true。

在實際開發中,我們經常要比較傳遞進行來的字串內容是否等,例如,String input = …;input.equals(“quit”),許多人稍不注意就使用==進行比較了,這是錯誤的,隨便從網上找幾個專案實戰的教學影片看看,裡面就有大量這樣的錯誤。記住,字串的比較基本上都是使用equals方法。

如果一個類沒有自己定義equals方法,那麼它將繼承Object類的equals方法,Object類的equals方法的實現程式碼如下:

boolean equals(Object o){

return this==o;

}

這說明,如果一個類沒有自己定義equals方法,它預設的equals方法(從Object 類繼承的)就是使用==運算子,也是在比較兩個變數指向的物件是否是同一物件,這時候使用equals和使用==會得到同樣的結果,如果比較的是兩個獨立的物件則總返回false。如果你編寫的類希望能夠比較該類建立的兩個例項物件的內容是否相同,那麼你必須覆蓋equals方法,由你自己寫程式碼來決定在什麼情況即可認為兩個物件的內容是相同的。

3.Anonymous Inner Class (匿名內部類)是否可以 extends(繼承)其它類,

是否可以 implements(實現)interface(介面)?

可以繼承其他類或實現其他介面。不僅是可以,而是必須!

4.String 和 StringBuffer 的區別

JAVA 平臺提供了兩個類:String 和 StringBuffer,它們可以儲存和操作字串,即包含多個字元的字元資料。這個 String 類提供了數值不可改變的字串。而這個 StringBuffer 類提供的字串進行修改。當你知道字元資料要改變的時候你就可以使用 StringBuffer。典型地,你可以使用 StringBuffers 來動態構造字元資料。另外,String 實現了 equals 方法,newString(“abc”).equals(newString(“abc”)的結果為 true,而 StringBuffer 沒有實現equals 方法,所以,new StringBuffer(“abc”).equals(newStringBuffer(“abc”)的結果為 false。

接著要舉一個具體的例子來說明,我們要把1到100的所有數字拼起來,組成一個串。

StringBuffer sbf = new StringBuffer();

for(int i=0;i<100;i++)

{

sbf.append(i);

}

上面的程式碼效率很高,因為只建立了一個 StringBuffer 物件,而下面的程式碼效率很低,因為

建立了101個物件。

String str = new String();

for(int i=0;i<100;i++)

{

str = str + i;

}

在講兩者區別時,應把迴圈的次數搞成10000,然後用 endTime-beginTime 來比較兩者執行的時間差異,最後還要講講 StringBuilder 與 StringBuffer 的區別。

String 覆蓋了 equals 方法和 hashCode 方法,而 StringBuffer 沒有覆蓋 equals 方法和hashCode 方法,所以,將 StringBuffer 物件儲存進 Java 集合類中時會出現問題。

5.java 中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法? stop()和 suspend()方法為何不推薦使用?

java5以前,有如下兩種:

第一種:

new Thread(){}.start();這表示呼叫 Thread 子類物件的 run 方法,new Thread(){}表示一個

Thread 的匿名子類的例項物件,子類加上 run 方法後的程式碼如下:

new Thread(){

public void run(){

}

}.start();

第二種:

new Thread(new Runnable(){}).start();這表示呼叫Thread物件接受的Runnable物件的run

方法,new Runnable(){}表示一個 Runnable 的匿名子類的例項物件,runnable 的子類加上

run 方法後的程式碼如下:

new Thread(new Runnable(){

public voidrun(){

}

}

).start();

從 java5開始,還有如下一些執行緒池建立多執行緒的方式:

ExecutorService pool = Executors.newFixedThreadPool(3)

for(int i=0;i<10;i++)

{

pool.execute(newRunable(){public void run(){}});

}

Executors.newCachedThreadPool().execute(new Runable(){publicvoid run(){}});

Executors.newSingleThreadExecutor().execute(new Runable(){publicvoid run(){}});

有兩種實現方法,分別使用 new Thread()和 new Thread(runnable)形式,第一種直接呼叫

thread 的 run 方法,所以,我們往往使用 Thread 子類,即 new SubThread()。第二種呼叫

runnable 的 run 方法。

有兩種實現方法,分別是繼承 Thread 類與實現 Runnable 介面用 synchronized 關鍵字修飾同步方法反對使用stop(),是因為它不安全。它會解除由執行緒獲取的所有鎖定,而且如果物件處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。呼叫 suspend()的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的'鎖定。此時,其他任何執行緒都不能訪問鎖定的資源,除非被"掛起"的執行緒恢復執行。對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用 suspend(),而應在自己的 Thread 類中置入一個標誌,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用 wait()命其進入等待狀態。若標誌指出執行緒應當恢復,則用一個 notify()重新啟動執行緒。

6.同步和非同步有何異同,在什麼情況下分別使用他們?舉例說明。

如果資料將線上程間共享。例如正在寫的資料以後可能被另一個執行緒讀到,或者正在讀的資料可能已經被另一個執行緒寫過了,那麼這些資料就是共享資料,必須進行同步存取。當應用程式在物件上呼叫了一個需要花費很長時間來執行的方法,並且不希望讓程式等待方法的返回時,就應該使用非同步程式設計,在很多情況下采用非同步途徑往往更有效率。

7.多執行緒有幾種實現方法?同步有幾種實現方法?

多執行緒有兩種實現方法,分別是繼承 Thread 類與實現 Runnable 介面同步的實現方面有兩種,分別是 synchronized,wait 與 notifywait():使一個執行緒處於等待狀態,並且釋放所持有的物件的 lock。sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉InterruptedException 異常。notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由 JVM 確定喚醒哪個執行緒,而且不是按優先順序。Allnotity():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。

8.Set 裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用==還

是 equals()?它們有何區別?Set 裡的元素是不能重複的,元素重複與否是使用 equals()方法進行判斷的。equals()和==方法決定引用值是否指向同一物件 equals()在類中被覆蓋,為的是當兩個分離的物件的內容和型別相配的話,返回真值。


【去哪兒網java面試】相關文章: