Java面試題

持續整理中...java

          類和對象            

1.下面哪一個不是Object類所定義的public method?( )
A.finalize() B.clone() C.wait() C.sleep()程序員

          JVM            

1.下面給出的Java中ClassLoader的描述,哪些是正確的?( )
A.ClassLoader沒有層次關係
B.全部類中的ClassLoader都是AppClassLoader
C.經過Class.forName(String className)可以動態加載一個類
D.不一樣的ClassLoader加載同一個Class文件,所得的類是相同的面試

2.Which characters does JVM use?(JVM使用哪一種字符編碼格式?)( )
A.ASCII characters  B.Unicode characters
C.Cp1252      D.UTF-8算法

          i++            

1.如下代碼的執行結果是____編程

public static void main(String[] args) {
    int i = 0;
    int x = i++;
    int y = ++i;
    int z = i++ + ++i;
    System.out.println(x);
    System.out.println(y);
    System.out.println(z);
}

2.下列程序的輸出結果是( )數組

public static void main(String[] args) {
    int j = 0;
    for (int i = 0; i < 100; i++) {
        j = j++;
    }
    System.out.println(j);
}

A.0  B.99  C.100  D.101app

3.下列程序的輸出結果是( )函數

public static void main(String[] args) {
    int a = 5, b = 3;
    if(!(a == b) && (a == 1 + b++)){};
    System.out.println(a + "," + b);
}

A.5,3  B.0,1  C.0,3  D.5,4測試

4.如下代碼的執行結果是____ui

public static void main(String[] args) {
    int i = 0;
    i = i++ + ++i;
    int j = 0;
    j = ++j + j++ + j++ + j++;
    int  k = 0;
    k = k++ + k++ + k++ + ++k;
    int h = 0;
    h = ++h + ++h;
    int p1 = 0, p2 = 0, q1 = 0, q2 = 0;
    q1 = ++p1;
    q2 = p2++;
    System.out.println(i);
    System.out.println(j);
    System.out.println(k);
    System.out.println(h);
    System.out.println(p1);
    System.out.println(p2);
    System.out.println(q1);
    System.out.println(q2);
}

5.如下代碼的執行結果是____

public static void main(String[] args) {
    int m = 5, n = 5;
    if((m != 5) && (n++ == 5)){}
    System.out.println(n);
    
    m = n = 5;
    if((m != 5) & (n++ == 6)){}
    System.out.println(n);
    
    m = n = 5;
    if((m == 5) || (n++ == 5)){}
    System.out.println(n);
    
    m = n = 5;
    if((m == 5) | (n++ == 6)){}
    System.out.println(n);
    
    int a = 1, b =2;
    int c = a & b;
    System.out.println(c);
}

          類型轉換            

1.Which of the following will compile correctly(下列哪項編譯正確?)( )
A.Short myshort = 99S;  B.float z = 1.0  C.int t = "abc".length()  D.char c = 17c;

2.下面代碼的輸出結果是( )

public static void main(String[] args) {
    public static void main(String[] args){
    int i = 012;
    int j = 034;
    int k = (int)056L;
    int l = 078;
    System.out.println(i);
    System.out.println(j);
    System.out.println(k);
}

A.輸出12,34,56  B.輸出10,28,46
C.int k = (int)056L;行編譯錯誤  D.int l = (int)078;行編譯錯誤

3.如下程序錯誤的是( )
A.short s=1;s=s+1;  B.short s=1;s+=1;

4.下面代碼的輸出結果是( )

public static void main(String[] args) {
    char x = 'x';
    int i = 10;
    System.out.println(false ? i : x);
    System.out.println(false ? 10 : x);
}

A.120 x  B.120 120  C.x 120  D.以上答案都不對

          程序結構            

1.Which declaration of the main() method in a stand-alone program are NOT valid?( )
(哪個Main方法的聲明在獨立程序中是無效的?)
A.public static void main()
B.public static void main(String[] string)
C.public static void main(String[] exp) throws FileNotFondException
D.Static void main(String args)

2.如下程序的輸出結果是?( )

public class Penguin {

    private String name = null;
    private int health = 0;
    private String sex = null;
    
    public void Penguin() {
        health = 10;
        sex = "雄";
        System.out.println("執行構造方法。");
    }
    
    public void print(){
        System.out.println("企鵝的名字是" + name + ",健康值是" + health + ",性別是" + sex + "。");
    }
    
    public static void main(String[] args) {
        Penguin pgn = new Penguin();
        pgn.print();
    }

}

A.企鵝的名字是null,健康值是10,性別是雄。
B.執行構造方法。
企鵝的名字是null,健康值是0,性別是null。
C.企鵝的名字是null,健康值是0,性別是null。
D.執行構造方法。
企鵝的名字是null,健康值是10,性別是雄。

          運算符            

1.如下代碼的輸出結果是( )

public static void main(String[] args) {
    boolean b = true ? false : true == true ? false : true;
    System.out.println(b);
}

A.true  B.false  C.null  D.以上答案都不對

2.如下代碼的輸出結果是( )

public static void main(String[] args) {
    int i = 42;
    String s = (i < 40) ? "life" : (i > 50) ? "universe" : "everything";
    System.out.println(s);
}

A.life  B.universe  C.everything  D.以上答案都不對

3.如下代碼的輸出結果是( )

public static void main(String[] args) {
    int a = 5;
    System.out.println(a < 5 ? 10.9 : 9);
}

A.編譯錯誤  B.10.9  C.9  D.以上答案都不對

4.如下代碼的輸出結果是____

public static void main(String[] args) {
    int a = 1;
    int b = 2;
    System.out.println(a & b);
    System.out.println(a | b);
}

5.如下代碼的輸出結果是____

public static void main(String[] args) {
    int a = 1;
    int b = 2;
    System.out.println(b << a);
    System.out.println(b >> a);
}

6.如下代碼的輸出結果是____

public static void main(String[] args) {
    int a = 1;
    int b = 2;
    System.out.println(b << a << a);
    System.out.println(b >> a >> a);
    System.out.println(b >> 32);
    System.out.println(b << 33);
}

          算法            

1.編程,輸出數組裏的所有數值。(假設int[] array = new int[]{1, 2, 3, 4})

2.編程,輸出99乘法口訣表

3.編程,輸出字符串中出現次數最多的字符,若是有多個則都輸出。(假設字符串String str = "abcdefaaaccc"。);

4.編程,有一個整數n,寫一個函數f(n),返回0~n之間出現「1」的個數。好比f(1)=1,f(13)=6(一、十、十一、十二、13)

5.編程,獲取斐波那契數列的第n項值。
(斐波那契數列指的是這樣一個數列:一、一、二、三、五、八、1三、21……這個數列從第3項開始,每一項都等於前兩項之和。F[n]=F[n-1]+F[n-2] (n>2,F[1]=1,F[2]=1,F[3]=2,F[4]=3))

          答案          

                  類和對象          


1.下面哪一個不是Object類所定義的public method? 答案:
這題看起來很簡單,可是仔細一想沒那麼容易。
Object類定義的公用方法有如下7種:

toString();    //
equals(Object object);
getClass();
hashCode();
wait();
notify();
notifyAll();

wait();方法有三種重載方法
wait(long timeout);
wait(long timeout, int nanos);
再加兩個一共是9種public方法。
因此這題的正確答案是A、B、D, 四個選項裏只有wait()是公用方法
clone()和finalize()是protected方法。sleep()不是Object類的方法。
《Java程序員面試寶典》給的答案是D,顯然錯了。
                  JVM          


1.答案:
A.選項錯誤,ClassLoader具有層次關係。
B.選項錯誤,ClassLoader不止一種。
D.選項錯誤,ClassLoader具有層次關係。
正確答案:C

2.答案:
JVM的設計者爲了解決編碼問題實現Java的跨平臺,沒有使用任何特定的編碼格式,而是使用Unicode(萬國碼)字符集來表示字符。
因此正確答案是B。

                  i++          


1.答案:
0
2
6

2.答案:
j=j++;//這一步j等於0,循環100次依然是0。
因此正確答案是A。

3.答案:
!(a == b)爲true,還需執行後面的(a == 1 + b++),執行後a,b的值分別爲5,4。
因此正確答案是D

4.答案:

public static void main(String[] args) {
    int i = 0;
    i = i++ + ++i;    //0 + (1 + 1) = 2
    int j = 0;
    j = ++j + j++ + j++ + j++;    //(1 + 0) + 1 + 2 + 3 = 7
    int  k = 0;
    k = k++ + k++ + k++ + ++k;    //0 + 1 + 2 + (1 + 3) = 7
    int h = 0;
    h = ++h + ++h;    //(1 + 0) + (1 + 1) = 3
    int p1 = 0, p2 = 0, q1 = 0, q2 = 0;
    q1 = ++p1;    //q1 = 1, p1 = 1
    q2 = p2++;    //q2 = 0, p2 = 1
    System.out.println(i);    //2
    System.out.println(j);    //7
    System.out.println(k);    //7
    System.out.println(h);    //3
    System.out.println(p1);    //1
    System.out.println(p2);    //1
    System.out.println(q1);    //1
    System.out.println(q2);    //0
}

5.答案:

public static void main(String[] args) {
    int m = 5, n = 5;
    if((m != 5) && (n++ == 5)){}
    System.out.println(n);    //5
    
    m = n = 5;
    if((m != 5) & (n++ == 6)){}
    System.out.println(n);    //6
    
    m = n = 5;
    if((m == 5) || (n++ == 5)){}
    System.out.println(n);    //5
    
    m = n = 5;
    if((m == 5) | (n++ == 6)){}
    System.out.println(n);    //6
    
    int a = 1, b =2;
    int c = a & b;
    System.out.println(c);    //0
}

因此正確答案是:
5
6
5
6
0

                  類型轉換          


1.答案:
A選項錯誤。short類型賦值時不須要在數值後加s,加s會報錯。
B選項錯誤。float類型賦值時須要在數值後加f,不加f默認會轉成double類型,編譯報錯「不能從double轉換爲float」。
D選項錯誤。char類型賦值時不須要在後面加c,加c會報錯。
正確答案爲C。

2.答案:
在java中以0開頭的數字表明8進制,數字範圍0~7,以0x開頭的數字表明16進制數字範圍0~F。

public static void main(String[] args) {
    public static void main(String[] args){
    int i = 012;    //(1x8) + 2 = 10
    int j = 034;    //(3x8) + 4 = 28
    int k = (int)056L;//(5x8) + 6 = 46
    int l = 078;    //編譯報錯「類型 int 的文字 078 超出了範圍」
    System.out.println(i);
    System.out.println(j);
    System.out.println(k);
}

因此正確答案是D

3.答案:
short s=1;s=s+1; //s+1爲int型,編譯報錯「類型不匹配:不能從 int 轉換爲 short」
short s=1;s+=1; //編譯正常
因此正確答案是A。

4.答案:
在Java中,整型、實型、字符型被視爲簡單數據類型,簡單數據類型之間會轉換,這些類型由低級到高級分別爲:
(byte short char) int long float double (7種 不包括boolean)
簡單數據類型之間的轉換又能夠分爲:
(1)低級到高級的自動類型轉換。
(2)高級到低級的強制類型轉換。
(1)包裝類型過渡類型可以轉換。

注意表達式中的精度轉換。當表達式中有高精度和低精度類型同時存在時,低精度類型會自動轉換爲高精度類型,輸出結果會發生變化,這點要特別注意。

false?i:x中i是整型,x是字符型,整型比字符型的精度高,因此x會自動轉換爲整型。結果爲120
false?10:x中10是整型, 可是是常量表達式。Java編程規範中提到:當後兩個表達式有一個是常量表達式時(10),兩外一個類型是T(char),而常量表達式能夠被T表示時,輸出結果是T類型(char類型能夠被int表示,因此輸出結果依然是char類型)。結果爲x
因此正確答案是A.120 x

                  程序結構          


1.答案:
java中對於main方法有嚴格的定義,必須是
public static void main(String[] x)或
public static void main(String x[])形式的。
修飾符必須是public static,返回類型必須是void(不須要返回類型),參數必須是String[] 不能沒有參數也不能是其餘參數。
標準格式以下:
public static void main(String[] args){}或
public static void main(String args[]){}
能夠修改參數的名字或添加拋出異常。基本是死記硬背的一種格式,遇到此類問題能夠和標準格式進行比對。
實際上不寫public或參數並不會在編譯期間報錯但會在運行時報錯。
因此這道題不簡單,坑挺深的,編譯期間4個選項的寫法都不會報錯,但運行時A、D都會出錯。
A、D選項會在運行時報出找不到main方法的錯誤:
「錯誤:在類 Test 中找不到 main 方法,請將 main 方法定義爲
public static void main(String[] args) 不然 JavaFX 應用程序類必須擴展javafx.application.Application」
因此正確答案是A、D。 若是隻能選一個選項的話,選D,《Java程序員面試寶典》一書中給的答案是D,若是剛好考官出的是此書中的題,那就中了。

2.答案:
這道題看起來很簡單,若是你選D就錯了。
這題考驗的是你對構造方法的理解。
構造方法的定義是:與類名徹底相同。沒有返回值,也不能用void來修飾。
注意的是無返回類型而不是void返回類型。
在java中普通方法能夠和構造方法同名,可是必須帶有返回值。
實際上這題因爲public void Penguin(){}方法寫了void返回類型,因此他沒有符合構造方法的條件,而是被看成普通方法了。程序執行了默認的構造方法並無執行public void Penguin{}這個方法,變量沒有被初始化,因此結果是C。

                  運算符          


1.答案:
a?b:c;是三目運算符,至關於:

if(a){
    b;
}else{
    c;
}

boolean b = true ? false : true == true ? false : true;至關於:
boolean b = true ? false : (true == true ? false : true);至關於:

boolean b;
if(true){
    b = false;
}else{
    if(true == true){
        b = false;
    }else{
        b = true;
    }
}

因此正確答案是B。

2.答案:
String s = (i < 40) ? "life" : (i > 50) ? "universe" : "everything";至關於:
String s = (i < 40) ? "life" : ((i > 50) ? "universe" : "everything");至關於:

String s;
if(i < 40){
    s = "life";
}else{
    if(i > 50){
        s = "universe";
    }else{
        s = "everything";
    }
}

因此正確答案是C。

3.答案:
注意10.9:9這裏Java會根據運算符的精度自動進行類型轉換。10.9的精度是double型,後面的9也自動轉成double型了,
所以代碼執行後結果爲9.0。
因此答案是D。

4.答案:
&、|是位運算符,是操做二進制數的,因此要先把a、b轉換爲二進制數進行位運算後再轉換爲整型輸出結果。
1的二進制是01,2的進制是10
a&b = 1 & 2 =
01
10
__
00 = 0;

a|b = 1 | 2 =
01
10
__
11 = 3;
因此輸出結果爲:
0
3

5.答案:
<<、>>是位移運算符,是操做二進制數的,因此要先把a、b轉換爲二進制數進行位移運算後再轉換爲整型輸出結果。

public static void main(String[] args) {
    int a = 1;
    int b = 2;
    System.out.println(b << a);    //(b << a) = (0010 << 1) = 0100 = 4
    System.out.println(b >> a);    //(b >> a) = (0010 >> 1) = 0001 = 1
}

因此輸出結果爲:
4
1

6.答案:
注意當位移溢出時的計算結果。

public static void main(String[] args) {
    int a = 1;
    int b = 2;
    System.out.println(b << a << a);    //(b << a << a) = (b << 2) = (0010 << 2) = 1000 = 8  
    System.out.println(b >> a >> a);    //(b >> a >> a) = (b >> 2) = (0010 >> 2) = 0000 = 0
    System.out.println(b >> 32);    //(b >> 32) = (b >> (32%32)) = (b >> 0) = b = 2;    數據溢出時,位移數%數據最大範圍,求餘後從新計算
    System.out.println(b << 33);    //(b << 33) = (b << (33%32)) = (b << 1) = (0010 << 1) = 0100 = 4;    數據溢出時,位移數%數據最大範圍,求餘後從新計算
}

因此輸出結果爲:
8
0
2
4

                  算法          


1.輸出數組裏的全部值 答案:

//方法1 Arrays.toString(array)
public static void main(String[] args) {
    int[] array = new int[]{1, 2, 3, 4};
    System.out.println(Arrays.toString(array));    //[1, 2, 3, 4]
}
//方法2 for循環
public static void main(String[] args) {
    int[] array = new int[]{1, 2, 3, 4};
    int length = array.length;
    for (int i = 0; i < length; i++) {
        System.out.print(array[i] + " ");    //1 2 3 4
    }
}
//方法3 foreach循環
public static void main(String[] args) {
    int[] array = new int[]{1, 2, 3, 4};
    for(int v : array){
        System.out.print(v + " ");    //1 2 3 4
    }
}

2.輸出99乘法口訣表 答案:

//方法1 用String
public static void NineNine(){
    String str = "";
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            str += j + "*" + i + "=" + j*i + "\t";
        }
        str += "\n";
    }
    System.out.println(str);
}

循環10W次時間:1180ms

//方法2 用StringBuilder
public static void NineNine(){
    StringBuilder sb = new StringBuilder();
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            sb.append(j);
            sb.append("*");
            sb.append(i);
            sb.append("=");
            sb.append(j*i);
            sb.append("\t");
        }
        sb.append("\n");
    }
    System.out.println(sb);
}

循環10W次時間:367ms

//方法3 一次循環完成
public static void NineNine(){
    int i = 1;  
    int j = 1;
    String str = "";
    while (i <= 9) {
        str += j + "*" + i + "=" + j*i + "\t";
        j++;
        if(j > i){
            i++;
            j = 1;
            str += "\n";
        }
    }
    System.out.println(str);
}

循環10W次時間:1197ms

//測試代碼
public static void main(String[] args){
    long t1 = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        //循環時註釋掉System.out.println(str)
        NineNine();
    }
    long t2 = System.currentTimeMillis();
    System.out.println(t2 - t1);
}

3.輸出字符串中出現次數最多的字符 答案:

//方法1
public static void printMaxChars(String str){
    HashMap<Character, Integer> map = new HashMap<Character, Integer>();
    int length = str.length();
    int max = 0;
    //循環字符串中的全部字符,記錄每一個字符出現的次數並獲取最大次數
    for (int i = 0; i < length; i++) {
        int count = 0;
        char c = str.charAt(i);
        if(map.containsKey(c)){
            count = map.get(c);
        }
        count++;
        if(count > max){
            max = count;
        }
        map.put(c, count);
    }
    System.out.println("最大次數:" + max);
    //遍歷map中的鍵,若是其值等於最大次數,則列出
    for (Character c : map.keySet()) {
        if(map.get(c).equals(max)){
            System.out.print(c + " ");
        }
    }
}

