Java筆試面試題目(一)

每日一句:沒有一勞永逸的幸福,只有先苦後甜的努力!加油!

            java應屆生或自學初學者筆試面試題目總結,希望對大家有幫助,題目來自自己學習總結和老師講解,網絡資源,書籍資料。敲出來大家看,每次更新10+道題目,希望大家能找到一份好工作。

第一部分:基礎部分

    基礎部分的包括:基本語法,類似相關的語法,內部類、繼承、異常、線程、集合、IO、虛擬機、其他。

1 一個“.Java”源文件中是否可以包含多個類(不是內部類)?有什麼限制?
可以有多個,但是只能有一個public的類,並且public的類名必須與文件名一致。

2 Java有沒有goto?
goto屬於Java中的保留字,現在沒有使用。

3 說說&和&&的區別
&和&&都可以做邏輯與運算符,表示邏輯與(and),當運算符兩邊表達式的結果都爲true時整個運算結果才爲true,否則,只要有一邊爲false,則最終結果爲false。
&&具有短路的功能,即如果第一個表達式爲false,則不再計算第二個表達式,例如,對於if(str != null && !str.equals(“”))表達式,當str 爲null時,後面的表達式不會執行,所以不會拋出異常,如果將&&改爲&,則會拋出NullPointerException異常。對於if(x==3 & ++y>0)表達式,若x==3不成立,y會自加,而對於if(x==3 && ++y)表達式,如果x==3不成立,則y不會自增。
&還可以用作位運算符,當&操作符兩邊的表達式不是boolean類型時,&表示按位與操作,我們通常使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如:0x31 & 0x0f的結果爲0x01。
備註:這道題先說兩者的共同點,再說出&&和&的特殊之處,並列舉一些經典的例子來表明自己理解透徹深入、實際經驗豐富。

4 在Java中如何跳出當前的多重嵌套循環?
在Java中要想跳出多重循環,可以在外面的循環語句前定義一個標號,然後在裏層循環體的代碼中使用帶有標號的break語句,即可跳出外層循環。例如:

ok:
for(int i=0; i<10; i++){
    for(int j=0; j<10; j++){
        System.out.println("i=" + i + ",j=" + j);
        if(j == 5) break ok;
    }
}

個人並不喜歡用標號這種方式,而是讓外層循環條件表達式的結果可以受到內層循環體代碼的控制,例如,要在二維數組中查找到某個數字:

int arr[][] = {{1,2,3}, {4,5,6,7}, {9}};
boolean found = false;
for(int i=0; i<arr.length && !found; i++){
    for(int j=0; j<arr[i].length; j++){
        System.out.println("i=" + i + ",j=" + j);
        if(arr[i][j] == 5){
            found = true;
            break;
        }
    }
}

5 switch語句能否作用在byte上?能否作用在long上?能否作用在String上?
在switch(exprl)中,exprl只能是一個整數表達式或者枚舉常量。整數表達式可以是int基本類型或者Integer包裝類型,由於byte,short,char都可以隱含轉換爲int,所以,這些類型以及這些類型的包裝類型也是可以的。顯然,long和String類型都不符合switch的語法規定,並且不能被隱式轉換成int類型,所以他們不能作用於switch語句中。

6 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編譯器會對它進行特殊處理,因此可以正確編譯。

7 char型變量中能不能存儲一箇中文漢字?爲什麼?
char型變量是用來存儲Unicode編碼的字符的,Unicode編碼字符集中包含了漢字,所以,char型變量中當然可以存儲漢字了。不過,如果特殊的漢字沒有被包含在Unicode編碼字符集中,那麼,char類型變量中就無法存儲這個漢字了。補充說明:Unicode編碼佔兩個字節,所以,char型變量也是佔兩個字節。

8 用最有效的方法計算出2乘以8等於幾。
答案:2 << 3
因爲講一個數左移n位,將相當於乘以2的n次方,那麼一個數乘以8只需將其左移3位即可,而位運算是CPU直接支持的,效率最高。

9 請設計一個能計算100億的計算器。
首先要明白這道題目的考察點是什麼,一個是大家首先要對計算機原理的底層細節要清楚,要知道加減法的位運算原理和知道計算機中的算術運算會發生越界的情況,二是要具備一定的面向對象的設計思想。
首先,計算機中用固定數量的幾個字節來存儲數值,所以計算機中能夠表示的數值是有一定範圍的,爲了便於講解和理解,我們首先以byte類型的整數爲例,它用一個字節進行存儲,表示的最大數值範圍爲-128到+127。-1在內存中對應的二進制爲11111111,如果兩個-1相加,不考慮java運算時的類型提升,運算後會產生進位,二進制結果爲1,11111110,由於進位後超過了byte類型的存儲空間,所以進位部分被捨棄,即最終的結果爲11111110,也就是-2,這正好利用溢位的方式實現了負數的運算。-128在內存中對應二進制爲10000000,如果兩個-128相加,不考慮java,運算後會產生進位,二進制結果爲1,00000000,超出byte的範圍,進位部分被捨棄,最終結果爲00000000,即0,這樣的結果顯然是不正確的,這說明計算機中的算術運算是會發生越界情況的,兩個數值的運算結果不能超過計算機中該類型的數值範圍。由於java中設計表達式運算時的類型自動提升,我們無法用byte類型來做演示這種問題的和現象的實驗,大家可以用下面使用整數來體驗一下:

int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
int sum = a + b;
System.out.println("sum=" + sum);
            先不考慮long類型,由於int的正整數範圍爲231,表示的最大數值約等於2*1000*1000*1000,也就是20億的大小,所以,要實現一個100億的計算器,我們得自己設計一個類可以用於表示很大的數值,並且提供了與另一種個整數進行相加減乘除的功能,大概功能如下:

(1) 這個類內部有兩個成員變量,一個表示符號,一個用字節數組表示數值的二進制數;
(2) 有一個構造方法,把一個包含有多位數值的字符串轉換到內部的符號和字節數組;
(3) 提供加減乘除的功能。

public class BigInteger{
    int sign;
    byte[] val;
    public BigInteger(String val){
        sign =  ;
        val =  ;
    }
    public BigInteger add(BigInteger other){}
    public BigInteger subtract(BigInteger other){}
    public BigInteger multiply(BigInteger other){}
    public BigInteger divide(BigInteger other){}
}
            備註:想要寫出這個完整的代碼,是比較複雜的,筆試和麪試中可能沒有足夠的時間寫出,感興趣的夥伴可參看jdk中自帶的java.math.Biginteger類的源碼。

10 使用final關鍵字修飾一個變量時,是引用不能變,還是應用的對象不能變?
使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指的對象中的內容還是可以變得。例如:
final StringBuffer a = new StringBuffer(“immutable”);
執行語句將報告編譯錯誤:
a = new StringBuffer(“”);
但是執行如下則通過編譯:
a.append(“broken!”);
有人在定義方法的參數時,可能想採用如下的形式來阻止方法內部修改傳進來的參數對象:
public void method(final StringBuffer param){}
實際上,這是辦不到的,在該方法內部任然可以增加如下代碼來修改參數對象:
param.append(“aaa”);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章