十道上市公司java面試試題
以下試題均來自上市企業公司
1、列舉出JAVA中6個比較常用的包
java.lang;java.util;java.io;java.sql;java.awt;java.net;javax.swing
2、JDK中哪些類是不能繼承的?
不能繼承的是類是那些用final關鍵字修飾的類。一般比較基本的型別或防止擴充套件類無意間破壞原來方法的實現的型別都應該是final的。
3、String是最基本的資料型別嗎?
基本資料型別包括byte、int、char、long、float、double、boolean和short。
所以String不屬於基本資料類型範疇內,但String屬於最常見一種引用型別。
4、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?【博炎科技面試題】
對於short s1 = 1; s1 = s1 + 1;由於s1+1運算時會自動提升表示式的型別,所以結果是int型,再賦值給short型別s1時,編譯器會提示錯誤,需要強制轉換型別。
對於short s1 = 1; s1 += 1;由於+=是java語言規定的運算子,Java編譯器會對它進行特殊處理,因此可以正確編譯。
主要考查幾種基本資料型別在運算時的,由低到高會自動轉換,而由高到低時會強制轉換。
5、Java物件初始化順序?【騰鵬科技面試題】
分為兩種,一種是本類的初始化,一種是含有父類的初始化順序。這裡分開來說,
本類的初始化順序是:靜態變數、靜態初始化塊、變數、初始化塊、建構函式
繼承類的初始化順序是:父類靜態變數、父類靜態初始化塊、子類靜態變數、子類靜態初始塊、父類變數、父類初始化塊、父類建構函式、子類變數、子類初始化塊、子類建構函式。
static{
System.out.println("靜態塊");
}
{
System.out.println("初始化模組"); }
public ClassName() {
System.out.println("構造方法");
}
說明:
原則上回答全面的話,應該是完整的說出帶有繼承的這種類的初始化過程,下面有個步驟可以參考:
1.裝載程式的時候首先找到的是它的基(父)類,如果有多層基(父)類則會一級一級的往上找最後找到根基(父)類。
2.執行根基礎(父)類中的static初始化,再執行下一個衍生類中的static,依此類推,一直保持這個順序。
3.此時類已經裝載完畢,開始建立物件,所有的基本資料型別都會設成它們的預設值,物件控制代碼設為null
4.呼叫基礎(父)類的構造方法,基礎(父)類的構建採用與衍生類構造方法完全相同的處理過程。
5.構造方法初始完之後,進行變數的初始化。
6.執行構造方法中剩餘的部分。
6、寫幾個執行緒安全類,不安全的,支援排序的類名?
執行緒安全類:Vector、Hashtable、Stack。
執行緒不安全的類:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap等。
支援排序的類有HashSet、LinkedHashSet、TreeSet等(Set介面下的實現都支援排序)
【分析】
此題主要考查集合框架的知識。在集合框架中Collection介面為集合的根型別,提供集合操作的常用API方法,該介面下派生出兩個子介面,一個是不支援排序的List介面,一個是有自身排序的Set介面,所以回答排序與不排序分別從兩介面的實現中在作答。執行緒安全上來說,Vector類比同屬於List介面的ArrayList要早,是一個執行緒安全的類,在JDK1.2以後才推出一個非同步的ArrayList類,比Vector類效率高。同理Stack繼承自Vector也執行緒安全的類,另外在在Map介面的實現在Hashtable也是個執行緒安全的類。
7、哪幾個方法可以實現一個執行緒?
一是繼承Thread,重寫Thread類的方法run方法;另種是實現runnable介面並實現run方法。
考查執行緒的基本實現,很多公司喜歡考查這方面知識,另外補充一下關於執行緒的run方法,在多執行緒API中啟動一個執行緒是呼叫start()方法,執行緒進入就緒狀態。
8、STOP()和SUSPEND()不推薦使用的原因?
stop()是因為它不安全。它會解除由執行緒獲取的所有鎖定,當在一個執行緒物件上呼叫stop()方法時,這個執行緒物件所執行的執行緒就會立即停止,假如一個執行緒正在執行:synchronized void { x = 3; y = 4;}由於方法是同步的,多個執行緒訪問時總能保證x,y被同時賦值,而如果一個執行緒正在執行到x = 3;時,被呼叫了stop()方法,即使在同步塊中,它也乾脆地stop了,這樣就產生了不完整的殘廢資料。而多執行緒程式設計中最最基礎的條件要保證資料的完整性,所以請忘記執行緒的stop方法,以後我們再也不要說“停止執行緒”了。而且如果物件處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們。
suspend()方法容易發生死鎖。呼叫suspend()的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何執行緒都不能訪問鎖定的資源,除非被"掛起"的執行緒恢復執行。對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用wait()命其進入等待狀態。若標誌指出執行緒應當恢復,則用一個notify()重新啟動執行緒。
【分析】
9、"=="和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方法,那麼它將繼承Object類的equals方法,Object類的equals方法的實現程式碼如下:
boolean equals(Object o){
return this==o;
}
這說明,如果一個類沒有自己定義equals方法,它預設的equals方法(從Object類繼承的)就是使用==操作符,也是在比較兩個變數指向的物件是否是同一物件,這時候使用equals和使用==會得到同樣的結果,如果比較的是兩個獨立的物件則總返回false。如果你編寫的類希望能夠比較該類建立的兩個例項物件的內容是否相同,那麼你必須覆蓋equals方法,由你自己寫程式碼來決定在什麼情況即可認為兩個物件的內容是相同的。
10、靜態變數和例項變數的區別?
在語法定義上的區別:靜態變數前要加static關鍵字,而例項變數前則不加。
在程式執行時的區別:例項變數屬於某個物件的屬性,必須建立了例項物件,其中的例項變數才會被分配空間,才能使用這個例項變數。靜態變數不屬於某個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。總之,例項變數必須建立物件後才可以通過這個物件來使用,靜態變數則可以直接使用類名來引用。
例如,對於下面的程式,無論建立多少個例項物件,永遠都只分配了一個staticVar變數,並且每建立一個例項物件,這個staticVar就會加1;但是,每建立一個例項物件,就會分配一個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);
}
}
備註:這個解答除了說清楚兩者的區別外,最後還用一個具體的應用例子來說明兩者的差異,體現了自己有很好的解說問題和設計案例的能力,思維敏捷,超過一般程式設計師,有寫作能力!