十道上市公司java面试试题
以下試題均來自上市企業(yè)公司
1、列舉出JAVA中6個比較常用的包
java.lang;java.util;java.io;java.sql;java.awt;java.net;javax.swing
2、JDK中哪些類是不能繼承的?
不能繼承的是類是那些用final關(guān)鍵字修飾的類。一般比較基本的類型或防止擴(kuò)展類無意間破壞原來方法的實(shí)現(xiàn)的類型都應(yīng)該是final的。
3、String是最基本的數(shù)據(jù)類型嗎?
基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。
所以String不屬于基本數(shù)據(jù)類型范疇內(nèi),但String屬于最常見一種引用類型。
4、short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?【博炎科技面試題】
對于short s1 = 1; s1 = s1 + 1;由于s1+1運(yùn)算時會自動提升表達(dá)式的類型,所以結(jié)果是int型,再賦值給short類型s1時,編譯器會提示錯誤,需要強(qiáng)制轉(zhuǎn)換類型。
對于short s1 = 1; s1 += 1;由于+=是java語言規(guī)定的運(yùn)算符,Java編譯器會對它進(jìn)行特殊處理,因此可以正確編譯。
主要考查幾種基本數(shù)據(jù)類型在運(yùn)算時的,由低到高會自動轉(zhuǎn)換,而由高到低時會強(qiáng)制轉(zhuǎn)換。
5、Java對象初始化順序?【騰鵬科技面試題】
分為兩種,一種是本類的初始化,一種是含有父類的初始化順序。這里分開來說,
本類的初始化順序是:靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構(gòu)造函數(shù)
繼承類的初始化順序是:父類靜態(tài)變量、父類靜態(tài)初始化塊、子類靜態(tài)變量、子類靜態(tài)初始塊、父類變量、父類初始化塊、父類構(gòu)造函數(shù)、子類變量、子類初始化塊、子類構(gòu)造函數(shù)。
static{
System.out.println("靜態(tài)塊");
}
{
System.out.println("初始化模塊"); }
public ClassName() {
System.out.println("構(gòu)造方法");
}
說明:
原則上回答全面的話,應(yīng)該是完整的說出帶有繼承的這種類的初始化過程,下面有個步驟可以參考:
1.裝載程序的時候首先找到的是它的基(父)類,如果有多層基(父)類則會一級一級的往上找最后找到根基(父)類。
2.執(zhí)行根基礎(chǔ)(父)類中的static初始化,再執(zhí)行下一個衍生類中的static,依此類推,一直保持這個順序。
3.此時類已經(jīng)裝載完畢,開始創(chuàng)建對象,所有的基本數(shù)據(jù)類型都會設(shè)成它們的默認(rèn)值,對象句柄設(shè)為null
4.調(diào)用基礎(chǔ)(父)類的構(gòu)造方法,基礎(chǔ)(父)類的構(gòu)建采用與衍生類構(gòu)造方法完全相同的處理過程。
5.構(gòu)造方法初始完之后,進(jìn)行變量的初始化。
6.執(zhí)行構(gòu)造方法中剩余的部分。
6、寫幾個線程安全類,不安全的,支持排序的類名?
線程安全類:Vector、Hashtable、Stack。
線程不安全的類:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap等。
支持排序的類有HashSet、LinkedHashSet、TreeSet等(Set接口下的實(shí)現(xiàn)都支持排序)
【分析】
此題主要考查集合框架的知識。在集合框架中Collection接口為集合的根類型,提供集合操作的常用API方法,該接口下派生出兩個子接口,一個是不支持排序的List接口,一個是有自身排序的Set接口,所以回答排序與不排序分別從兩接口的實(shí)現(xiàn)中在作答。線程安全上來說,Vector類比同屬于List接口的ArrayList要早,是一個線程安全的類,在JDK1.2以后才推出一個異步的ArrayList類,比Vector類效率高。同理Stack繼承自Vector也線程安全的類,另外在在Map接口的實(shí)現(xiàn)在Hashtable也是個線程安全的類。
7、哪幾個方法可以實(shí)現(xiàn)一個線程?
一是繼承Thread,重寫Thread類的方法run方法;另種是實(shí)現(xiàn)runnable接口并實(shí)現(xiàn)run方法。
考查線程的基本實(shí)現(xiàn),很多公司喜歡考查這方面知識,另外補(bǔ)充一下關(guān)于線程的run方法,在多線程API中啟動一個線程是調(diào)用start()方法,線程進(jìn)入就緒狀態(tài)。
8、STOP()和SUSPEND()不推薦使用的原因?
stop()是因?yàn)樗话踩K鼤獬删€程獲取的所有鎖定,當(dāng)在一個線程對象上調(diào)用stop()方法時,這個線程對象所運(yùn)行的線程就會立即停止,假如一個線程正在執(zhí)行:synchronized void { x = 3; y = 4;}由于方法是同步的,多個線程訪問時總能保證x,y被同時賦值,而如果一個線程正在執(zhí)行到x = 3;時,被調(diào)用了stop()方法,即使在同步塊中,它也干脆地stop了,這樣就產(chǎn)生了不完整的殘廢數(shù)據(jù)。而多線程編程中最最基礎(chǔ)的條件要保證數(shù)據(jù)的完整性,所以請忘記線程的stop方法,以后我們再也不要說“停止線程”了。而且如果對象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。
suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時候,目標(biāo)線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復(fù)運(yùn)行。對任何線程來說,如果它們想恢復(fù)目標(biāo)線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應(yīng)該使用suspend(),而應(yīng)在自己的Thread類中置入一個標(biāo)志,指出線程應(yīng)該活動還是掛起。若標(biāo)志指出線程應(yīng)該掛起,便用wait()命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個notify()重新啟動線程。
【分析】
9、"=="和equals方法有什么區(qū)別?
==操作符專門用來比較兩個變量的值是否相等,也就是用于比較變量所對應(yīng)的內(nèi)存中所存儲的數(shù)值是否相同,要比較兩個基本類型的數(shù)據(jù)或兩個引用變量是否相等,只能用==操作符。
如果一個變量指向的數(shù)據(jù)是對象類型的,那么,這時候涉及了兩塊內(nèi)存,對象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,例如Objet obj = new Object();變量obj是一個內(nèi)存,new Object()是另一個內(nèi)存,此時,變量obj所對應(yīng)的內(nèi)存中存儲的數(shù)值就是對象占用的那塊內(nèi)存的首地址。對于指向?qū)ο箢愋偷淖兞?#xff0c;如果要比較兩個變量是否指向同一個對象,即要看這兩個變量所對應(yīng)的內(nèi)存中的數(shù)值是否相等,這時候就需要用==操作符進(jìn)行比較。
equals方法是用于比較兩個獨(dú)立對象的內(nèi)容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨(dú)立的。例如,對于下面的代碼:
String a=new String("foo");
String b=new String("foo");
兩條new語句創(chuàng)建了兩個對象,然后用a,b這兩個變量分別指向了其中一個對象,這是兩個不同的對象,它們的首地址是不同的,即a和b中存儲的數(shù)值是不相同的,所以,表達(dá)式a==b將返回false,而這兩個對象中的內(nèi)容是相同的,所以,表達(dá)式a.equals(b)將返回true。
在實(shí)際開發(fā)中,我們經(jīng)常要比較傳遞進(jìn)行來的字符串內(nèi)容是否等,例如,String input =…;input.equals(“quit”),如果一個類沒有自己定義equals方法,那么它將繼承Object類的equals方法,Object類的equals方法的實(shí)現(xiàn)代碼如下:
boolean equals(Object o){
return this==o;
}
這說明,如果一個類沒有自己定義equals方法,它默認(rèn)的equals方法(從Object類繼承的)就是使用==操作符,也是在比較兩個變量指向的對象是否是同一對象,這時候使用equals和使用==會得到同樣的結(jié)果,如果比較的是兩個獨(dú)立的對象則總返回false。如果你編寫的類希望能夠比較該類創(chuàng)建的兩個實(shí)例對象的內(nèi)容是否相同,那么你必須覆蓋equals方法,由你自己寫代碼來決定在什么情況即可認(rèn)為兩個對象的內(nèi)容是相同的。
10、靜態(tài)變量和實(shí)例變量的區(qū)別?
在語法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字,而實(shí)例變量前則不加。
在程序運(yùn)行時的區(qū)別:實(shí)例變量屬于某個對象的屬性,必須創(chuàng)建了實(shí)例對象,其中的實(shí)例變量才會被分配空間,才能使用這個實(shí)例變量。靜態(tài)變量不屬于某個實(shí)例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實(shí)例對象,靜態(tài)變量就會被分配空間,靜態(tài)變量就可以被使用了。總之,實(shí)例變量必須創(chuàng)建對象后才可以通過這個對象來使用,靜態(tài)變量則可以直接使用類名來引用。
例如,對于下面的程序,無論創(chuàng)建多少個實(shí)例對象,永遠(yuǎn)都只分配了一個staticVar變量,并且每創(chuàng)建一個實(shí)例對象,這個staticVar就會加1;但是,每創(chuàng)建一個實(shí)例對象,就會分配一個instanceVar,即可能分配多個instanceVar,并且每個instanceVar的值都只自加了1次。
public class VariantTest
{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest()
{
staticVar++;
instanceVar++;
System.out.println(“staticVar=”+ staticVar +”,instanceVar=”+ instanceVar);
}
}
備注:這個解答除了說清楚兩者的區(qū)別外,最后還用一個具體的應(yīng)用例子來說明兩者的差異,體現(xiàn)了自己有很好的解說問題和設(shè)計(jì)案例的能力,思維敏捷,超過一般程序員,有寫作能力!
總結(jié)
以上是生活随笔為你收集整理的十道上市公司java面试试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从Chrome源码看audio/vide
- 下一篇: Linux shell编程:状态变量