2017 Java面試大全(一)


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");則可以編譯通過。

 

今天的經驗就到這里,請關注小李后續的文章,將會奉上更多的經驗!

 

版權所有,允許轉載,轉載請注明出處,侵權必究! 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM