java基礎小知識點
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/ 引用該博主內容)
註:異或的實際應用:
- 快速比較兩個值, if (a ^ b == 0)的運算速度比if (a - b == 0)快
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); }
- 在匯編語言中將變量置零:xor a, a;
- 判斷二進制數中1的個數(奇偶校驗)
- 快速比較兩個值, if (a ^ b == 0)的運算速度比if (a - b == 0)快
來使某些特定的位翻轉,因為不管是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基礎小知識點