1. 程式人生 > 其它 >Java面試(一)

Java面試(一)

1、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?

2、Java 有沒有 goto?

3、說說&和&&的區別。

4、在 JAVA 中如何跳出當前的多重巢狀迴圈?

5、switch 語句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?

6、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

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

8、用最有效率的方法算出 2 乘以 8 等於幾?

9、使用 final 關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?

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


1、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?

可以有多個類,但只能有一個 public 的類,並且 public 的類名必須與檔名相一致。

2、Java 有沒有 goto?

java 中的保留字,現在沒有在 java 中使用。

3、說說&和&&的區別。

&和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的表示式的結果都為 true 時,整個運算 結果才為 true,否則,只要有一方為 false,則結果為 false。
&&還具有短路的功能,即如果第一個表示式為 false,則不再計算第二個表示式,例如,對於 if(str != null && !str.equals(“”))表示式,當str為null時,後面的表示式不會執行,所以不會出現NullPointerException如果將 &&改為&,則會丟擲 NullPointerException 異常。If(x==33 & ++y>0) y 會增長,If(x==33 && ++y>0)不會增長
&還可以用作位運算子,當&操作符兩邊的表示式不是 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(expr1)中,expr1 只能是一個整數表示式或者列舉常量(更大字型),整數表示式可以是 int 基本類 型或 Integer 包裝型別,由於,byte,short,char 都可以隱含轉換為 int,所以,這些型別以及這些型別的包裝型別也 是可以的。顯然,long 和 String 型別都不符合 switch 的語法規定,並且不能被隱式轉換成 int 型別,所以,它們 不能作用於 swtich 語句中。

更正:在Java 7中,增加了對String型別的支援。

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 直接支援的,效率最高,所以,2 乘以 8 等於幾的最效率的方法是 2 << 3。

9、使用 final 關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?

使用 final 關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的物件中的內容還是可以改變的。例 如,對於如下語句:

final StringBuffer a=new StringBuffer("immutable");

執行如下語句將報告編譯期錯誤:

a=new StringBuffer("");

但是,執行如下語句則可以通過編譯:

a.append(" broken!");

有人在定義方法的引數時,可能想採用如下形式來阻止方法內部修改傳進來的引數物件:

public void method(final StringBuffer param){ }

實際上,這是辦不到的,在該方法內部仍然可以增加如下程式碼來修改引數物件:

param.append("a");


10、"=="和 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 方法,由你自己寫程式碼來決定在什麼情況即可認為兩個物件的內容是相同的。



原文轉載:https://zhuanlan.zhihu.com/p/346195179