100家IT 名企面試必考面試題java系列

傳智黑馬發表於2019-05-10
據官方資料統計,在全球程式語言工程師的數量上 ,JavaEE 以 900 萬的程式設計師數量位居首位,很多軟體的開發都離不開它。

自從黑馬程式設計師授課以來,深受社會上廣大程式設計愛好的喜愛,我們的課程一直被其他機構爭相模仿,我們堅信只有教育機構自身能力的不斷提升,才能帶動整體教育行業的前進。根據黑馬程式設計師畢業學員面試經驗,整理  100 家 IT 名(阿里、百度、騰訊、)企面試題,黑馬程式設計師為了幫助更多愛好並想學習程式設計的同學,整理了這篇資源帖子,只為幫助更多的人受益。
一、 Java 基礎部分

1.JAVA 的基本資料型別有哪些 ?   String 是不是基本資料型別 ?

Java  有 8 種基本資料型別:        byte        int        short        long        double        float        Boolean        char

byte        int        short        long        都屬於整數型別.

Double        float        屬於浮點型別.

Boolean        為布林型別

Char  為字元型

String 不是基本資料型別.它定義的為物件

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


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

3.Java 有沒有 goto?

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

4.說說&和&&的區別.

&和&&都可以用作邏輯與的運算子,表示邏輯與(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。

備註:這道題先說兩者的共同點,再說出 &&和&的特殊之處,並列舉一些經典的例子來表明自己理解透徹深入、實際經驗豐富。

5.在 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.length;j++){

System.out.println(“i=” + i + “,j=” + j);

if(arr[j]        == 5) {

found = true;

break;

}

}

}

6.switch 語句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?

switch(expr1)中,expr1 只能是一個整數表示式或者列舉常量(更大字型),整數表示式可以是 int 基本型別或 Integer 包裝型別,由於,byte,short,char 都可以隱含轉換為 int,所以,這些型別以及這些型別的包裝型別也是可以的。顯然,long 和 String 型別都不符合 switch 的語法規定,並且不能被隱式轉換成 int 型別,所以,它們不能作用於 swtich 語句中。

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

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

char 型變數是用來儲存 Unicode 編碼的字元的,unicode 編碼字符集中包含了漢字,所以, char 型變數中當然可以儲存漢字啦。不過,如果某個特殊的漢字沒有被包含在 unicode 編碼字符集中,那麼,這個 char 型變數中就不能儲存這個特殊漢字。補充說明:unicode 編碼佔用兩個位元組,所以,char 型別的變數也是佔用兩個位元組。

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

2 << 3,

因為將一個數左移  n 位,就相當於乘以了 2 的 n 次方,那麼,一個數乘以 8 只要將其左移 3 位即可,而位運算 cpu 直接支援的,效率最高,所以,2 乘以 8 等於幾的最效率的方法是 2 << 3。

10.請設計一個一百億的計算器

首先要明白這道題目的考查點是什麼,一是大家首先要對計算機原理的底層細節要清楚、要知道加減法的位運算原理和知道計算機中的算術運算會發生越界的情況,二是要具備一定的物件導向的設計思想。

首先,計算機中用固定數量的幾個位元組來儲存的數值,所以計算機中能夠表示的數值是有一定的範圍的,為了便於講解和理解,我們先以  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)提供加減乘除的功能

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 類的原始碼。面試的人也知道誰都不可能在短時間內寫出這個類的完整程式碼的,他要的是你是否有這方面的概念和意識,他最重要的還是考查你的能力,所以,你不要因為自己無法寫出完整的最終結果就放棄答這道題,你要做的就是你比別人寫得多,證明你比別人強,你有這方面的思想意識就可以了,畢竟別人可能連題目的意思都看不懂,什麼都沒寫,你要敢於答這道題,即使只答了一部分,那也與那些什麼都不懂的人區別出來,拉開了距離,算是矮子中的高個,機會當然就屬於你了。另外,答案中的框架程式碼也很重要,體現了一些物件導向設計的功底,特別是其中的方法命名很專業,用的英文單詞很精準,這也是能力、經驗、專業性、英語水平等多個方面的體現,會給人留下很好的印象,在程式設計能力和其他方面條件差不多的情況下,英語好除了可以使你獲得更多機會外,薪水可以高出一千元。


原文轉載於黑馬程式設計師官網社群,需要全套題目及解答,關注主頁


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69915785/viewspace-2643925/,如需轉載,請註明出處,否則將追究法律責任。

相關文章