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