輸出結果:
最大次數:4
c a
(輸出結果還能夠放進數組裏排個序)

4.編寫函數f(n), 獲取0~n中「1」出現的次數 答案:

//獲取0~n中1的數量
public static int get1Count(int n){
    String str = "";
    for (int i = 1; i <= n; i++) {
        str += i;
    }
    int count = 0;
    int length = str.length();
    for (int i = 0; i < length; i++) {
        char c = str.charAt(i);
        if(c == '1'){
            count++;
        }
    }
    return count;
}

5.獲取斐波那契數列的第n項值 答案:

// 方法1 遞歸
public static int Fibo(int n){
    return n < 3 ? 1 : Fibo(n - 2) + Fibo(n - 1);
}

計算n=1~40 時間:776ms

// 方法2 for循環
public static int Fibo(int n) {
    int a = 1;
    int b = 1;
    for (int i = 2; i < n; i++) {
        int c = a + b;
        a = b;
        b = c;
    }
    return b;
}

計算n=1~500 循環1萬次時間:462ms

// 方法3 for循環簡化
// (理論上比方法2稍快 具體執行環境不一樣稍有差別 正負相差不大)
public static int Fibo(int n) {
    int a = 1;
    int b = 1;
    for (int i = 2; i < n; i++) {
        b = a + b;
        a = b - a;
    }
    return b;
}

以上結果能夠看出。雖然遞歸寫法很簡潔,可是效率過低,展開爲for循環之後,效率極大提高。

// 測試代碼
public static void FiboTest() {
    int times = 10000;
    int n = 500;
    long t0 = 0;
    long t1 = 0;
    /*
    // 輸出斐波那契數列
    String msg = "";
    for (int i = 1; i <= 20; i++) {
        msg += Fibo(i) + " ";
    }
    System.out.println(msg);
    */
    
    /*
    // 遞歸
    t0 = System.currentTimeMillis();
    for (int j = 1; j <= 40; j++) {
        Fibo(j);
    }
    t1 = System.currentTimeMillis() - t0;
    System.out.println("遞歸:" + t1 + "ms");
    */
    
    //for循環
    t0 = System.currentTimeMillis();
    for (int i = 0; i < times; i++) {
        for (int j = 1; j <= n; j++) {
            Fibo(j);
        }
    }
    t1 = System.currentTimeMillis() - t0;
    System.out.println("for循環:" + t1 + "ms");
    
}
相關文章
相關標籤/搜索