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/  引用该博主内容)

       注:异或的实际应用:

      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

posted @ 2019-05-15 22:59  gogoog  阅读(91)  评论(0编辑  收藏  举报