去哪兒網(wǎng)java面試

時(shí)間:2022-06-28 05:17:40 面試 我要投稿
  • 相關(guān)推薦

去哪兒網(wǎng)java面試

1.char型變量中能不能存貯一個(gè)中文漢字?為什么?

去哪兒網(wǎng)java面試

char型變量是用來(lái)存儲Unicode編碼的字符的,unicode編碼字符集中包含了漢字,所以,char型變量中當然可以存儲漢字啦。不過(guò),如果某個(gè)特殊的漢字沒(méi)有被包含在unicode編碼字符集中,那么,這個(gè)char型變量中就不能存儲這個(gè)特殊漢字。補充說(shuō)明:unicode編碼占用兩個(gè)字節,所以,char類(lèi)型的變量也是占用兩個(gè)字節。

備注:后面一部分回答雖然不是在正面回答題目,但是,為了展現自己的學(xué)識和表現自己對問(wèn)題理解的透徹深入,可以回答一些相關(guān)的知識,做到知無(wú)不言,言無(wú)不盡。

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

(單獨把一個(gè)東西說(shuō)清楚,然后再說(shuō)清楚另一個(gè),這樣,它們的區別自然就出來(lái)了,混在一起說(shuō),則很難說(shuō)清楚)

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

如果一個(gè)變量指向的數據是對象類(lèi)型的,那么,這時(shí)候涉及了兩塊內存,對象本身占用一塊內存(堆內存),變量也占用一塊內存,例如Objet obj = new Object();變量obj是一個(gè)內存,new Object()是另一個(gè)內存,此時(shí),變量obj所對應的內存中存儲的數值就是對象占用的那塊內存的首地址。對于指向對象類(lèi)型的變量,如果要比較兩個(gè)變量是否指向同一個(gè)對象,即要看這兩個(gè)變量所對應的內存中的數值是否相等,這時(shí)候就需要用==操作符進(jìn)行比較。

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

String a=new String("foo");

String b=new String("foo");

兩條new語(yǔ)句創(chuàng )建了兩個(gè)對象,然后用a,b這兩個(gè)變量分別指向了其中一個(gè)對象,這是兩個(gè)不同的對象,它們的首地址是不同的,即a和b中存儲的數值是不相同的,所以,表達式a==b將返回false,而這兩個(gè)對象中的內容是相同的,所以,表達式a.equals(b)將返回true。

在實(shí)際開(kāi)發(fā)中,我們經(jīng)常要比較傳遞進(jìn)行來(lái)的字符串內容是否等,例如,String input = …;input.equals(“quit”),許多人稍不注意就使用==進(jìn)行比較了,這是錯誤的,隨便從網(wǎng)上找幾個(gè)項目實(shí)戰的教學(xué)視頻看看,里面就有大量這樣的錯誤。記住,字符串的比較基本上都是使用equals方法。

如果一個(gè)類(lèi)沒(méi)有自己定義equals方法,那么它將繼承Object類(lèi)的equals方法,Object類(lèi)的equals方法的實(shí)現代碼如下:

boolean equals(Object o){

return this==o;

}

這說(shuō)明,如果一個(gè)類(lèi)沒(méi)有自己定義equals方法,它默認的equals方法(從Object 類(lèi)繼承的)就是使用==操作符,也是在比較兩個(gè)變量指向的對象是否是同一對象,這時(shí)候使用equals和使用==會(huì )得到同樣的結果,如果比較的是兩個(gè)獨立的對象則總返回false。如果你編寫(xiě)的類(lèi)希望能夠比較該類(lèi)創(chuàng )建的兩個(gè)實(shí)例對象的內容是否相同,那么你必須覆蓋equals方法,由你自己寫(xiě)代碼來(lái)決定在什么情況即可認為兩個(gè)對象的內容是相同的。

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

是否可以 implements(實(shí)現)interface(接口)?

可以繼承其他類(lèi)或實(shí)現其他接口。不僅是可以,而是必須!

4.String 和 StringBuffer 的區別

