2017 Java面試大全(一)
1. 一個“.java”源文件中是否可以包括多個類(不是內部類)?有什么限制?
可以包括多個類,但是只有一個public的類,並且,這個public的類名必須和文件名相同。
2.Java有沒有goto?
Java的保留字,現在還沒有在Java中使用。
3.&與&&的區別。
&和&&都可以用作邏輯與的運算符,表示邏輯與(and)。當且僅當運算符兩側表達式都為true時,運算結果為true;若兩側有任一表達式為false,運算結果都為false。
&&運算符具有短路功能,即當第一個表達式的值為false時,將不再對第二個表達式進行判斷。比如:if(str != null && str.equals("")),當str 為 null 時,前面表達式為false,將不會再執行后邊的表達式,也就不會拋出空指針異常;但是對於if(str != null & str.equals(""))表達式,則會對兩個表達式都進行判斷而拋出空指針異常;
&還可以用作按位與的運算符,表示按位與。當運算符兩側的表達式的值不是bool類型時,&表示按位與操作。我們通常會使用0x0f來按位與一個整數,從而獲得該整數的最低4個bit位。例如:0x31&0x0f的結果為0x01。
4.在Java中如何跳出當前的多重嵌套循環?
在Java中,跳出多重嵌套循環,一般有兩種方法;一種是通過在外層循環定義一個標號,然后在內層用使用了該標號的break語句,即可跳出循環; 另一種方法則是定義一個flag標志來控制每一層循環的條件,通過內層控制該flag的值(true or false)來跳出循環。代碼示例如下:
// 方法一:
1 ok: 2 for (int i = 0; i < 100; i++){ 3 for (int j = 0; j < 100; j++){ 4 for (int k = 0; k < 100; k++){ 5 if (k == 5) 6 break ok; 7 } 8 } 9 }
// 方法二:
1 bool flag = true; 2 for (int i = 0; i < 100 && flag; i++){ 3 for (int j = 0; j < 100 && flag; j++){ 4 for (int k = 0; k < 100 && flag; k++){ 5 if (k == 5) 6 flag = false; 7 } 8 } 9 }
5.switch語句能否作用在byte上?能否作用在long上?能否作用在String上?
在switch(value)中,value只能是整型表達式或枚舉常量,其中,整型表達式可以是int基本類型或Internet包裝類型。因為byte,short,char可以隱式轉換為int,所以這些類型及其包裝類型都可以作為switch的值;但是long,String不可以隱式轉換為整型,不符合switch語句的語法規范,所以不能用於switch語句。
6.short s1 = 1; s1 = s1 + 1; 有什么錯? shor s1 = 1; s1 += 1; 有什么錯?
由於s1 + 1在計算時會自動提升表達式的類型,計算結果為int型,而int不能隱式轉換為short,當把結果再賦給short類型的s1時,編譯器將會報強制類型轉換的錯誤; 而對於s1 += 1, += 是Java語言規定的運算符,Java編譯器會對他進行特殊處理,將不會有任何錯誤,可以正常編譯。
7.char型變量中能否存儲一個中文漢字?為什么?
char型變量存儲的是Unicode編碼的字符,而漢字是Unicode編碼的,所以char型變量中當然可以存儲漢字。但是對於一些特殊的漢字可能沒有被Unicode編碼包含,那么這些字符不能存儲在char型變量中。另外,Unicode編碼占兩個字節,所以,char型變量也占兩個字符。
8.用最有效率的方法算出2乘以8等於幾?
2<<3;
將一個數左移n位,就相當於這個數乘以了2的n次方;2乘以8就等於2乘以2的3次方,也就是2<<3;並且移位運算直接由cpu支持,所以效率最高。
9.請設計一個一百億的計算器(本題非個人整理)
首先,計算機中用固定數量的幾個字節來存儲的數值,所以計算機中能夠表示的數值是有一定的范圍的,為了便於講解和理解,我們先以byte 類型的整數為例,它用1個字節進行存儲,表示的最大數值范圍為-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(“a=”+a+”,b=”+b+”,sum=”+sum);
先不考慮long類型,由於int的正數范圍為2的31次方,表示的最大數值約等於2*1000*1000*1000,也就是20億的大小,所以,要實現一個一百億的計算器,我們得自己設計一個類可以用於表示很大的整數,並且提供了與另外一個整數進行加減乘除的功能,大概功能如下:
(1)這個類內部有兩個成員變量,一個表示符號,另一個用字節數組表示數值的二進制數
(2)有一個構造方法,把一個包含有多位數值的字符串轉換到內部的符號和字節數組中
(3)提供加減乘除的功能
1 public class BigInteger{ 2 3 int sign; 4 5 byte[] val; 6 7 public Biginteger(String val) { 8 9 sign = ; 10 11 val = ; 12 13 } 14 15 public BigInteger add(BigInteger other) { 16 17 18 19 } 20 21 public BigInteger subtract(BigInteger other) { 22 23 24 25 } 26 27 public BigInteger multiply(BigInteger other){ 28 29 30 31 } 32 33 public BigInteger divide(BigInteger other){ 34 35 36 37 } 38 39 40 41 }
10.使用final關鍵字修飾一個變量時,是引用變量不能變,還是引用的對象不能變?
使用final關鍵字修飾一個變量時,是引用變量不能變,而引用變量所指向的對象中的內容可以改變。舉個例子來說:final StringBuffer a = new StringBuffer("aaa");
對於語句 a = new StringBuffer("");執行時編譯器將會報告錯誤;但是對於語句 a.append("bbb");則可以編譯通過。
今天的經驗就到這里,請關注小李后續的文章,將會奉上更多的經驗!
版權所有,允許轉載,轉載請注明出處,侵權必究!