1. 程式人生 > >java基礎小知識點

java基礎小知識點

強制 ++ 編碼 com 得到 問題 ipv6 內容 static

1. java小知識點

   --(1) boolean類型不能轉換為其他類型

      :無論是復雜的比較運算符操作還是簡單的,其結果都是boolean類型。如果強制將其他類型賦值給boolean類型,編譯器報錯(與c是不同的)

   --(2) 在定義long或者float類型時,需要加後綴L或者f(整數默認是int型,浮點數默認是double型)

   --(3) byte,short在定義的時候,他們接受的其實是一個int型

  **--(4) java中的char類型占用兩個字節,與c/c++中的單字節不同,所以char型可以賦值一個中文漢字(java語言采用的是UNICODE編碼,兼容了ASCII編碼)

  **--(5) 擴展賦值運算符其實隱含了一個強制類型轉換

      舉例: s += 1; //等價於 s = (s的數據類型)(s + 1);  

   --(6) 邏輯運算符 && || !^ 跟c語言用法相同; 但是 & ^ | ~ (按位取反運算符)即使邏輯運算符又是位運算符,當操作數是boolean型時,為邏輯運算符。

      註:舉一個按位取反運算符的例子(該運算符容易出錯,原因在於取反後為負值時,需考慮到原反補碼情況)

        System.out.println(~3);    //out:  -4

        分析:  3的二進制:00000000 00000000 00000000 00000011

            按位取反後:11111111 11111111 11111111 11111100    (補碼)要想計算得到輸出值:轉換為反碼,又轉換為補碼

                反碼:11111111 11111111 11111111 11111011

                補碼:10000000 00000000 00000000 00000100  //-4

  **--(7) 異或的性質:恒等律: x ^ 0 = 0; 歸零律:x ^ x = 0 (參考http://lijinma.com/blog/2014/05/29/amazing-xor/ 引用該博主內容)

       註:異或的實際應用:

      1. 快速比較兩個值, if (a ^ b == 0)的運算速度比if (a - b == 0)快
          舉例:ipv6中的比較
          static inline int ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2)
            {
              return (((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
                (a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
                (a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
                (a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0);
            }
        

      2. 在匯編語言中將變量置零:xor a, a;
      3. 判斷二進制數中1的個數(奇偶校驗)

來使某些特定的位翻轉,因為不管是0或者是1與1做異或將得到原值的相反值;

              舉例:將變量b的第6位翻轉

                 int a, b;

                 int mask = 1 << 6;

                 a = 0xb1;

                 b = a ^ mask;

          5. 經典題目:不使用其他空間,交換兩個值

              舉例:

                  a = a ^ b;

                  b = b ^ a;

                  a = a ^ b;

2.  默認類型轉換

      1. byte,short,char --> int -->long --> float --> double;(如果表達式中存在高類型,低類型全部轉換為高類型)

          註:long(8byte) --> float(4byte) 不會存在精度丟失問題,因為在底層存儲結構不同,float表示的數據範圍比long的範圍要大。
      2. byte,short,char互相之間不轉換,他們參與運算首先轉換為int類型;(如果表達式中全部是這三者,類型提升,全部轉換為int類型)
      3. 整數默認是int型,浮點數默認是double型

3. 強制類型轉換:

      註意數據精度的丟失

4. 字符參與運算:

     --(1) 字符串數據和其他數據做+運算,結果是字符串類型,這裏的+不是算術運算符+,而是字符連接符+
        舉例:
        System.out.println("hello"+‘a‘+1);  //out:  helloa1
        System.out.println(‘a‘ + 1 + "hello"); //out:  98hello
        System.out.println("5+5 = " + 5 + 5);  //out:  5+5 = 55
        System.out.println(5 + 5 + "=5+5");  //out:  10=5+5

時間:22:58:00 2019-05-15

java基礎小知識點