java解惑——循環,你真的會嗎??

          使用StringBuffer時應該注意的:
            StringBuffer sb = new StringBuffer('M');
            sb.append("abc");
            System.out.println(sb.toString());

             該程序會輸出什么呢?   不是 mabc   輸入結果為: abc
             為什么m沒有輸出來呢?奇怪了? 其實也不是很奇怪,StringBuffer沒有字符為參數的構造方法,只有int作為緩沖區初始容量的構造器。
          在本例子中, new StringBuffer('M') 返回的是一個具有初始容量77的空字符串緩沖區。


          **2******************************************************************************************************************

           

          下面的程序循環遍歷byte數值,以查找某個特定值。這個程序會打印出什么?

          public class BigDelight {
           
          public static void main(String[] args) {
            
          for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++{
             
          if (b == 0x90)
              System.out.println(
          "hello");
            }

           }

          }



           

          結果什么都沒有打印。
            0x90是一個兩位數的十六進制字面常量,每一個十六進制位都占據4個比特的位置,
          所以整個數值也只占8個比特,即1個byte。問題在于byte是有符號類型,常量0x90是
          一個正的最高位被置為8位int數值。合法的byte數值是從-128到+127,但是常量0x90等于+144


          上面這個程序大家應該都能理解,但是下面整個判斷是true還是false呢?
          ( (byte)0x90 == 0x90 ) ,當然是false啦,有點java基礎知識的人都知道會轉化成int比較的,
          但轉化后值是多少呢? 這個這個。。。。。hoho   (byte)0x90 提升為int數值-122,而0x90為144


          如果要實現比較,其實也很簡單。

          方法一: 只要我們相同的類型比較就可以啦,蘋果跟蘋果比較,桔子跟桔子比較。
          最上面的程序改成:
          if (b == (byte)0x90)
              System.out.println("hello");
          這就可以打印出來了。

          方法二:
          可以用一個屏蔽碼來消除符號擴展的影響,從而將byte轉化為int,之后就可以拿到一個int與另一個int進行比較了。
          if ( (b & 0xff) == 0x90)
              System.out.println("hello");

             雖然上面的兩種方法都可以,但是避免這類問題的最佳方法還是將常量值移到循環的外面,并在一個常量種定義它。

          1public class BigDelight {
          2 private static final byte TARGET = (byte)0x90;
          3 public static void main(String[] args) {
          4  for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++{
          5   if ( b == TARGET )
          6    System.out.println("hello");
          7  }

          8 }

          9}

           

           




          ****3**************************************************************************************
          下面的程序輸入結果是什么呢?

          public class Incremet {
           
          public static void main(String[] args) {
            
          int j = 0;
            
          for(int i=0;i<100;i++){
             j 
          = j++;
            }

            System.out.println(j);
           }


          }

           


          乍一看應該慧是100吧。 畢竟做了100次循環增量。   結果確是0


          j = j++; 整個操作細分開來大家都知道:
          int temp = j;
          j = j+1 ;
          j = temp;

           那如果是這樣那么結果就不用懷疑了,j=0

          ****4***************************************************************************


          下面的程序輸出什么呢?

           1public class InTheLoop {
           2 public static final int END = Integer.MAX_VALUE;
           3 public static final int START = Integer.MIN_VALUE;
           4 public static void main(String[] args) {
           5  int count = 0;
           6  for(int i=START;i<=END;i++){
           7   count ++;
           8  }

           9  System.out.println(count);
          10 }

          11}

           

          應該是101吧,應該,那就是錯啦,實際上是:在for循環中,出現了無限循環。
          當i達到Integer.MAX_VALUE時,并且再次執行增量操作時,它就又繞回到了Integer.MIN_VALUE。 所以就出現無限循環。

           


          求:尋找一種定義,使得下面的循環一直無限,
             (1). for(int i=start;i<=start+1;i++){}
             (2). while(i== i+1){}
             (3). while(i !=i ){}
             (4). while(i!= i + 0 ){},附加要求,不能使用浮點數類型
             (5). while(i<=j && i>=j && i!=j ){}
             (6). while(i!=0 && i== -i ){} 

          解答(1):int start = Integer.MAX_VALUE-1;   //不信你可以試一試
          解答(2):可以用任何計算位無窮大的浮點算術表達式來實現:
          double i = 1.0/0.0; 一般都使用浮點數常量:double i = Double.POSITIVE_INFINITY;事實上,不必將i初始化為無窮大,
          任何足夠大的浮點數都可以實現這一目的。例如:double i = 1.0e40;
          解答(3):double i=0.0/0.0; 即:double i = Double.NaN;
          解答(4):把i定義成string類型就可以實現啦
          解答(5):Integer i = new Integer(0);  Integer j = new Integer(0);
          解答(6):int i = Integer.MIN_VALUE; 或 long i = Long.MIN_VALUE;

           


          尋找i一種定義,使得 if( i-i == 0 ){} if中的條件永遠為false?
          解答:double i=0.0/0.0; 即:double i = Double.NaN;

           

           

           

           

           

           

           

           

           


           

          posted on 2009-04-07 22:49 胡鵬 閱讀(284) 評論(0)  編輯  收藏 所屬分類: java基礎

          導航

          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          agile

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 龙胜| 渭南市| 本溪| 集安市| 新化县| 沿河| 开鲁县| 久治县| 泽州县| 武威市| 安新县| 山西省| 栾城县| 沅陵县| 枝江市| 藁城市| 鹿邑县| 兴城市| 郴州市| 滨州市| 印江| 新昌县| 永登县| 濮阳县| 宝兴县| 徐水县| 长治市| 土默特左旗| 曲沃县| 武宣县| 类乌齐县| 新巴尔虎右旗| 阳朔县| 屏边| 清水县| 乐安县| 上饶市| 垣曲县| 达孜县| 淮北市| 淮安市|