Java面試題全集學習筆記

冇_有發表於2017-07-26

學習資料來自:

http://blog.csdn.net/jackfrued/article/details/44921941/

第7題!

class AutoUnboxingTest {

    public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = 3;                  // 將3自動裝箱成Integer型別
        int c = 3;
        System.out.println(a == b);     // false 兩個引用沒有引用同一物件
        System.out.println(a == c);     // true a自動拆箱成int型別再和c比較
        System.out.println(b == c);    // true b自動拆箱成int型別再和c比較 
    }
}

public class B{
    public static void main(String[] args) {
        Integer a = 128;
        Integer b = 128;
        int c = 128;
        System.out.println(b==a);//false
        System.out.println(a==c);//true
        System.out.println(b==c);//true
    }

}

public class B{
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        int c = 100;
        System.out.println(b==a);
        System.out.println(a==c);
        System.out.println(b==c);
    }

}
之所以會出現上面神奇的現象,是因為

Integer a = 100時,如果整型字面量的值在-128到127之間,那麼不會new新的Integer物件,而是直接引用常量池中的Integer物件,但如果超過128,就會new新的Integer物件。

但是Integer a = new Integer(3)時,由於後面用了new,所以無論如何都會new一個Integer出來。

但是用==進行比較的時候,裝箱的a和b(128時b也裝箱)會自動拆箱成int型別與c進行比較,拆箱後引用指向的就變了,變為了常量池中的int型數值位置


18題!

Java語言的方法呼叫只支援引數的值傳遞!雖然傳遞的是物件的控制程式碼副本,但真正操作起來的還是物件本身。


24題!

class Outer {

    class Inner {}

    public static void foo() { new Inner(); }

    public void bar() { new Inner(); }

    public static void main(String[] args) {
        new Inner();
    }
}

Java中非靜態內部類物件的建立要依賴其外部類物件,上面的面試題中foo和main方法都是靜態方法,靜態方法中沒有this,也就是說沒有所謂的外部類物件,因此無法建立內部類物件,如果要在靜態方法中建立內部類物件,可以這樣做:

new Outer().new Inner();

在其他類中用到時

Outer outer= new Outer();
Outer.Inner inner = outer.new Inner();

37題!

建立物件時構造器的呼叫順序是:先初始化靜態成員,然後呼叫父類構造器,再初始化非靜態成員,最後呼叫自身構造器。


46題!
try{}裡有一個return語句,那麼緊跟在這個try後的finally{}裡的程式碼會被執行,在return前執行。果存在finally程式碼塊,try中的return語句不會立馬返回撥用者,而是記錄下返回值待finally程式碼塊執行完畢之後再向呼叫者返回其值,然後如果在finally中修改了返回值,就會返回修改後的值。


51題!

下面程式碼輸出什麼?

class Annoyance extends Exception {}
class Sneeze extends Annoyance {}

class B {

    public static void main(String[] args)
            throws Exception {
        try {
            try {
                throw new Sneeze();
            }
            catch ( Annoyance a ) {
                System.out.println("Caught Annoyance");
                throw a;
            }
        }
        catch ( Sneeze s ) {
            System.out.println("Caught Sneeze");
            return ;
        }
        finally {
            System.out.println("Hello World!");
        }
    }
}

輸出:

Caught Annoyance
Caught Sneeze
Hello World!

原因:

雖然第一個catch那裡捕獲的是Annoyance,但是由於throw的是一個Sneeze而它又是Annoyance的子類,所以那個a其實還是Sneeze型別的,所以catch後又丟擲,還能被第二個catch捕獲!


57題!

程式是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,是作業系統進行資源分配和排程的一個獨立單位;執行緒是程式的一個實體,是CPU排程和分派的基本單位,是比程式更小的能獨立執行的基本單位。執行緒的劃分尺度小於程式,這使得多執行緒程式的併發性高;程式在執行時通常擁有獨立的記憶體單元,而執行緒之間可以共享記憶體。使用多執行緒的程式設計通常能夠帶來更好的效能和使用者體驗,但是多執行緒的程式對於其他程式是不友好的,因為它可能佔用了更多的CPU資源。當然,也不是執行緒越多,程式的效能就越好,因為執行緒之間的排程和切換也會浪費CPU時間。



相關文章