Java程序員面試寶典——重要習題整理


1、下面程序的輸出結果是()

public class Test {
    
    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.101

解析:因為Java采用了中間緩存變量的機制,所以, j = j++可以換成 temp = j ; j = j + 1 ; j = temp ;所以結果為0.

關於中間緩存變量機制可以參考文章:http://blog.csdn.net/waycaiqi/article/details/43486249

 

2、以下程序錯誤的是()

A. short s = 1; s = s + 1 ;                    B. short s = 1 ; s += 1 ;            C. short s = 1 ; s = 1 + 1 ;

解析:使用+=、-=、*=、/=、%=等賦值運算符對基本類型運算時,運算符右邊的數字將首先被強制轉換成與左邊數值相同的數據類型,然后在進行運算,且運算結果與運算符左邊的數值類型相同,所以選項B正確。對於選項C,1+1是一個可以確定的常量,“+”在編譯時就被執行了,而不是在程序運行的時候執行,所以效果等同於s = 2 ; 的賦值操作,所以也正確。而A選項中的 s+1執行后的結果為int型,所以不能賦值給s。故錯誤的A

 

3、以下代碼的輸出結果是()

public class Test {
    
    public static void main(String[] args) {
        int a = 5 ;
        System.out.println("value is " + ((a < 5) ? 10.9 : 9));
        
        char ch = 'x' ;
        int i = 10 ;
        System.out.println(false ? i : ch );
        System.out.println(false ? 10 : ch );        
    }
}

 

解析:Java編程規范中提到,對於三目運算符?:而言,當后兩個表達式的數據類型不一致時,系統會自動將兩個表達式的類型轉化一致,所以第一個輸出結果為9.0而不是9,第二個輸出結果為120。此外,Java編程規范中還提到,當后兩個表達式有一個是常量表達式(本題是10)時,另外一個類型是T(本題是char)時,而常量表達式可以被T表示時,輸出結果是T類型。所以第三個輸出的是x而不是120。所以,最終的結果是9.0   120   x

 

4、下面程序的輸出結果是()

public class Test {
    
    public static void main(String[] args) {
        int num = 32 ;
        System.out.println(num >> 32);
    }
}

 

A. 32     B. 16        C. 1          D. 0

解析: 移位操作符右邊的參數首先要對字長進行取模運算,並且移位是對二進制位進行操作,而二進制中8位是一個循環。本題中num為int類型,字長是32,所以num>>32等於num>>0,而num>>33等於num>>1.所以答案為A

注意:在移位運算時,byte、short和char類型移位后的結果會變成int類型對於byte、short、char和int進行移位時,規定實際移動的次數是移動次數和32的余數,也就是移位33次和移位1次得到的結果相同。移動long型的數值時,規定實際移動的次數是移動次數和64的余數,也就是移動66次和移動2次得到的結果相同。 

 

5、當編譯下面代碼會出現什么情況()

public class Test {
    
    private int count ;
    //構造函數
    Test(int count){
        this.count = count ;
    }
    
    public static void main(String[] args) {
        Test t = new Test(99) ;
        System.out.println(t.count);
    }    
}

 

A. 編譯時錯誤,count變量定義的是私有變量

B. 編譯時錯誤,當System.out.println被調用時t沒有被初始化

C. 編譯和執行時沒有輸出結果

D. 編譯運行后輸出結果99

解析:事實上,變量count被定義為私有變量,並不能阻止構造器對其進行初始化,所以count成功被初始化為99,故答案為D

注意,count變量被私有化之后,理論上是不能被訪問的。但是該main方法是在本類的內部,所以可以直接訪問。如果在另一個類中這樣訪問Test對象的count變量,是不會成功的,例如下面的代碼會在第18行提示訪問錯誤

 

 1 public class Test {
 2     
 3     private int count ;
 4     //構造函數
 5     Test(int count){
 6         this.count = count ;
 7     }
 8     
 9     public static void main(String[] args) {
10         Test t = new Test(99) ;
11         System.out.println(t.count);
12     }    
13 }
14 
15 class T{
16     public static void say(){        
17         Test t = new Test(55) ;
18         //System.out.println(t.count) ; //無法編譯通過,提示有錯誤
19     }
20 }

 

6: 8、16、64都是2的階次方數,用Java編寫程序來判斷一個整數是否是2的階次方,並說明那個方法更好?

解析

思路1:不斷除以2,並判斷是否整除。這是最先想到的方法

public boolean judge(int n){
        int num = n ;
        if(n < 0){
            return false ;
        }
        //因為1為2的階次方數,所以不用判斷,當大於2時進行判斷
        while(num >= 2){
            if(num%2 == 1){
                return false ;
            }
            num = num/2 ;
        }
        return true ;
    }

 

思路2:如果一個數是2的階次方數,那么其二進制的首位為1,其他為均為0。eg:8的二進制表示為100,64表示為1000000等,若將該數減1,則對應的二進制首位為哦,其它位均為1,所以有n & (n-1)的結果為0。所以采用這種方法可以簡單快速地進行判斷。簡單,粗暴,高效

public boolean judge2(int n){
    if((n & (n-1)) == 0){
        return true ;
    }else{
        return false ;
    }
}

 

7、下面程序輸出結果是什么?

 

 1 import java.net.URL;
 2 import java.util.HashSet;
 3 import java.util.Set;
 4 
 5 public class Test {
 6     
 7     private static final String [] URLNAMES = {
 8             //IP地址為202.108.33.94
 9             "http://www.sina.com",
10             //IP地址為124.115.173.252
11             "http://www.nwu.edu.cn",
12             //IP地址為208.97.154.9
13             "http://javapuzzlers.com",
14             //IP地址為64.233.189.147
15             "http://www.google.com",
16             //IP地址為208.97.154.9
17             "http://Javapuzzlers.com",
18             //IP地址為208.97.154.9
19             "http://apache2-snort.skybar.dreamhost.com",            
20     };
21     
22     public static void main(String[] args) throws Exception {
23         Set<URL> favorites = new HashSet<URL>() ;
24         for(String s : URLNAMES){
25             favorites.add(new URL(s)) ;
26         }
27         
28  System.out.println(favorites.size());                
29     }        
30 }

 

A. 一定是4   B. 一定是5    C. 一定是6    D.以上答案都不對

解析:本題在聯網狀態下會輸出4,這是由於URL的equals比對方式,根據equals的文檔說明,如果兩個主機名可以解析為同一個IP地址,則認為兩個主機相同(即使主機名不相同);如果由一個主機名無法解析,但兩個主機名相等(不區分大小寫)或兩個主機名都為null,則也認為這兩個主機相等。上面有三個IP都是208.97.154.9,而Set集合不允許有重復元素出現,所以在聯網情況下輸出為4

如果是在斷網狀態下,這些都無法解析為IP地址,這時就要判斷URL的名字,僅認為名字相同的才是相同的URL,前面說過URL的判斷不區分大小寫,而有兩個在不區分大小寫的情況下是相同的,所以輸出結果是5.

所以最后的答案是D

 
        

 


免責聲明!

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



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