JAVA 平臺提供了兩個(gè)類(lèi):String 和 StringBuffer,它們可以?xún)Υ婧筒僮髯址,即包含多個(gè)字符的字符數據。這個(gè) String 類(lèi)提供了數值不可改變的字符串。而這個(gè) StringBuffer 類(lèi)提供的字符串進(jìn)行修改。當你知道字符數據要改變的時(shí)候你就可以使用 StringBuffer。典型地,你可以使用 StringBuffers 來(lái)動(dòng)態(tài)構造字符數據。另外,String 實(shí)現了 equals 方法,newString(“abc”).equals(newString(“abc”)的結果為 true,而 StringBuffer 沒(méi)有實(shí)現equals 方法,所以,new StringBuffer(“abc”).equals(newStringBuffer(“abc”)的結果為 false。

接著(zhù)要舉一個(gè)具體的例子來(lái)說(shuō)明,我們要把1到100的所有數字拼起來(lái),組成一個(gè)串。

StringBuffer sbf = new StringBuffer();

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

{

sbf.append(i);

}

上面的代碼效率很高,因為只創(chuàng )建了一個(gè) StringBuffer 對象,而下面的代碼效率很低,因為

創(chuàng )建了101個(gè)對象。

String str = new String();

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

{

str = str + i;

}

在講兩者區別時(shí),應把循環(huán)的次數搞成10000,然后用 endTime-beginTime 來(lái)比較兩者執行的時(shí)間差異,最后還要講講 StringBuilder 與 StringBuffer 的區別。

String 覆蓋了 equals 方法和 hashCode 方法,而 StringBuffer 沒(méi)有覆蓋 equals 方法和hashCode 方法,所以,將 StringBuffer 對象存儲進(jìn) Java 集合類(lèi)中時(shí)會(huì )出現問(wèn)題。

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

java5以前,有如下兩種:

第一種:

new Thread(){}.start();這表示調用 Thread 子類(lèi)對象的 run 方法,new Thread(){}表示一個(gè)

Thread 的匿名子類(lèi)的實(shí)例對象,子類(lèi)加上 run 方法后的代碼如下:

new Thread(){

public void run(){

}

}.start();

第二種:

new Thread(new Runnable(){}).start();這表示調用Thread對象接受的Runnable對象的run

方法,new Runnable(){}表示一個(gè) Runnable 的匿名子類(lèi)的實(shí)例對象,runnable 的子類(lèi)加上

run 方法后的代碼如下:

new Thread(new Runnable(){

public voidrun(){

}

}

).start();

從 java5開(kāi)始,還有如下一些線(xiàn)程池創(chuàng )建多線(xiàn)程的方式:

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

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

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

runnable 的 run 方法。

有兩種實(shí)現方法,分別是繼承 Thread 類(lèi)與實(shí)現 Runnable 接口用 synchronized 關(guān)鍵字修飾同步方法反對使用stop(),是因為它不安全。它會(huì )解除由線(xiàn)程獲取的所有鎖定,而且如果對象處于一種不連貫狀態(tài),那么其他線(xiàn)程能在那種狀態(tài)下檢查和修改它們。結果很難檢查出真正的問(wèn)題所在。suspend()方法容易發(fā)生死鎖。調用 suspend()的時(shí)候,目標線(xiàn)程會(huì )停下來(lái),但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線(xiàn)程都不能訪(fǎng)問(wèn)鎖定的資源,除非被"掛起"的線(xiàn)程恢復運行。對任何線(xiàn)程來(lái)說(shuō),如果它們想恢復目標線(xiàn)程,同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會(huì )造成死鎖。所以不應該使用 suspend(),而應在自己的 Thread 類(lèi)中置入一個(gè)標志,指出線(xiàn)程應該活動(dòng)還是掛起。若標志指出線(xiàn)程應該掛起,便用 wait()命其進(jìn)入等待狀態(tài)。若標志指出線(xiàn)程應當恢復,則用一個(gè) notify()重新啟動(dòng)線(xiàn)程。

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

如果數據將在線(xiàn)程間共享。例如正在寫(xiě)的數據以后可能被另一個(gè)線(xiàn)程讀到,或者正在讀的數據可能已經(jīng)被另一個(gè)線(xiàn)程寫(xiě)過(guò)了,那么這些數據就是共享數據,必須進(jìn)行同步存取。當應用程序在對象上調用了一個(gè)需要花費很長(cháng)時(shí)間來(lái)執行的方法,并且不希望讓程序等待方法的返回時(shí),就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。

7.多線(xiàn)程有幾種實(shí)現方法?同步有幾種實(shí)現方法?

多線(xiàn)程有兩種實(shí)現方法,分別是繼承 Thread 類(lèi)與實(shí)現 Runnable 接口同步的實(shí)現方面有兩種,分別是 synchronized,wait 與 notifywait():使一個(gè)線(xiàn)程處于等待狀態(tài),并且釋放所持有的對象的 lock。sleep():使一個(gè)正在運行的線(xiàn)程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調用此方法要捕捉InterruptedException 異常。notify():喚醒一個(gè)處于等待狀態(tài)的線(xiàn)程,注意的是在調用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線(xiàn)程,而是由 JVM 確定喚醒哪個(gè)線(xiàn)程,而且不是按優(yōu)先級。Allnotity():喚醒所有處入等待狀態(tài)的線(xiàn)程,注意并不是給所有喚醒線(xiàn)程一個(gè)對象的鎖,而是讓它們競爭。

8.Set 里的元素是不能重復的,那么用什么方法來(lái)區分重復與否呢?是用==還

是 equals()?它們有何區別?Set 里的元素是不能重復的,元素重復與否是使用 equals()方法進(jìn)行判斷的。equals()和==方法決定引用值是否指向同一對象 equals()在類(lèi)中被覆蓋,為的是當兩個(gè)分離的對象的內容和類(lèi)型相配的話(huà),返回真值。


【去哪兒網(wǎng)java面試】相關(guān)文章:

去哪兒網(wǎng)面試地址07-01

廣州天河財富廣場(chǎng)去哪兒網(wǎng)面試不靠譜07-13

騰訊和去哪兒網(wǎng)的offer選擇07-10

去哪兒網(wǎng)最看重面試者的哪一部分?07-13

時(shí)間去哪兒了作文04-27

《爸爸去哪兒》有感10-25

Java方面的軟件工程師如何去面試?07-11

壓歲錢(qián)去哪兒了作文10-11

《爸爸去哪兒》有感15篇10-25

《爸爸去哪兒》有感(15篇)10-25

99久久精品免费看国产一区二区三区|baoyu135国产精品t|40分钟97精品国产最大网站|久久综合丝袜日本网|欧美videosdesexo肥婆